如何用Pandas从OHLC DataFrame计算上月最低价并添加至原表(代码失效)
修正方案:计算上月最低价并添加到DataFrame
方法一:使用resample + shift + reindex
import pandas as pd # 创建示例DataFrame df = pd.DataFrame({'date': ['2022-03-01', '2022-03-02', '2022-04-01', '2022-04-02'], 'price': [10, 8, 5, 7]}) # 转换日期格式并设置为索引 df['date'] = pd.to_datetime(df['date']) df.set_index('date', inplace=True) # 计算每月最低价,然后将结果后移一个周期(对应上月最低价匹配到本月) monthly_low = df.resample('M')['price'].min() prev_month_low = monthly_low.shift(periods=1) # 将上月最低价重新索引匹配原DataFrame的日期,用ffill填充(本月内所有日期共享上月最低价) df['prev_month_low'] = prev_month_low.reindex(df.index, method='ffill') print(df)
方法二:使用Grouper + transform + shift
如果不需要单独保存每月最低价,也可以用分组的方式直接计算:
import pandas as pd df = pd.DataFrame({'date': ['2022-03-01', '2022-03-02', '2022-04-01', '2022-04-02'], 'price': [10, 8, 5, 7]}) df['date'] = pd.to_datetime(df['date']) # 按月份分组计算最低价,然后后移一个周期,再映射回原DataFrame df['month'] = df['date'].dt.to_period('M') monthly_low = df.groupby('month')['price'].min().shift(1) df['prev_month_low'] = df['month'].map(monthly_low) # 可以删除临时的month列 df.drop('month', axis=1, inplace=True) print(df)
原代码问题解析
- 索引shift错误:原代码手动修改索引时,将月末日期shift到下月末,但原DataFrame的日期是月初,导致后续匹配时找不到对应键,引发
KeyError。正确的做法是用shift(periods=1)直接将上月最低价对应到本月。 - 日期匹配逻辑错误:原函数中
date - pd.offsets.MonthBegin(1)得到的是当月月初,而previous_month_low的索引是下月末,两者无法匹配。 - 效率问题:使用
apply逐行处理日期,相比Pandas的矢量化操作(如reindex、map)效率低很多,尤其处理大数据量时差距明显。
运行修正后的代码,输出结果如下:
price prev_month_low date 2022-03-01 10 NaN 2022-03-02 8 NaN 2022-04-01 5 8.0 2022-04-02 7 8.0
(注:3月没有上月数据,所以显示NaN,符合逻辑)
内容的提问来源于stack exchange,提问作者user2345694
相关产品推荐
相关产品推荐

