pandas 将两个 Dataframe 相乘以创建时间序列

4si2a6ki  于 2023-03-16  发布在  其他
关注(0)|答案(1)|浏览(157)

我有两个数据框架,一个是投资组合权重,每行是一个投资组合,另一个是按日期列出的证券回报率列表,换句话说,每个证券的回报率时间序列,两者都有相同的列,即证券,顺序相同。
我想将证券数据框乘以投资组合数据框的每一行,并根据相乘后的值(即权重 * 日期值)为每个投资组合创建一个新的数据框,然后将新数据框中的每一列相加,并使用该值创建一个投资组合时间序列。
我试着找到解决这个问题的方法,比如在一个循环中用一个乘另一个,但是我没有成功。
这是我测试过的一个例子。

#for loop to create time series for tested portfolios

x = 0

portfolios_time_series = pd.DataFrame()

for x in portfolios_df:
    portfolio_underlying_returns = security_returns_df.multiply(portfolios_df.iloc[x]) 
    portfolios_time_series = portfolios_time_series.append(portfolio_underlying_returns.sum(axis=1))

如果投资组合是这样的:

证券是这样的:

然后,应在循环中创建两个新的 Dataframe (如果循环是最佳解决方案),如下所示:

然后,投资组合的最终时间序列 Dataframe 应该是这样的:

dl5txlt9

dl5txlt91#

使用numpy broadcast来避免对矢量化操作使用循环:

A = df1.fillna(0).values  # portfolios
B = df2.fillna(0).values  # securities
r = (A[:, None] * B).sum(axis=2).T

out = pd.DataFrame(r, index=df2.index, columns=df1.index)

输出:

>>> out
                0       1
13/03/23  0.01775  0.0063
14/03/23  0.01475  0.0033

相关问题