如何使用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
相关产品推荐
相关产品推荐

