如何基于年度数据生成加权列?适配多区域及新增数据需求
基于分组时间序列的OO_EST加权平滑实现
核心思路
针对每个Area_Code分组,按Year_Code排序后,通过移位操作获取前后年度的OO_EST值,再根据行在分组内的位置(首年、中间年、最后一年)应用对应的加权公式,代码可自动适配新增数据后的最新年份。
实现代码
import pandas as pd # 替换为实际数据导入逻辑,比如pd.read_csv() df = pd.read_csv('your_data.csv') # 1. 按区域和年份排序,确保时间序列顺序正确 df = df.sort_values(by=['Area_Code', 'Year_Code']).reset_index(drop=True) # 2. 按区域分组,计算上一年、下一年的OO_EST值 df['prev_OO'] = df.groupby('Area_Code')['OO_EST'].shift(1) df['next_OO'] = df.groupby('Area_Code')['OO_EST'].shift(-1) # 3. 按分组内的位置应用加权规则 def compute_smoothed(group): # 首年加权 first_idx = group.index.min() group.loc[first_idx, 'smoothingOO'] = 0.75 * group.loc[first_idx, 'OO_EST'] + 0.25 * group.loc[first_idx, 'next_OO'] # 最后一年加权 last_idx = group.index.max() group.loc[last_idx, 'smoothingOO'] = 0.75 * group.loc[last_idx, 'OO_EST'] + 0.25 * group.loc[last_idx, 'prev_OO'] # 中间年份加权 middle_mask = ~group.index.isin([first_idx, last_idx]) group.loc[middle_mask, 'smoothingOO'] = 0.25 * group.loc[middle_mask, 'prev_OO'] + 0.5 * group.loc[middle_mask, 'OO_EST'] + 0.25 * group.loc[middle_mask, 'next_OO'] return group # 应用分组计算 df = df.groupby('Area_Code', group_keys=False).apply(compute_smoothed) # 清理临时辅助列(可选) df = df.drop(columns=['prev_OO', 'next_OO'])
适配新增数据
当导入包含新Year_Code的数据时,只需重新运行上述代码:
- 排序步骤会自动将新年份纳入对应区域的时间序列末尾
- 分组计算时,
group.index.max()会自动识别每组最新的最大年份,将其作为最后一年应用对应的加权规则
内容的提问来源于stack exchange,提问作者Voycey98
相关产品推荐
相关产品推荐

