Вычислите значение, используя предварительно рассчитанное значение (из того же столбца) и значение из другого столбца в кадре данных Pandas - PullRequest
0 голосов
/ 27 мая 2019

После нескольких часов попыток узнать, как это сделать, я обращаюсь к сообществу.

Я начинаю со следующего:

                perf
date                
2018-06-01  0.012923
2018-06-02  0.039364
2018-06-03  0.042805
2018-06-04 -0.033214
2018-06-05 -0.021745

Необходимо рассчитать совокупныйпроцентное изменение в новом столбце, но необходимо убедиться, что в расчете используется 100 в качестве начального значения.Итак, я добавляю одну строку к 100:

                perf  pct_change
date                            
2018-05-31       NaN       100.0
2018-06-01  0.012923         NaN
2018-06-02  0.039364         NaN
2018-06-03  0.042805         NaN
2018-06-04 -0.033214         NaN

Что мне нужно получить, это:

                perf  pct_change
date                            
2018-05-31       NaN       100.0
2018-06-01  0.012923    101.2923
2018-06-02  0.039364 105.2795701
2018-06-03  0.042805 109.7860621
2018-06-04 -0.033214 106.1396278

Формула что-то вроде pct_change = previous_days_pct_change * ( 1 + perf )

Я пробовал несколько разных подходов, включая for ... in цикл безуспешно.

# INCOMPLETE/DOES NOT WORK (adding for illustration purposes only)
for index, row in performance.iterrows():
    curr = performance.loc[index, 'perf']
    pidx = index + pd.DateOffset(-1)
    prev = performance.iloc[[pidx], 'pct_change']
    performance.loc[index, 'pct_change'] = prev * ( 1 + curr )

Я также пробовал:

performance['pct_change'] = performance['pct_change'].shift() * ( 1 + performance['perf'] )

, что дает:

                perf  pct_change
date                            
2018-05-31       NaN         NaN
2018-06-01  0.012923  101.292251
2018-06-02  0.039364         NaN
2018-06-03  0.042805         NaN
2018-06-04 -0.033214         NaN

Но это только дает мне одно значение.

Я подозреваю, что уже есть гораздо более простой способ сделать то, что я пытаюсь сделать, но я просто не нахожу это.Любая помощь будет оценена.Это очень легко сделать в электронной таблице, но я хочу научиться делать это в Pandas.

Спасибо

Ответы [ 2 ]

2 голосов
/ 27 мая 2019

Используя cumprod:

df['pct_change'] = (df['perf']+1).cumprod() * 100

достигается то, что вы на самом деле хотите:

pct_change_0 = (perf_0 + 1) * 100
pct_change_1 = pct_change_0 * (perf_1 + 1) = (perf_0 + 1) * (perf_1 + 1) *  100
pct_change_2 = pct_change_1 * (perf_2 + 1) = (perf_0 + 1) * (perf_1 + 1) * (perf_2 + 1) * 100
...

Таким образом, вы фактически вычисляете совокупный продукт perfзначения (или, если быть более точным, perf + 1 значения).

0 голосов
/ 27 мая 2019

Вроде так:

dates = ['2018-06-01', '2018-06-02', '2018-06-03', '2018-06-04', '2018-06-05']
import datetime as dt
dates = [pd.datetime.date(dt.datetime.strptime(x, "%Y-%m-%d")) for x in dates]
perfs = [0.012923, 0.039364, 0.042805, -0.033214, -0.021745]
df = pd.DataFrame({'perf': perfs}, index=dates)

# The important bit:
df['pct_change'] = ((df['perf'] + 1).cumprod() * 100)

df
#                 perf  pct_change
# 2018-06-01  0.012923  101.292300
# 2018-06-02  0.039364  105.279570
# 2018-06-03  0.042805  109.786062
# 2018-06-04 -0.033214  106.139628
# 2018-06-05 -0.021745  103.831622
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...