2016-05-01 4 views
3

Ich habe eine CSV-Datei mit vier Spalten: Datum, Großhändler, Produkt und Vertrieb. Ich suche nach dem Durchschnitt der letzten 52 Wochen Verkäufe für jede Produkt- und Großhandelskombination an jedem Datum. Es bedeutet, was der durchschnittliche vorherige Verkauf von Produkt 'A' beim Großhändler 'B' zum Zeitpunkt 'C' in den letzten 52 Wochen war.So finden Sie den Durchschnitt der letzten 52 Wochen Umsatz zu jeder Zeit in Python

Zum Beispiel kennen wir den Verkauf von Produkt 'A' beim Großhändler 'B' am Jan., April, Mai, Aug, die 100, 200, 300, 400 sind. Nehmen wir an, wir haben keine Aufzeichnungen vor Jan. So ist der Durchschnitt des vorherigen Verkaufs von Produkt 'A' im Großhändler 'B' bei Apr gleich 100/1, und bei Mai ist gleich (200 + 100)/2 und im August ist (300 + 200 + 100)/3.

Die folgende Tabelle zeigt meine Daten:

date wholesaler product sales 
12/31/2012 53929 UPE54  4 
12/31/2012 13131 UPE55  1 
2/23/2013 13131 UPE55 1156 
4/24/2013 13131 UPE55  1 
12/1/2013 83389 UPE54  9 
12/17/2013 83389 UPE54  1 
12/18/2013 52237 UPE54  9 
12/19/2013 53929 UME24  1 
12/31/2013 82204 UPE55  9 
12/31/2013 11209 UME24  4 
12/31/2013 52237 UPE54  1 

Jetzt verwende ich:

df = pd.read_csv('Sample.csv',index_col='date') 

expd_gb = df.reset_index().groupby(['wholesaler', 'product'])['sales'].apply(pd.Series.expanding) 
idx = df.reset_index().groupby(['wholesaler', 'product', 'date'])['sales'].count().index 

cnct = pd.concat([expd_gb.iloc[n].mean().shift(1) for n in range(len(expd_gb))]) 
cnct.index = idx 

Das durchschnittliche gibt (nicht letzten 52 Wochen) früherer Verkäufe für jedes Produkt-Groß Kombination. Das Ergebnis ist:

wholesaler product date  
11209  UME24 12/31/2013  NaN 
13131  UPE55 12/31/2012  NaN 
        2/23/2013  1.0 
        4/24/2013  578.5 
52237  UPE54 12/18/2013  NaN 
        12/31/2013  9.0 
53929  UME24 12/19/2013  NaN 
      UPE54 12/31/2012  NaN 
82204  UPE55 12/31/2013  NaN 
83389  UPE54 12/1/2013  NaN 
        12/17/2013  9.0 

Mit der Zeit steigt die Iteration der Verkaufsrekord. Ich muss herausfinden, was der Durchschnitt der Verkäufe nur für die letzten 52 Wochen ist. Es bedeutet zu einem bestimmten Zeitpunkt zum Beispiel 11/6/2015, was ist der durchschnittliche Umsatz eines Produkts bei bestimmten Großhändler für die letzten 52 Wochen. Tausend Dank für deine Hilfe!

Antwort

2

Betrachten Sie eine apply Funktion bedingt den Verkauf der letzten 52 Wochen von Großhändler und Produkt für jeden Datensatz im Durchschnitt. Ohne Umgehung gibt groupby() denselben Wert für die Gruppe zurück, während Sie einen Typ für den Durchschnitt der laufenden Gruppe benötigen. Versuchen Sie also, die Verarbeitung nach Serien durchzuführen. Stellen Sie sicher, dass Sie das Datum in das Datetime-Format konvertieren, da Sie die timedelta() verwenden können, um 52 Wochen zurückzuzählen.

import pandas as pd 
import datetime 

dateparse = lambda x: pd.datetime.strptime(x, '%m/%d/%Y') 

df = pd.read_csv('Sample.csv', index_col='date', 
       parse_dates=[0], date_parser=dateparse) 

def last52weeks(x): 
    ser = df['sales'][(df.index >= x.name - datetime.timedelta(weeks=52)) & 
         (df.index <= x.name) & 
         (df['wholesaler'] == x[0]) & 
         (df['product'] == x[1])] 
    return ser.mean() 

