Python 如何将一列乘以一个较短的“列表”;重量;,然后对输出执行计算并存储值

Python 如何将一列乘以一个较短的“列表”;重量;,然后对输出执行计算并存储值,python,pandas,loops,iteration,Python,Pandas,Loops,Iteration,我有一个这样的设置-但数字不同: df1 = {'Date': ['2020-01-06', '2020-01-07', '2020-01-08','2020-01-09', '2020-01-10', '2020-01-13','2020-01-14','2020-01-15','2020-01-16', '2020-01-17', '2020-01-20'], 'Return': '0.02', '0.004','0.006', '0.001','0.005', '0.01

我有一个这样的设置-但数字不同:

df1 =  {'Date': ['2020-01-06', '2020-01-07', '2020-01-08','2020-01-09', '2020-01-10', '2020-01-13','2020-01-14','2020-01-15','2020-01-16', '2020-01-17', '2020-01-20'],
        'Return': '0.02', '0.004','0.006', '0.001','0.005', '0.01','0.015', '0.001','0.0014',
'0.04', '0.037'}
权重=[1,2,3]

我需要做的是将最后3个返回值乘以权重列,求和,然后求出答案-。然后根据2020-01-20储存这些数据。然后,我需要将最后3个返回值(除最后一行(移动1行)乘以权重、总和、sqrt和存储答案与2020-01-17等等。 因此,我的输出列的前两行将为空,然后从2020-01-08开始填充9个条目

所以我需要进行计算,移动列1行,然后重复,但是保存求和的sqrt每次都会返回

我可以使用以下公式正确计算一次(仅适用于最后3行):

df_last_3 = df.iloc[-3:].reset_index()
df_last_3['return*weights'] = df_last_3 * weights
sqrt_return= (np.sqrt((df_last_3['return*weights']).sum()))
但是我需要对移位的列行执行相同的计算——并存储结果

我是Python新手,没有足够的循环练习来真正理解它。我试过了,但没有得到我想要的结果

我到处都找过这样的例子,但仍然找不到解决方案。任何帮助都将不胜感激。

使用,窗口大小为
3
,然后使用
。应用
根据要求处理滚动窗口:

df1['Result'] = df1['Return'].rolling(3).apply(
    lambda s: np.sqrt((s * weights[::-1]).sum()))


谢谢你的解决方案!我看到FutureWarning:当前,“apply”将值作为ndarray传递给应用的函数。将来,这将更改为将其作为系列对象传递。您需要指定'raw=True'以保持当前行为,并且可以传递'raw=False'以在我在代码中运行时消除此警告。这是我需要担心的事情吗?没什么好担心的,只需在apply方法中传递参数
raw=False
,以抑制此消息。
# print(df1)
          Date  Return    Result
0   2020-01-06    0.02       NaN
1   2020-01-07   0.004       NaN
2   2020-01-08   0.006  0.272029
3   2020-01-09   0.001  0.158114
4   2020-01-10   0.005  0.158114
5   2020-01-13    0.01  0.151658
6   2020-01-14   0.015  0.223607
7   2020-01-15   0.001  0.246982
8   2020-01-16  0.0014  0.220000
9   2020-01-17    0.04  0.214009
10  2020-01-20   0.037  0.348138

# Calculations:
# 0.348138 = sqrt(1 * 0.037 + 2 * 0.04 + 3 * 0.0014)
# 0.214009 = sqrt(1 * 0.04 + 2 * 0.0014 + 3 * 0.001)
# ...