У меня есть сводная таблица, и я хочу создать еще одну сводную таблицу того же формата, но теперь она содержит процентное изменение по сравнению с прошлым годом.
Это простой пример:
my_data = {
'date': [datetime.date(2000,1,7), datetime.date(2000,1,14),
datetime.date(2001,1,5), datetime.date(2001,1,12)],
'week_number': [1,2,1,2],
'quarter_number': [1,1,1,1],
'name': ['hi','bye','hi','bye'],
'category': ['clothing','electronics','clothing','electronics'],
'total sales': [123,456,180,350]
}
my_df = pd.DataFrame(my_data)
my_df.pivot_table(index=['date','week_number','quarter_number'], columns=['name', 'category'])
В результате получается следующая сводная таблица:
total sales
name bye hi
category electronics clothing
date week_number quarter_number
2000-01-07 1 1 NaN 123.0
2000-01-14 2 1 456.0 NaN
2001-01-05 1 1 NaN 180.0
2001-01-12 2 1 350.0 NaN
Теперь позвольте мне сказать, что я хочу вычислить процентное изменение год за годом. Результирующая сводная таблица будет выглядеть так:
total sales pchg Y/Y
name bye hi
category electronics clothing
date week_number quarter_number
2000-01-07 1 1 NaN NaN
2000-01-14 2 1 NaN NaN
2001-01-05 1 1 NaN 0.463
2001-01-12 2 1 -0.23 NaN
Обратите внимание, что в общем случае у нас есть N имен, много лет данных и K категорий.
Я приведу здесь также более общий случай, чтобы показать, что pct_change не работает в режиме по умолчанию, поскольку не будет изменять процент в годовом исчислении.
my_data = {
'date': [datetime.date(2000,1,7), datetime.date(2000,1,14),
datetime.date(2001,1,5), datetime.date(2001,1,12),
datetime.date(2000, 1, 7), datetime.date(2000, 1, 14),
datetime.date(2001, 1, 5), datetime.date(2001, 1, 12),
datetime.date(2000, 1, 7), datetime.date(2000, 1, 14),
datetime.date(2001, 1, 5), datetime.date(2001, 1, 12),
datetime.date(2000, 1, 7), datetime.date(2000, 1, 14),
datetime.date(2001, 1, 5), datetime.date(2001, 1, 12)],
'week_number': [1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2],
'quarter_number': [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
'name': ['hi','hi','hi','hi','hi','hi','hi','hi','bye','bye','bye','bye','bye','bye','bye','bye'],
'category': ['clothing','clothing','clothing','clothing','electronics','electronics','electronics','electronics',
'clothing', 'clothing', 'clothing', 'clothing', 'electronics', 'electronics', 'electronics','electronics'],
'total sales': [123,456,180,350,123,456,180,350,123,456,180,350,123,456,180,350]
}
my_df = pd.DataFrame(my_data)
my_df.pivot_table(index=['date','week_number','quarter_number'], columns=['name', 'category'])
my_df.pivot_table(index=['date','week_number','quarter_number'], columns=['name', 'category']).apply(pd.Series.pct_change)
total sales ...
name bye ... hi
category clothing ... electronics
date week_number quarter_number ...
2000-01-07 1 1 NaN ... NaN
2000-01-14 2 1 2.707317 ... 2.707317
2001-01-05 1 1 -0.605263 ... -0.605263
2001-01-12 2 1 0.944444 ... 0.944444
pct_change явно ошибочен, так как он не обеспечивает изменения Y / Y, а скорее строка i в строку i + 1.