本文目录导读:

我来详细讲解如何使用Pandas进行数据分组调参,提供一个完整的案例。
基础数据分组与聚合
import pandas as pd
import numpy as np
# 创建示例数据
data = {
'城市': ['北京', '上海', '广州', '北京', '上海', '广州'] * 10,
'产品': ['A', 'B', 'C', 'A', 'B', 'C'] * 10,
'销售额': np.random.normal(1000, 200, 60),
'成本': np.random.normal(700, 150, 60),
'日期': pd.date_range('2024-01-01', periods=60, freq='D')
}
df = pd.DataFrame(data)
print("原始数据:")
print(df.head())
基础分组操作
# 单列分组
city_group = df.groupby('城市')
city_avg = city_group['销售额'].mean()
print("\n各城市平均销售额:")
print(city_avg)
# 多列分组
multi_group = df.groupby(['城市', '产品'])
group_stats = multi_group['销售额'].agg(['mean', 'std', 'min', 'max'])
print("\n各城市-产品组合统计:")
print(group_stats)
数据分组调参案例
案例:电商销售数据分析与调参
class SalesAnalyzer:
def __init__(self, df):
self.df = df
def group_by_city(self):
"""按城市分组分析"""
return self.df.groupby('城市').agg({
'销售额': ['mean', 'std', 'sum'],
'成本': ['mean', 'sum']
})
def group_by_product(self, sales_threshold=1000):
"""按产品分组,支持调参"""
grouped = self.df.groupby('产品')
# 计算每个产品的汇总统计
result = grouped.agg({
'销售额': ['mean', 'std', 'count'],
'成本': 'mean'
})
# 计算毛利率
result['毛利率'] = (result[('销售额', 'mean')] - result[('成本', 'mean')]) / result[('销售额', 'mean')]
# 根据阈值筛选
result['是否达标'] = result[('销售额', 'mean')] > sales_threshold
return result
def optimize_threshold(self, thresholds=[800, 1000, 1200, 1500]):
"""优化分组阈值"""
results = {}
for threshold in thresholds:
result = self.group_by_product(threshold)
results[f'threshold_{threshold}'] = {
'达标产品数': result['是否达标'].sum(),
'达标率': result['是否达标'].mean(),
'达标产品': result[result['是否达标']].index.tolist()
}
return pd.DataFrame(results).T
# 使用示例
analyzer = SalesAnalyzer(df)
print("按产品分组结果:")
print(analyzer.group_by_product(sales_threshold=1000))
print("\n调参优化结果:")
print(analyzer.optimize_threshold([800, 1000, 1200]))
高级分组调参技巧
# 自定义分组逻辑
def custom_grouping(row, bins=[0, 500, 1000, 1500, 2000]):
"""自定义分组函数"""
if row['销售额'] <= bins[0]:
return '低销售额'
elif row['销售额'] <= bins[1]:
return '中低销售额'
elif row['销售额'] <= bins[2]:
return '中等销售额'
elif row['销售额'] <= bins[3]:
return '高销售额'
else:
return '超高销售额'
# 应用自定义分组
df['销售额等级'] = df.apply(custom_grouping, axis=1)
# 按自定义分组进行分析
custom_group = df.groupby('销售额等级').agg({
'销售额': ['mean', 'count'],
'成本': 'mean'
})
print("\n自定义分组分析:")
print(custom_group)
动态参数调优
class DynamicParameterOptimizer:
def __init__(self, df):
self.df = df
def optimize_group_parameters(self, param_ranges):
"""动态优化分组参数"""
best_params = {}
best_metrics = {}
for param_name, param_range in param_ranges.items():
best_score = float('-inf')
best_param = None
for param_value in param_range:
score = self.evaluate_parameter(param_name, param_value)
if score > best_score:
best_score = score
best_param = param_value
best_params[param_name] = best_param
best_metrics[param_name] = best_score
return best_params, best_metrics
def evaluate_parameter(self, param_name, param_value):
"""评估参数效果"""
if param_name == 'sales_threshold':
# 评估销售额阈值
grouped = self.df.groupby('产品')['销售额'].mean()
above_threshold = grouped[grouped > param_value]
# 返回目标产品的数量作为评分
return len(above_threshold)
elif param_name == 'profit_margin':
# 评估利润率阈值
self.df['利润率'] = (self.df['销售额'] - self.df['成本']) / self.df['销售额']
grouped = self.df.groupby('产品')['利润率'].mean()
above_threshold = grouped[grouped > param_value]
return len(above_threshold)
return 0
# 使用示例
optimizer = DynamicParameterOptimizer(df)
# 定义参数范围
param_ranges = {
'sales_threshold': range(800, 1600, 100),
'profit_margin': [0.1, 0.2, 0.3, 0.4]
}
best_params, best_metrics = optimizer.optimize_group_parameters(param_ranges)
print("\n最佳参数:")
for param, value in best_params.items():
print(f"{param}: {value} (评分: {best_metrics[param]:.2f})")
实际应用案例
# 创建更实际的数据集
np.random.seed(42)
samples = 1000
real_data = pd.DataFrame({
'门店': np.random.choice(['门店A', '门店B', '门店C', '门店D'], samples),
'品类': np.random.choice(['电子产品', '服装', '食品', '日用品'], samples),
'销售额': np.random.normal(5000, 1500, samples),
'客户数': np.random.randint(50, 200, samples),
'折扣率': np.random.uniform(0.05, 0.3, samples)
})
def analyze_store_performance(df, threshold_sales=5000, threshold_customers=100):
"""门店性能分析 - 可调参"""
# 分组计算
store_stats = df.groupby('门店').agg({
'销售额': ['mean', 'sum', 'count'],
'客户数': 'mean',
'折扣率': 'mean'
})
# 计算关键指标
store_stats['客单价'] = store_stats[('销售额', 'mean')] / store_stats[('客户数', 'mean')]
store_stats['日销售达标'] = store_stats[('销售额', 'mean')] > threshold_sales
store_stats['客户达标'] = store_stats[('客户数', 'mean')] > threshold_customers
# 综合评分
store_stats['综合评分'] = (
(store_stats['日销售达标'] * 0.6 + store_stats['客户达标'] * 0.4) * 100
)
return store_stats.sort_values('综合评分', ascending=False)
# 测试不同参数
for threshold in [4000, 5000, 6000]:
print(f"\n阈值 = {threshold}:")
result = analyze_store_performance(real_data, threshold_sales=threshold)
print(result[['综合评分']].head())
可视化分组结果
import matplotlib.pyplot as plt
def visualize_group_analysis(df, group_col='品类'):
"""可视化分组分析结果"""
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# 1. 各组销售额分布
df.boxplot(column='销售额', by=group_col, ax=axes[0, 0])
axes[0, 0].set_title(f'各{group_col}销售额分布')
# 2. 各组客户数分布
df.boxplot(column='客户数', by=group_col, ax=axes[0, 1])
axes[0, 1].set_title(f'各{group_col}客户数分布')
# 3. 各组平均销售额
group_means = df.groupby(group_col)['销售额'].mean().sort_values()
axes[1, 0].bar(group_means.index, group_means.values)
axes[1, 0].set_title(f'各{group_col}平均销售额')
axes[1, 0].tick_params(axis='x', rotation=45)
# 4. 各组销售占比
group_sums = df.groupby(group_col)['销售额'].sum()
axes[1, 1].pie(group_sums.values, labels=group_sums.index, autopct='%1.1f%%')
axes[1, 1].set_title(f'各{group_col}销售额占比')
plt.tight_layout()
plt.show()
# 可视化分析结果
visualize_group_analysis(real_data)
这个案例展示了Pandas数据分组调参的核心技术:
- 基础分组:
groupby()的单列和多列分组 - 参数化分析:通过函数参数控制分析逻辑
- 动态优化:自动搜索最佳分组参数
- 自定义分组:根据业务逻辑自定义分组规则
- 可视化分析:图表展示分组结果
核心优势:
- 代码复用性高
- 参数可调,适应不同业务场景
- 分析结果可视化,便于决策
实际应用中可以根据具体需求调整分组逻辑和调参策略。