df['avg_sales_last52weeks'] = df.apply(last52weeks, axis=1) 
df = df.sort_values(['wholesaler', 'product']) 

#    wholesaler product sales avg_sales_last52weeks 
# date               
# 2013-12-31  11209 UME24  4      4.0 
# 2012-12-31  13131 UPE55  1      1.0 
# 2013-02-23  13131 UPE55 1156     578.5 
# 2013-04-24  13131 UPE55  1     386.0 
# 2013-12-18  52237 UPE54  9      9.0 
# 2013-12-31  52237 UPE54  1      5.0 
# 2013-12-19  53929 UME24  1      1.0 
# 2012-12-31  53929 UPE54  4      4.0 
# 2013-12-31  82204 UPE55  9      9.0 
# 2013-12-01  83389 UPE54  9      9.0 
# 2013-12-17  83389 UPE54  1      5.0 
+0

Vielen Dank! Das ist großartig!Glauben Sie, dass die Funktion 'timedelta()' schneller arbeiten könnte? Eigentlich muss ich mehr als 25 Millionen Zeilen berechnen und ich hoffe, den schnellsten Weg zu finden, das Ergebnis zu finden. Nochmals vielen Dank für Ihren eleganten Code! – Ashkan

+1

Wow! Ein ziemlich großer Datensatz. Stellen Sie sich eine Datenbank-SQL-Lösung vor, die bedingte Aggregatabfragen zum Ausführen von avg und Indextabelle für das Datum verwendet. Dann in Pandas df importieren. – Parfait

+0

Vielen Dank für Ihren Kommentar! Das ist eine gute Idee. – Ashkan

1

Wenn der Durchschnitt ein Wochendurchschnitt ist, sollten Sie die Summe (pro Produkt pro Großhändler) nicht durch die Anzahl der Wochen, dh 52, teilen, statt den Mittelwert in cnct = pd.concat ([expd_gb. iloc [n] .mean(). shift (1) für n im Bereich (len (expd_gb))])?

Wenn Sie weniger als 52 Wochen haben, dann möchten Sie den Gesamtumsatz für dieses Produkt für diesen Großhändler durch die Anzahl der Wochen teilen, die Sie haben. Zum Beispiel, wenn Sie in (2016) Januar 100 Widgets, 200 im Februar und 400 im März verkauft haben, wären Ihre Gesamtverkäufe ab dem 1. April 700. Es gibt 31 Tage im Januar, 29 im Februar und 31 im März, also Die Gesamtzahl der Tage beträgt 91, was 13 Wochen entspricht (91/7). Der durchschnittliche Wochenumsatz für diesen Dreimonatszeitraum wäre somit 700/13 oder ca. 53,85 Widgets pro Woche. Es spielt keine Rolle, ob Sie 91 tägliche Aufzeichnungen, 13 wöchentliche Aufzeichnungen oder 3 monatliche Aufzeichnungen hatten, der wöchentliche Durchschnitt ist immer noch derselbe.

Um die Anzahl der Tage (und davon Wochen) zu erhalten, können Sie sich die timedelta Objekte ansehen. Sobald Sie über 52 Wochen bekommen, können Sie auch mit timedelta herausfinden, was das Datum vor 52 Wochen (oder 364 Tagen) war, und wenn Sie die Datei lesen, verwerfen Sie alles vor diesem Datum.

+0

Danke für Ihren Kommentar! Es ist ein bisschen komplizierter. Im ersten Jahr, da wir weniger als 52 Datensätze pro Produkt pro Großhändler haben, können wir den Mittelwert aller Datensätze verwenden, aber für die nächsten Jahre suchen wir nur den Durchschnitt der letzten 52 Wochen. Auch haben alle Produkt-Großhändler-Kombinationen keine wöchentlichen Aufzeichnungen, dh für einen bestimmten Produkt-Großhändler haben wir zum Beispiel 12 Datensätze, also sollte der Durchschnitt Summe (12 Datensätze)/52 sein. Eigentlich denke ich, dass dein Kommentar wahr ist, aber ich weiß nicht, wie ich die Logik behindern soll! – Ashkan

Verwandte Themen