Получить сумму различий в строках с помощью Pandas .diff()

#python #pandas #dataframe #time-series

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

Вопрос:

Я провожу анализ временных рядов, в котором мне нужно рассчитать изменение нескольких атрибутов с течением времени. Pandas упрощает простую версию этого; функция .diff(periods= n) вычислит разницу между строкой и предыдущими n строками, однако это не совсем то, что мне нужно…

 df= pd.DataFrame({'day_num': [134, 135, 136, 137],
                    'swe': [38.8, 38.9, 37.6, 36.8],
                     'prcp': [0., 0.1, 0., 0.15],
                     'flow': [2930, 3350, 3900, 4090]})

diff_3 = df.diff(periods=3)
  

ВОЗВРАТ:

    day_num   swe  prcp  flow
0      134  38.8  0.00  2930
1      135  38.9  0.00  3350
2      136   37.6  0.00  3900
3      137  36.8  0.15  4090
  

И:

   day_num  swe  prcp    flow
0      NaN  NaN   NaN     NaN
1      NaN  NaN   NaN     NaN
2      NaN  NaN   NaN     NaN
3      3.0 -2.0  0.15  1160.0
  

В столбце swe (эквивалент снежной воды в дюймах, буквально эквивалент жидкой воды для конкретного снежного покрова) разница в 3 дня для индекса 3 равна -2.0, что равно 36.8 — 38.8. Однако обратите внимание, что в течение 3-дневного периода наблюдалось увеличение и уменьшение. Это означает, что в общей сложности 2,1 дюйма (мой желаемый результат) воды растаяли и внесли свой вклад в поток (столбец потока) за это 3-дневное окно. Min — max также не будет работать, потому что, если бы я увеличил значение n до 7 или 14, могли бы легко возникнуть «плавления», которые не учитываются в выходных данных. Что необходимо, так это сумма различий за один день за промежуток из n дней. В конечном итоге я хочу объединить столбцы diff_n обратно в исходный набор данных.

Любые идеи будут оценены. Кроме того, это мой первый пост, поэтому дайте мне знать, как я могу улучшить свой формат / контент…

Ответ №1:

сумма различий за один день за период в n дней

Сначала diff последовательные строки затем выполняют скользящую сумму. Поскольку ряд после diff уже имеет разницу для 2 последовательных строк, для скользящей суммы мы предоставляем только period-1 (в нашем случае 3-1 = 2 ).

 periods = 3
df['swe'] = df['swe'].diff().rolling(periods-1).sum()
  

Вывод:

    day_num  swe  prcp  flow
0      134  NaN  0.00  2930
1      135  NaN  0.10  3350
2      136 -1.2  0.00  3900
3      137 -2.1  0.15  4090
  

Это также эквивалентно выполнению следующего, поскольку вклад промежуточных дней в конечном итоге будет сведен на нет:

 df['swe'] = df['swe'].diff(periods-1)
  

Вывод:

    day_num   swe  prcp  flow  swe_using_diff  swe_using_rolling_sum
0      134  38.8  0.00  2930             NaN                    NaN
1      135  38.9  0.10  3350             NaN                    NaN
2      136  37.6  0.00  3900            -1.2                   -1.2
3      137  36.8  0.15  4090            -2.1                   -2.1