本文目录导读:

我来详细讲解如何使用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()的单列和多列分组 - 参数化分析:通过函数参数控制分析逻辑
- 动态优化:自动搜索最佳分组参数
- 自定义分组:根据业务逻辑自定义分组规则
- 可视化分析:图表展示分组结果
核心优势:
- 代码复用性高
- 参数可调,适应不同业务场景
- 分析结果可视化,便于决策
实际应用中可以根据具体需求调整分组逻辑和调参策略。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播