Как умножить список на каждую строку фрейма данных?

#python #dataframe #formula #finance

Вопрос:

Итак, у меня есть фрейм данных, который выглядит следующим образом:

                 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}
 

По сути, то, что я собираюсь сделать, — это умножать соответствующую рыночную стоимость каждой акции в диктанте с каждым днем. Я не могу выполнить прямое умножение, потому что я не хочу, чтобы дикт был скаляром кадра данных, то, что я ищу, — это взять начальную рыночную стоимость и умножить результаты 7/3/2017, затем взять это (добавить в новый кадр данных), затем умножить это на результаты 7/5/2017 и так далее. Я планировал повторить каждую строку df, но я слышал, что это плохая практика. Что было бы лучшим способом сделать это?

Ответ №1:

Попробуй:

 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