Вычисление процентной разницы Pandas

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть приведенный ниже фрейм данных Pandas. Первый столбец — это дата в формате ГГГГ-ММ-ДД. В нем есть данные за месяц, но месяц, начинающийся не обязательно с 1-го, и последний месяц не обязательно может быть 31 или 30, а не 29 или 28 февраля. Это может отличаться. Например, в феврале 2020 года есть данные только за 2020-02-03, а последние доступные данные за февраль — 2020-02-28 (не 29-го).

 Date       start_Value end_value
2020-01-01 115         120
2020-01-02 122         125
2020-01-03 125.2       126
...
2020-01-31 132         135
2020-02-03 135.5       137
2020-02-04 137.8       138
...
2020-02-28 144         145   
  

Моя цель — создать новый столбец, который вычисляет процентную разницу между конечным значением последней доступной даты предыдущего месяца в dataframe и конечным значением последней доступной даты следующего месяца в dataframe. Оно должно быть равно 0 для всех дат, кроме последней доступной даты месяца. Для января 2020 года, поскольку у нас нет данных за предыдущий месяц, процентная разница должна быть рассчитана с использованием конечного значения первой доступной даты за месяц.

Для января 2020 года процентная разница будет рассчитана между конечным значением 2020-01-01 и конечным значением 2020-01-31. Для остальных (например, с февраля 2020 года: процентная разница рассчитывается между конечным значением 2020-01-31 и конечным значением 2020-02-28).

 Date       start_Value end_value percentage difference
2020-01-01 115         120       0
2020-01-02 122         125       0
2020-01-03 125.2       126       0
...
2020-01-31 132         135       17.4
2020-02-03 135.5       137       0
2020-02-04 137.8       138       0
...
2020-02-28 144         145       7.41       
  

как добиться этого в python и pandas?

Ответ №1:

Проверьте с transform помощью duplicated

 s = df.Date.dt.strftime('%Y-%m')
df['pct']= (df.groupby(s)['end_value'].transform('last')/df.groupby(s)['start_Value'].transform('first')-1).
              mask(s.duplicated(keep='last'))
  

Комментарии:

1. Отлично. Это сработало отлично. Но в моем вопросе есть небольшое изменение — вместо сравнения начального значения 1-й даты месяца и конечного значения последней доступной даты за месяц, можно ли получить процентную разницу между конечным значением последней доступной даты предыдущего месяца и конечным значением последней доступной даты текущего месяца?