如何在Pandas中基于单日涨跌幅计算初始金额的逐日演变值
解决基于每日涨跌幅计算金额演变的问题
你不需要手动用shift迭代计算,Pandas的cumprod()函数可以直接实现累积乘积运算,这是最简洁高效的解决方案。
具体步骤:
- 计算自定义变异值:这一步你已经完成,将每日涨跌幅转换为计算用的乘数:
df['daily_var_custo'] = 1 + df['Daily Variation'] / 100 - 生成金额演变列:以初始值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
相关产品推荐
相关产品推荐

