我有一个如下所示的数据框。您可以看到,首先,SMA 列是故意与 Index Value 列重复的。我正在尝试调整 SMA 列,以便它成为简单计算的结果,类似于下面的效果,我认为这需要某种循环:
for i in range(len(df)):
df['SMA'].loc[i,"SMA"]= df['SMA'].loc[i-1,"SMA"] + df['SMA'].loc[i,"ER"] * (df['SMA'].loc[i,"Index Value"] - df['SMA'].loc[i-1,"SMA"])
换句话说,我试图取“SMA”的当前行,并将其作为“SMA”前一行的输出 + “ER”的当前行乘以“索引值”的当前行与“SMA”前一行之间的差值
data = {
'Date': ['9/5/2023', '9/6/2023', '9/7/2023', '9/8/2023', '9/11/2023', '9/12/2023',
'9/13/2023', '9/14/2023', '9/15/2023', '9/18/2023', '9/19/2023', '9/20/2023',
'9/21/2023', '9/22/2023', '9/25/2023', '9/26/2023', '9/27/2023', '9/28/2023',
'9/29/2023'],
'Index Value': [4496.83, 4465.48, 4451.14, 4457.49, 4487.46, 4461.9, 4467.44,
4505.1, 4450.32, 4453.53, 4443.95, 4402.2, 4330, 4320.06,
4337.44, 4273.53, 4274.51, 4299.7, 4288.05],
'ER': [0.15066, 0.157105, 0.218561, 0.233893, 0.233709, 0.191352, 0.090935,
0.398004, 0.127833, 0.062296, 0.198933, 0.382776, 0.494406, 0.541878,
0.44323, 0.489456, 0.466276, 0.396806, 0.52569],
'SMA': [4496.83, 4465.48, 4451.14, 4457.49, 4487.46, 4461.9, 4467.44, 4505.1,
4450.32, 4453.53, 4443.95, 4402.2, 4330, 4320.06, 4337.44, 4273.53,
4274.51, 4299.7, 4288.05]
}
df = pd.DataFrame(data)
由于我不擅长循环构造,为了避免循环,我尝试了类似下面的方法,虽然很接近,但不是我想要的。
df['SMA']=df['SMA'].shift(1) + df['ER'] * (df['Index Value'] - df['SMA'].shift(1))
之所以它不完全符合我的要求是因为我希望索引值列的第一个数字与 SMA 的第一个值相匹配,并且公式仅在该点之后应用(这就是为什么似乎需要循环)。
综上所述,并考虑到目标,有人能否建议完成这项任务的最佳方法是什么?
首先,您可以通过两种方式简化现有代码:
'Index Value'
即可;'SMA'
'Index Value'
diff
来代替df[col] - df[col].shift()
。现在回答你的问题,IIUC 你想保留列的第一个值
'Index Value'
(即4496.83
),并仅从第二行开始应用公式。有几种方法可以实现此目的:
所有这些都将导致: