#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