#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