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

如何用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)

原代码问题解析

  1. 索引shift错误:原代码手动修改索引时,将月末日期shift到下月末,但原DataFrame的日期是月初,导致后续匹配时找不到对应键,引发KeyError。正确的做法是用shift(periods=1)直接将上月最低价对应到本月。
  2. 日期匹配逻辑错误:原函数中date - pd.offsets.MonthBegin(1)得到的是当月月初,而previous_month_low的索引是下月末,两者无法匹配。
  3. 效率问题:使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:52:40