#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
параметр @Lynnetteperiod
делает что-то отличное от того, о чем вы думаете, в основном то, что он делает, например, период равен 2, он вычитает строку со строкой выше на 2 индекса. Взгляните наpd.Grouper
3.
df.groupby(pd.Grouper(key='Date', freq='7D')).sum()
должен это сделать. @Lynnette4. Спасибо за ваш вклад
5. @Lynnette Рад, что помог. GL 😉