首页 > 解决方案 > 如何将列表乘以数据框的每一行?

问题描述

所以我有一个看起来像这样的数据框:

                AMZN        FB      GOOG      NFLX
Date                                              
2017-06-30       NaN       NaN       NaN       NaN
2017-07-03  0.985186  0.983110  0.988963  0.978315
2017-07-05  1.018602  1.012868  1.014476  1.009852
2017-07-06  0.993556  0.989890  0.994494  0.990787
2017-07-07  1.014112  1.017605  1.013125  1.026872
2017-07-10  1.018094  1.013603  1.011115  1.016580
2017-07-11  0.997652  1.011531  1.001389  1.010873
2017-07-12  1.012453  1.023379  1.014773  1.028640
2017-07-13  0.994158  1.002266  1.003528  0.996598
2017-07-14  1.001179  1.004458  1.009323  1.018393
2017-07-17  1.008215  0.998500  0.997312  1.003600
2017-07-18  1.014267  1.019596  1.012565  1.135436
2017-07-19  1.002362  1.007859  1.005687  1.001416
2017-07-20  1.001782  1.002376  0.997178  0.998586
2017-07-21  0.997055  0.999392  1.004927  1.026906
2017-07-24  1.012948  1.009548  1.007627  0.996659
2017-07-25  1.000886  0.995663  0.969766  0.994998
2017-07-26  1.012434  1.001997  0.996950  1.011285
2017-07-27  0.993541  1.029165  0.985535  0.966152
2017-07-28  0.975182  1.011793  1.007965  1.007445
2017-07-31  0.968374  0.981444  0.988285  0.987068

这些数字是其股票代码的 pct_change。我也有一个看起来像这样的起始市场价值的字典:

port2_mkt_val = {'FB':25,
            'AMZN':25,
            'NFLX':25,
            'GOOG':25}

本质上,我要做的是将字典中每只股票各自的市场价值与每一天相乘。我不能做直接乘法,因为我不希望 dict 成为数据框的标量,我正在寻找的是获取起始市场价值并将 2017 年 7 月 3 日的回报相乘,然后取它(添加它到一个新的数据框)然后将其乘以 2017 年 7 月 5 日的回报,依此类推。我计划遍历 df 的每一行,但我听说这是不好的做法。有什么更好的方法来做到这一点?

标签: pythondataframeformulafinance

解决方案


尝试:

df = df.fillna(1)

for c in df.columns:
    df[c] = df[c].cumprod() * port2_mkt_val[c]

print(df)

印刷:

                 AMZN         FB       GOOG       NFLX
Date                                                  
2017-06-30  25.000000  25.000000  25.000000  25.000000
2017-07-03  24.629650  24.577750  24.724075  24.457875
2017-07-05  25.087811  24.894016  25.081981  24.698834
2017-07-06  24.926145  24.642338  24.943879  24.471284
2017-07-07  25.277903  25.076166  25.271268  25.128876
2017-07-10  25.735281  25.417277  25.552158  25.545513
2017-07-11  25.674855  25.710364  25.587650  25.823269
2017-07-12  25.994584  26.311447  25.965656  26.562848
2017-07-13  25.842723  26.371068  26.057263  26.472481
2017-07-14  25.873192  26.488631  26.300195  26.959389
2017-07-17  26.085740  26.448898  26.229500  27.056443
2017-07-18  26.457905  26.967190  26.559074  30.720859
2017-07-19  26.520399  27.179125  26.710115  30.764360
2017-07-20  26.567658  27.243703  26.634739  30.720859
2017-07-21  26.489416  27.227139  26.765968  31.547435
2017-07-24  26.832401  27.487104  26.970113  31.442035
2017-07-25  26.856175  27.367892  26.154698  31.284762
2017-07-26  27.190105  27.422546  26.074926  31.637810
2017-07-27  27.014484  28.222324  25.697753  30.566934
2017-07-28  26.344038  28.555150  25.902435  30.794504
2017-07-31  25.510882  28.025281  25.598988  30.396270

推荐阅读