Вывод необработанной разницы значений от одного периода к следующему с помощью Python

#python #pandas #numpy #time-series

#python #pandas #numpy #временные ряды

Вопрос:

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

         Date             Value

        10/01/2020      1
        10/02/2020      2
        10/03/2020      5
        10/04/2020      8
  

Желаемый результат:

         Date            Value   PercentDifference    ValueDifference

        10/01/2020      1       
        10/02/2020      2       100                   2
        10/03/2020      5       150                   3
        10/04/2020      8       60                    3
  

Это то, что я делаю:

  import pandas as pd
 df = pd.read_csv('df.csv')   

 df = (df.merge(df.assign(Date=df['Date'] - pd.to_timedelta('1D')),
      on='Date')
 .assign(Value = lambda x: x['Value_y']-x['Value_x'])
 [['Date','Value']]
  )  


 df['PercentDifference'] = [f'{x:.2%}' for x in (df['Value'].div(df['Value'].shift(1)) - 
 1).fillna(0)]
  

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

Примечание — Есть ли способ включить «период» — скажем, проверить процентную разницу и разницу в значениях за 7-дневный период и 30-дневный период и так далее?

Любое предложение приветствуется

Ответ №1:

Используйте Series.pct_change и Series.diff

 df['PercentageDiff'] = df['Value'].pct_change().mul(100)
df['ValueDiff'] = df['Value'].diff()

         Date  Value  PercentageDiff  ValueDiff
0  10/01/2020      1             NaN        NaN
1  10/02/2020      2           100.0        1.0
2  10/03/2020      5           150.0        3.0
3  10/04/2020      8            60.0        3.0
  

Или вы используете df.assign

 df.assign(
    percentageDiff=df["Value"].pct_change().mul(100), 
    ValueDiff=df["Value"].diff()
)

  

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

1. @Lynnette groupby с использованием периода pd.Grouper , затем используйте sum для получения общего значения за каждый период. Теперь примените pct_change и diff

2. Series.diff параметр @Lynnette period делает что-то отличное от того, о чем вы думаете, в основном то, что он делает, например, период равен 2, он вычитает строку со строкой выше на 2 индекса. Взгляните на pd.Grouper

3. df.groupby(pd.Grouper(key='Date', freq='7D')).sum() должен это сделать. @Lynnette

4. Спасибо за ваш вклад

5. @Lynnette Рад, что помог. GL 😉