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

使用Pandas DataFrame将价格序列按起始时间点标准化至指数值100

如何将Pandas股票数据归一化到初始时刻的百分比

我懂你要做的是什么——把每只股票的价格都锚定到初始时刻(t=0)的数值,转换成百分比形式,这样能直观看到股价相对于起点的涨跌幅,这个在量化分析里太常用了。

先说说你之前代码报错的原因

你用df[0:] / df[0:1]出错,是因为df[0:1]返回的是单行DataFrame,而df[0:]是整个数据集,直接做除法时,Pandas的索引对齐机制会因为维度不匹配出问题(尤其是你的实际索引是datetime类型时,还会触发索引匹配逻辑,导致计算异常)。

正确的解决方法

下面几种方法都能完美实现你的需求,按自己的习惯选就行:

方法1:用iloc获取初始行做广播(最直观)

直接取第一行的数值(也就是t=0的价格),然后让整个DataFrame按列做除法,最后乘以100转成百分比:

import pandas as pd

# 假设你的原始DataFrame是df,索引已经是datetime类型
initial_prices = df.iloc[0]  # 获取第一行的所有股票初始价格
df_norm = (df / initial_prices) * 100

运行后就能得到你想要的结果:每一行的数值都是当前价格相对于t=0价格的百分比。

方法2:用transform函数实现

如果之后需要扩展到分组场景(比如多板块股票),用transform会更灵活,单组数据也适用:

df_norm = df.transform(lambda col: (col / col.iloc[0]) * 100)

针对datetime索引的小提示

如果你的实际索引是类似20170101 09:30:00的字符串格式,记得先转成datetime类型:

df.index = pd.to_datetime(df.index)

转完之后上面的方法依然有效,因为iloc[0]是按位置取第一行,和索引的具体格式无关。

验证结果

用你给出的示例数据测试,方法1会输出:

datetimeStock AStock B
t=0100100
t=1120150
t=2160125
t=380100

(注:你示例里t=2的Stock A写的是140,应该是笔误,按公式8/5*100正确结果是160)

内容的提问来源于stack exchange,提问作者eternity1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:23:33