使用 numpy 将两个 DF 相乘,计算每行的平均值

Multiply two DF using numpy, calculate average per line

df:aux 包含布尔值,rtrnM 包含每月 returns。我希望(分段)将 aux 和 rtrnM 相乘以获得每月 returns 的 df,其中 aux 为 TRUE,随后我想计算每行结果值的算术平均值。 这是 aux 和 rtrnM 的样子:

In [341]: aux.tail()
Out[341]: 
              IWB    SPY    VGK    IEV    EWJ    EPP    IEF    SHY    IAU
2017-06-30  False  False   True   True   True  False  False  False  False
2017-07-31   True  False  False  False   True   True  False  False  False
2017-08-31  False  False   True   True  False   True  False  False  False
2017-09-29  False  False  False  False  False   True   True  False   True
2017-10-31   True  False   True   True  False  False  False  False  False

In [342]: rtrnM.tail()
Out[342]: 
                 IWB       SPY       VGK       IEV       EWJ       EPP  \
2017-06-30  0.007147  0.006374 -0.005148 -0.005326  0.013241  0.022903   
2017-07-31  0.019115  0.020554  0.028291  0.026850  0.020690  0.044065   
2017-08-31  0.003207  0.002918  0.000707 -0.000879 -0.000913  0.004091   
2017-09-29  0.020612  0.020141  0.032114  0.030790  0.018278 -0.008364   
2017-10-31  0.023163  0.023405  0.001372  0.003200  0.032490  0.024870   

                 IEF       SHY       IAU  
2017-06-30 -0.005097 -0.000786 -0.021311  
2017-07-31  0.003756  0.001860  0.023451  
2017-08-31  0.014574  0.002022  0.040917  
2017-09-29 -0.014407 -0.001867 -0.032233  
2017-10-31 -0.003018 -0.001037 -0.000812  

试过这个:

result = pd.DataFrame((aux * rtrnM).mean(axis=1),columns=['mthly'])

这没有给我正确的结果。任何帮助,将不胜感激。猜测 numpy 是要走的路。

是的,这里的 mean 给出了所有值的平均值,包括 0 值。

修复很简单。调用 sum 并除以非零值的个数。

(aux * rtrnM).sum(1) / aux.sum(1)

2017-06-30    0.000922
2017-07-31    0.027957
2017-08-31    0.001306
2017-09-29   -0.018335
2017-10-31    0.009245
dtype: float64

像这样塑造一个新的数据框:

df = pd.DataFrame(aux.mul(rtrnM).sum(1).div(aux.sum(1)), columns=['mthly'])
df

               mthly
2017-06-30  0.000922
2017-07-31  0.027957
2017-08-31  0.001306
2017-09-29 -0.018335
2017-10-31  0.009245