如何在Python中逐行计算含历史数据的股票指标并添加至DataFrame
解决方案
核心问题分析
你的原代码是对整个DataFrame计算全局最高值和最低值,而非逐行累计到当前行的历史数据,这是结果不符合预期的根本原因。另外你遇到的字符串拼接报错,大概率是因为h/l/c列的数据类型是字符串而非数值型,需要先转换。
实现代码
1. 先确保数据类型正确
如果你的h、l、c列是字符串格式,先转为数值型:
import pandas as pd import numpy as np # 转换数值列类型 df[['h', 'l', 'c']] = df[['h', 'l', 'c']].astype(float)
2. 用expanding()实现逐行累计计算
expanding()方法会从第一行开始,逐行累计计算统计量,完全匹配你“每一行基于之前所有历史数据计算”的需求:
# 计算累计到当前行的最高值、最低值 df['h_cum_max'] = df['h'].expanding().max() df['l_cum_min'] = df['l'].expanding().min() # 计算区间范围,处理可能的0值避免除零错误 df['ranging'] = df['h_cum_max'] - df['l_cum_min'] df['ranging'] = df['ranging'].replace(0, np.nan) # 计算最终0-100的指标 df['percent'] = round(100 * ((df['c'] - df['l_cum_min']) / df['ranging']), 2) # 可选:删除中间辅助列 df = df.drop(['h_cum_max', 'l_cum_min', 'ranging'], axis=1)
简化链式调用版本
如果不需要中间列,可以直接链式计算:
df['percent'] = round( 100 * ( (df['c'] - df['l'].expanding().min()) / (df['h'].expanding().max() - df['l'].expanding().min()) ).replace(np.inf, np.nan), 2 )
关键说明
expanding().max():返回每一行对应从第一行到当前行的h列最大值expanding().min():返回每一行对应从第一行到当前行的l列最小值- 处理
ranging=0的情况:当累计区间内最高和最低值相等时,会出现除零错误,用replace(0, np.nan)或replace(np.inf, np.nan)将异常值转为空值,后续可根据需求填充(比如0或前值)
内容的提问来源于stack exchange,提问作者Hunter95
相关产品推荐
相关产品推荐

