使用 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
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