2016-10-12 2 views
1

У меня есть dataframe, который выглядит следующим образом:pandas: сравнить сумму за два периода времени?

  prod_code  month items  cost 
0 040201060AAAIAI 2016-05-01  5 572.20 
1 040201060AAAKAK 2016-05-01 164 14805.19  
2 040201060AAALAL 2016-05-01 13465 14486.07 

Я хотел бы первую группу первого четыре символа prod_code, затем просуммировать общую стоимость каждой группы из января-февраля 2016 года, а затем сравнить это с общая стоимость с марта по апрель 2016 года, затем найдите группы с наибольшим процентным увеличением за два периода времени.

Каков наилучший способ сделать это?

Вот мой код до сих пор:

d = { 'prod_code': ['040201060AAAIAI', '040201060AAAIAJ', '040201060AAAIAI', '040201060AAAIAI', '040201060AAAIAI', '040201060AAAIAI', '040301060AAAKAG', '040301060AAAKAK', '040301060AAAKAK', '040301060AAAKAX', '040301060AAAKAK', '040301060AAAKAK'], 'month': ['2016-01-01', '2016-02-01', '2016-03-01', '2016-01-01', '2016-02-01', '2016-03-01', '2016-01-01', '2016-02-01', '2016-03-01', '2016-01-01', '2016-02-01', '2016-03-01'], 'cost': [43, 45, 46, 41, 48, 59, 8, 9, 10, 12, 15, 13] } 
df = pd.DataFrame.from_dict(d) 
df['para'] = df.prod_code.str[:4] 
df_para = df.groupby(['para', 'month']).sum() 

Это дает мне df_para, который выглядит следующим образом:

    cost 
para month 
0402 2016-01-01 84 
    2016-02-01 93 
    2016-03-01 105 
0403 2016-01-01 20 
    2016-02-01 24 
    2016-03-01 23 

Теперь нужно вычислить сумму для каждой группы в январе-феврале и для Apr-Mar, то разница между этими двумя группами и, наконец, сортировать по разнице между этими двумя группами. Каков наилучший способ сделать это?

+0

Не могли бы вы предоставить ввод __reproducible__ и нужные наборы данных? – MaxU

ответ

1

Вы можете создать переменный месяц группы в зависимости от того, что месяцы Jan-Feb или Mar-Apr, а затем группы по переменному групповому коду и месяца, суммировать стоимость и вычислить разницу:

import numpy as np 
import pandas as pd 
df['month_period'] = np.where(pd.to_datetime(df.month).dt.month.isin([1,2]), 1, 2) 
# creation of the month group variable could be adjusted based on how you want to cut 
# your time, this is a simplified example which assumes you only have data from Jan-Apr 

(df.groupby([df.prod_code.str[:4], df.month_period]).sum().groupby(level = 0).pct_change() 
    .dropna().sort('cost', ascending=False)) 

enter image description here

+0

Спасибо, это отлично! На самом деле у меня есть пять лет данных и я хочу сравнить январь-июнь 2010 года с январем-июнем 2015 года - какой был бы лучший способ сделать это? Мне, вероятно, понадобится три значения для фиктивной переменной - скажем 1 для первого периода, 2 для второго периода и нуль для всего остального, но тогда как бы я вычислил «pct_change» только от 1 до 2? – Richard

+0

Если вы установите 0 для всего остального, тогда вы можете либо отфильтровать все 0 записей, прежде чем вычислять 'pct_change', либо возвращать два pct_change для каждой группы, а второе должно быть тем, что вы ищете. Я бы, вероятно, просто отфильтровал записи, которые не попадают в диапазон дат, который вас интересует. – Psidom

+0

Что-то вроде 'cond1 = (df.month> '2010-01-01') & (df.month <'2010- 06-30 '); cond2 = (df.month>' 2015-01-01 ') & (df.month <' 2015-06-30 '); df [' month_period '] = np.where (cond1, 1 , np.where (cond2, 2, 0)); df = df [df.month_period! = 0]; ' – Psidom