Процентное изменение с использованием двух столбцов, один сдвинут - PullRequest
0 голосов
/ 28 мая 2018

У меня есть фрейм данных, который содержит следующие столбцы:

member (float64), datetime (datetime64[ns]), var1(float64), var2(float64)

Как рассчитать процентное изменение между каждым элементом var1 и 1-шаговым лагом var2, выполняя это для каждого члена?Результат должен быть создан как новый столбец.

    var1     var2  member      datetime       expected new column
   131.255  137.032  1   2017-02-02 09:15:00   n/a
   129.700  131.193  1   2017-02-02 09:20:00  -0.05351 ((129.7-137.032)/137.032)

Новый столбец будет начинаться с var1[1]-var2[0]/var2[0] для каждого "члена".Единственный способ, которым я пытался, - это создать две сводные таблицы и рассчитать разницу для каждого элемента, но я думаю, что должен быть более эффективный способ использования векторизации?

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

сортирует данные так, чтобы строки, принадлежащие одному и тому же члену, были рядом друг с другом.

df = df.sort_values(['member', 'datetime'])

создает массив смещенных переменных var2 для каждой группы члена

shifted = df.groupby('member').var2.shift() # the default shifts by 1, which is needed here

назначитьновый столбец, использующий смещенный массив для вычисления

df['newcol'] = (df.var1 - shifted) / shifted

Это добавляет дополнительный столбец

      var1     var2  member             datetime    newcol
0  131.255  137.032       1  2017-02-02 09:15:00       NaN
1  129.700  131.193       1  2017-02-02 09:20:00 -0.053506

или, сделайте это в 1 строку:

df['newcol'] = df.var1/df.groupby('member').var2.shift()-1
0 голосов
/ 28 мая 2018

Это один из способов использования pd.Series.shift:

df['ratio'] = (df['var1'] / df['var2'].shift()) - 1

print(df)

      var1     var2  member     ratio
0  131.255  137.032       1       NaN
1  129.700  131.193       1 -0.053506

Если вам требуется расчёт для каждого члена, вам нужно предоставить большую выборку ваших данных и показать нам точножелаемый вывод для большего набора данных.

...