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

如何使用Python对同分组数据行批量应用自定义处理代码?

批量按小区分组实现HoltWinters预测方案

直接用pandas的groupby方法就能实现批量分组处理,不需要手动写逐名称筛选的逻辑,它会自动按name列把同小区的行拆成独立子数据集,直接套你已经调试好的单小区预测代码就行,19000行的数据集跑这个逻辑没有性能压力。


前置预处理

先把基础数据格式整对,避免时间序列预测报错:

  • 把时间列转为pandas的datetime格式
  • 每个小区的数据按时间升序排列
  • 提前清理缺失值、异常值,筛掉历史数据长度不足的小区
import pandas as pd
from statsmodels.tsa.holtwinters import ExponentialSmoothing

# 读取本地Excel文件
df = pd.read_excel("你的业务数据文件路径.xlsx")
# 替换成你表里实际的时间列名,转时间格式
df["stat_date"] = pd.to_datetime(df["stat_date"])
# 按小区名+统计时间排序
df = df.sort_values(by=["name", "stat_date"]).reset_index(drop=True)

封装单小区预测函数

把你已经写通的单个小区HoltWinters建模逻辑封装成函数,输入是单个小区的子数据表,输出是该小区2022年的预测结果,示例逻辑如下,你可以直接替换成自己调好的参数:

def forecast_single_cell(group_data):
    # 以下替换为你自己的单小区建模代码
    hw_model = ExponentialSmoothing(
        group_data["data_trend"],
        seasonal_periods=12, # 月粒度数据周期填12,季度粒度填4,匹配你的数据粒度
        trend="add",
        seasonal="add",
        initialization_method="estimated"
    ).fit()
    # 预测步长和2022年需要的周期数匹配,月粒度就预测12步
    predict_result = hw_model.forecast(12)
    # 返回结构化的预测结果
    return pd.DataFrame({
        "name": group_data["name"].iloc[0],
        "predict_date": pd.date_range(start="2022-01-01", periods=12, freq="M"),
        "data_trend_predict": predict_result.values
    })

批量跑全量小区预测

两种实现方式选就行,新手优先选第一种,方便加异常捕获,不会因为单个小区数据问题中断整个任务:

方式1:显式循环分组(新手友好)

result_list = []
# groupby自动完成所有小区的分组拆分
for cell_name, cell_data in df.groupby("name"):
    try:
        cell_res = forecast_single_cell(cell_data)
        result_list.append(cell_res)
    except Exception as e:
        # 打印出错的小区和原因,不影响其他小区运行
        print(f"小区【{cell_name}】预测失败,错误:{str(e)}")
        continue

# 把所有小区的预测结果合并成一张总表
final_predict_df = pd.concat(result_list, ignore_index=True)

方式2:apply简洁写法

不需要单独做异常捕获的话可以直接用这个写法,代码更短:

final_predict_df = df.groupby("name", group_keys=False).apply(forecast_single_cell).reset_index(drop=True)

注意事项

  • 传入预测函数的分组数据里,name列的值全为当前小区名,取小区名直接用group_data["name"].iloc[0]即可,不要硬编码名称
  • 你之前用的df.loc[df['name'] == 'sofia']本质是手动提取单个分组,groupby已经自动帮你完成了所有分组的拆分提取,不需要自己遍历所有名称值做筛选
  • 你手里的2020、2021两年共24个月的历史数据,刚好满足12个月周期的HoltWinters建模最低数据要求,缺数据的小区提前过滤掉即可
  • 预测步长、季节周期参数必须和你实际的数据粒度匹配,不要硬抄示例参数。

内容的提问来源于stack exchange,提问作者Meriem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:45:37