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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:10:36