2017-05-02 2 views
0

Ich habe einen Pivot-Pandas-Datenrahmen (Umsatz nach Region), der aus einem anderen Pandas-Datenrahmen (Umsatz nach Geschäft) mit der Pivot_table-Methode erstellt wurde.aggregierte Daten nach Quartal

Als Beispiel:

df = pd.DataFrame(
    {'store':['A','B','C','D','E']*7, 
    'region':['NW','NW','SW','NE','NE']*7, 
    'date':['2017-03-30']*5+['2017-04-05']*5+['2017-04-07']*5+['2017-04-12']*5+['2017-04-13']*5+['2017-04-17']*5+['2017-04-20']*5, 
    'sales':[30,1,133,9,1,30,3,135,9,11,30,1,140,15,15,25,10,137,9,3,29,10,137,9,11,30,19,145,20,10,30,8,141,25,25] 
    }) 
df['date'] = pd.to_datetime(df['date']) 
df_sales = df.pivot_table(index = ['region'], columns = ['date'], aggfunc = [np.sum], margins = True) 
df_sales = df_sales.ix[:,range(0, df_sales.shape[1]-1)] 

Mein Ziel ist die folgende zum Verkaufsdatenrahmen zu tun, df_sales.

Erstellen Sie einen neuen Datenrahmen, der die Umsätze nach Quartal zusammenfasst. Ich könnte den ursprünglichen Datenrahmen df oder den sales_df verwenden.

Ab Quartal haben wir hier nur nur zwei Viertel (USA fiscal calendar year) so den Quartalsrahmen aggregierten Daten aussehen würde:

2017Q1 2017Q2 
10  27 
31  37.5 
133  139.17 

Ich nehme den Durchschnitt für alle Tage in Q1 und Q2 gleich für. So ist zum Beispiel für die Region North East, 'NE', das Q1 der Durchschnitt von nur einem Tag 2017-03-30, dh 10, und für das Q2 ist der Durchschnitt über 2017-04-05 bis 2017-04-20 dh

(20+30+12+20+30+50)/6=27 

Irgendwelche Vorschläge?

ZUSÄTZLICHE HINWEIS: Ich würde idealerweise die Viertelaggregationen auf der geschwenkten Tabelle df_sales tun, da es ein viel kleinerer Datenrahmen ist, im Speicher zu behalten. Die aktuelle Lösung tut es auf dem ursprünglichen df, aber ich suche immer noch eine Möglichkeit, es im df_sales Dataframe zu tun.

+0

Könnten Sie eine kleine Probe reproduzierbar Datensatz erstellen (Quelle DF - 'df') und gewünschten Daten eingestellt? – MaxU

+0

@MaxU sicher, lassen Sie mich ein einfaches Beispiel erstellen – Dnaiel

+0

@MaxU ok, ich erstelle ein vollständiges Beispiel für Sie. – Dnaiel

Antwort

1

UPDATE:

Setup:

df.date = pd.to_datetime(df.date) 

df_sales = df.pivot_table(index='region', columns='date', values='sales', aggfunc='sum') 

In [318]: df_sales 
Out[318]: 
date 2017-03-30 2017-04-05 2017-04-07 2017-04-12 2017-04-13 2017-04-17 2017-04-20 
region 
NE    10   20   30   12   20   30   50 
NW    31   33   31   35   39   49   38 
SW    133   135   140   137   137   145   141 

Lösung:

In [319]: (df_sales.groupby(pd.PeriodIndex(df_sales.columns, freq='Q'), axis=1) 
    ...:   .apply(lambda x: x.sum(axis=1)/x.shape[1]) 
    ...:) 
Out[319]: 
date 2017Q1  2017Q2 
region 
NE  10.0 27.000000 
NW  31.0 37.500000 
SW  133.0 139.166667 

Lösung basiert auf dem ursprünglichen DF:

In [253]: (df.groupby(['region', pd.PeriodIndex(df.date, freq='Q-DEC')]) 
    ...: .apply(lambda x: x['sales'].sum()/x['date'].nunique()) 
    ...: .to_frame('avg').unstack('date') 
    ...:) 
    ...: 
Out[253]: 
      avg 
date 2017Q1  2017Q2 
region 
NE  10.0 27.000000 
NW  31.0 37.500000 
SW  133.0 139.166667 

HINWEIS: df - ist das Original DF (vor "Schwenken")

+0

vielen dank, tolle lösung! – Dnaiel

Verwandte Themen