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

如何在Pandas中基于单日涨跌幅计算初始金额的逐日演变值

解决基于每日涨跌幅计算金额演变的问题

你不需要手动用shift迭代计算,Pandas的cumprod()函数可以直接实现累积乘积运算,这是最简洁高效的解决方案。

具体步骤:

  1. 计算自定义变异值:这一步你已经完成,将每日涨跌幅转换为计算用的乘数:
    df['daily_var_custo'] = 1 + df['Daily Variation'] / 100
    
  2. 生成金额演变列:以初始值100为起点,乘以daily_var_custo的累积乘积,即可得到每日的金额:
    df['std'] = 100 * df['daily_var_custo'].cumprod()
    

为什么你的shift方法无效?

当你执行df['std'] = df['std'].shift(1) * df['daily_var_custo']时,df['std']只有第一行有值,后续行的shift(1)会返回NaN(对应位置的前一行还未完成计算),这种方式无法自动完成迭代计算。而cumprod()是矢量化操作,会一次性计算所有行的累积乘积,从根源上避免了这个问题。

示例验证

假设你的测试DataFrame如下:

import pandas as pd

data = {
    'Date': ['2023-01-01', '2023-01-02', '2023-01-03'],
    'Daily Variation': [2, -1, 3]
}
df = pd.DataFrame(data)

# 计算自定义变异值
df['daily_var_custo'] = 1 + df['Daily Variation'] / 100

# 生成金额列
df['std'] = 100 * df['daily_var_custo'].cumprod()

执行后std列的结果为:

  • 2023-01-01: 102.0(100×1.02)
  • 2023-01-02: 100.98(102×0.99)
  • 2023-01-03: 104.0094(100.98×1.03)

如果需要将初始值100作为第一行(不应用当日涨跌幅),可以调整代码为:

df.loc[0, 'std'] = 100
df.loc[1:, 'std'] = 100 * df['daily_var_custo'].iloc[1:].cumprod()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 05:15:18