Некорректный вывод динамики изменений pct_change() при отрицательном предыдущем показателе
Имеется фрейм данных с финансовыми показателями по периодам, где я хочу подсчитать изменения в % к предыдущему периоду:
id year profit assets
qwe 2018 -1373 19577
qwe 2019 1328 23361
dfe 2018 22836 16789
dfe 2019 22290 15335
dfg 2018 -1212 1732
dfg 2019 3089 2323
Для расчета динамики использую следующий код:
res = (df[["id","year"]]
.join(df
.groupby(["id"], as_index=False)
[["profit","assets"]]
.pct_change().fillna(0)*100))
Получается фрейм данных, где результат выдается не совсем корректный, т.к. предыдущее значение идет со знаком минус (убыток), то и при положительном следующем периоде показывает изменение в % со знаком минусом, а хотелось бы, чтобы указывал корректно, со знаком плюс.
Выввод с некорректными знаками, если предыдущее значение отрицательное:
id year profit assets
qwe 2018 0 0
qwe 2019 -197 19
dfe 2018 0 0
dfe 2019 -2 -9
dfg 2018 0 0
dfg 2019 -355 34
А вот как должно выглядеть на самом деле:
id year profit assets
qwe 2018 0 0
qwe 2019 197 19
dfe 2018 0 0
dfe 2019 -2 -9
dfg 2018 0 0
dfg 2019 355 34
Ответы (2 шт):
Автор решения: MaxU
→ Ссылка
Решение:
res["profit"] *= np.sign(df["profit"]).shift().fillna(1).to_numpy()
Результат:
In [30]: res
Out[30]:
id year profit assets
0 qwe 2018 0.000000 0.000000
1 qwe 2019 196.722505 19.328804
2 dfe 2018 0.000000 0.000000
3 dfe 2019 -2.390962 -8.660432
4 dfg 2018 0.000000 0.000000
5 dfg 2019 354.867987 34.122402
Автор решения: Pavel
→ Ссылка
На самом деле есть вот такое решение, вроде рабочее:
res = (df[["id","year"]]
.join(df
.groupby(["id"], as_index=False)
[["profit","assets"]]
.apply(lambda x: x.diff()/x.shift().abs()*100)))