You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现销售数据多维度组合的批量子集化处理?

解决方案:用单个函数批量生成所有子集化结果

完全不需要编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 01:59:57