Python案例如何用Pandas做数据分组调参

wen python案例 2

本文目录导读:

Python案例如何用Pandas做数据分组调参

  1. 基础数据分组与聚合
  2. 基础分组操作
  3. 数据分组调参案例
  4. 高级分组调参技巧
  5. 动态参数调优
  6. 实际应用案例
  7. 可视化分组结果

我来详细讲解如何使用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数据分组调参的核心技术:

  1. 基础分组groupby() 的单列和多列分组
  2. 参数化分析:通过函数参数控制分析逻辑
  3. 动态优化:自动搜索最佳分组参数
  4. 自定义分组:根据业务逻辑自定义分组规则
  5. 可视化分析:图表展示分组结果

核心优势:

  • 代码复用性高
  • 参数可调,适应不同业务场景
  • 分析结果可视化,便于决策

实际应用中可以根据具体需求调整分组逻辑和调参策略。

抱歉,评论功能暂时关闭!