Есть ли функция панды для возврата мгновенных значений из накопленной суммы? - PullRequest
2 голосов
/ 24 июня 2019

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

Я уже построил функцию, которая использует циклы для каждого столбца в кадре данных и вычитаетпредыдущий столбец из выбранного столбца (очень неэффективно).Но в некоторых случаях у меня есть ежемесячные данные вместо квартальных, поэтому число периодов меняется с 4 на 12.

Изображение кадра данных у меня

Мне нужнофункция, которая принимает количество периодов (например, скользящую сумму, которая принимает количество окон в качестве входных данных) и выводит дезагрегированную сумму кадра данных.

Спасибо!

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Вы можете сделать эти шаги:

import pandas as pd
df = pd.DataFrame([[1, 3, 2], [100, 90, 110]], columns=['2019-01', '2019-02', '2019-03'], index=['A', 'B'])
df = df.unstack().reset_index(name='value').sort_values(['level_1', 'level_0'])
df['delta'] = df.groupby('level_1').diff()
df['delta'].fillna(df.value, inplace=True)
df.pivot(index='level_1', columns='level_0', values='delta')
1 голос
/ 24 июня 2019

Возьмите diff в группе. Нужно .fillna чтобы получить первое значение.

Пример данных

df = pd.DataFrame(np.random.randint(1, 10, (3, 8)))
df.columns = [f'{y}-{str(m).zfill(2)}' for y in range(2012, 2014) for m in range(1, 5)]
df = df.cumsum(1)  # For illustration, don't worry about across years.
df['tag'] = 'foo'

   2012-01  2012-02  2012-03  2012-04  2013-01  2013-02  2013-03  2013-04  tag
0        5        6       15       23       25       28       36       45  foo
1        5        9       14       17       24       27       31       38  foo
2        4       10       11       19       24       29       38       41  foo

Код:

df.groupby(df.columns.str[0:4], axis=1).diff(1).fillna(df)

   2012-01  2012-02  2012-03  2012-04  2013-01  2013-02  2013-03  2013-04  tag
0      5.0      1.0      9.0      8.0     25.0      3.0      8.0      9.0  foo
1      5.0      4.0      5.0      3.0     24.0      3.0      4.0      7.0  foo
2      4.0      6.0      1.0      8.0     24.0      5.0      9.0      3.0  foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...