如何实现销售数据多维度组合的批量子集化处理?
解决方案:用单个函数批量生成所有子集化结果
完全不需要编写18个独立函数,以下几种方案都能通过单个函数生成所有3×6=18种维度组合的结果,同时保持代码简洁易维护:
方案1:生成带维度标识的统一DataFrame(推荐)
将所有组合的统计结果整合到一个结构化的DataFrame中,每一行对应一个「类别+时间窗口」的组合,方便后续分析、筛选和可视化。
假设你的销售数据包含category(类别)、sale_date(销售日期)以及销售指标列(比如sales_amount),代码示例如下:
import pandas as pd from itertools import product def generate_sales_subset_stats(sales_data, metrics): # 定义目标维度组合 target_categories = ['RA', 'DS', 'TP'] time_windows = [7, 30, 60, 90, 120, None] # None代表无时间限制 # 取数据中最新日期作为时间回溯的基准 latest_sale_date = sales_data['sale_date'].max() all_results = [] # 遍历所有维度组合 for cat, window_days in product(target_categories, time_windows): # 第一步:筛选类别 category_subset = sales_data[sales_data['category'] == cat] # 第二步:筛选时间区间 if window_days is not None: cutoff_date = latest_sale_date - pd.Timedelta(days=window_days) filtered_subset = category_subset[category_subset['sale_date'] >= cutoff_date] else: filtered_subset = category_subset # 第三步:计算指定指标并整理结果 result_row = { 'category': cat, 'time_window': f"{window_days}天回溯" if window_days else "无时间限制" } for metric_name, calc_func in metrics.items(): result_row[metric_name] = calc_func(filtered_subset) all_results.append(result_row) # 转换为DataFrame返回 return pd.DataFrame(all_results)
使用方式
传入你需要计算的指标(比如订单量、销售额总和):
# 定义需要计算的指标:键是指标名称,值是计算函数 sales_metrics = { 'order_count': lambda df: df.shape[0], 'total_sales': lambda df: df['sales_amount'].sum(), 'avg_order_value': lambda df: df['sales_amount'].mean() } # 生成所有组合的统计结果 subset_stats_df = generate_sales_subset_stats(your_sales_data, sales_metrics)
返回的DataFrame会包含category、time_window以及你定义的所有指标列,清晰呈现每个组合的结果。
方案2:生成带命名键的结果字典
如果需要直接通过类似counts_ds_7这样的名称获取单个结果,可以生成一个字典,键为自定义的命名规则,值为对应组合的计算结果:
import pandas as pd from itertools import product def generate_sales_subset_dict(sales_data, metrics): target_categories = ['RA', 'DS', 'TP'] time_windows = [7, 30, 60, 90, 120, None] latest_sale_date = sales_data['sale_date'].max() result_dict = {} for cat, window_days in product(target_categories, time_windows): # 筛选子集逻辑同方案1 category_subset = sales_data[sales_data['category'] == cat] if window_days is not None: cutoff_date = latest_sale_date - pd.Timedelta(days=window_days) filtered_subset = category_subset[category_subset['sale_date'] >= cutoff_date] else: filtered_subset = category_subset # 生成自定义键名(比如counts_ds_7, total_sales_tp_无限制) window_suffix = f"{window_days}" if window_days else "无限制" base_key_prefix = f"{cat.lower()}_{window_suffix}" for metric_name, calc_func in metrics.items(): full_key = f"{metric_name}_{base_key_prefix}" result_dict[full_key] = calc_func(filtered_subset) return result_dict
使用方式
调用后可以直接通过键名取值:
sales_subset_dict = generate_sales_subset_dict(your_sales_data, sales_metrics) # 获取DS类别7天回溯的订单量 ds_7day_count = sales_subset_dict['order_count_ds_7']
方案3:用Pandas GroupBy实现无显式循环
如果想避免代码中的显式循环,可以先给数据打上「时间窗口标签」,再结合groupby实现批量统计:
import pandas as pd def generate_grouped_sales_stats(sales_data, metrics): target_categories = ['RA', 'DS', 'TP'] time_windows = [7, 30, 60, 90, 120] # 单独处理无限制情况 latest_sale_date = sales_data['sale_date'].max() # 先筛选目标类别 filtered_data = sales_data[sales_data['category'].isin(target_categories)].copy() # 给每条数据打时间窗口标签 def assign_window_label(date): # 从大到小判断,避免时间区间重叠 for days in sorted(time_windows, reverse=True): if date >= latest_sale_date - pd.Timedelta(days=days): return f"{days}天回溯" return "无时间限制" filtered_data['time_window'] = filtered_data['sale_date'].apply(assign_window_label) # 按类别+时间窗口分组计算指标 grouped_stats = filtered_data.groupby(['category', 'time_window']).agg(metrics).reset_index() return grouped_stats
这个方案完全利用Pandas的向量化操作,代码更符合数据处理的惯用风格。
内容的提问来源于stack exchange,提问作者JLuu
相关产品推荐
相关产品推荐

