在Pandas中替代.min()计算股票时间序列的历史最低值
解决方案
首先确保你的Date列是datetime类型,然后通过分组排序+累积最小值移位的方式实现需求:
import pandas as pd import numpy as np # 转换Date列为datetime(如果还不是的话) df['Date'] = pd.to_datetime(df['Date']) # 保存原始索引,用于恢复数据顺序 df['_temp_idx'] = df.index # 按股票ID分组,组内按日期升序排列(从最早到最晚) df_sorted = df.sort_values(['Stock_ID', 'Date']) # 计算每个股票分组内的累积最小值,再移位1行,得到当前日期之前的历史最低 df_sorted['Historical_low'] = df_sorted.groupby('Stock_ID')['Price'] \ .expanding(min_periods=1).min() \ .reset_index(level=0, drop=True) \ .shift(1) # 恢复到原始数据的顺序,删除临时索引列 df = df_sorted.sort_values('_temp_idx').drop('_temp_idx', axis=1)
执行后得到的结果完全符合你的期望输出。
你的代码问题分析
拼写错误:
gropuby应为groupby['Stock_ID','Date]缺少右引号,正确写法是['Stock_ID','Date']
逻辑错误:
df.groupby('Stock_ID')['Price'].min()计算的是每只股票的全局最低值,而不是你需要的「当前日期之前的历史最低值」- 仅按日期降序排序,但没有处理「仅使用当前日期之前的数据」的逻辑,导致结果包含未来数据或全局值
内容的提问来源于stack exchange,提问作者Apook
相关产品推荐
相关产品推荐

