[PYTHON] <Pandas> Umgang mit Zeitreihendaten in der Pivot-Tabelle

Einführung

Der Autor nimmt derzeit an einem vom Ministerium für Wirtschaft, Handel und Industrie gesponserten AI-Personalentwicklungsprogramm namens AI Quest teil, bei dem der erste Semesterwettbewerb heute um 8:00 Uhr endete. Ich bin nicht froh, dass das Ergebnis der 18. Platz war (295 Teilnehmer), aber ich denke, dass es ein sehr praktischer Inhalt war, da es sich um eine Nachfrageprognose handelte, bei der tatsächliche Daten angenommen wurden. Deshalb habe ich diese Erfahrung niedergeschrieben. Ich werde es aufschreiben.

Datenübersicht

Der Umriss dieses Wettbewerbs besteht darin, dass tägliche Verkaufsdaten für jedes Produktgeschäft eines bestimmten Unternehmens für ungefähr 2 Jahre angegeben werden und basierend darauf die Verkäufe für den nächsten Monat vorhergesagt werden und die Daten wie folgt sind. Es wurde in Form von gegeben.

Datum Store ID Produkt ID Produktpreis Menge verkauft
0        2018-01-01     9  1000001   420   1.0
1        2018-01-01     6  1000001   420   1.0
2        2018-01-01    10  1000001   420   1.0
3        2018-01-01     0  1000017   250   1.0

Vorverarbeitung

Stellen Sie das Datum auf Datum / Uhrzeit ein, bevor Sie es mit Pivot behandeln.


df = pd.read_csv("data/sales_history.csv", parse_dates=["Datum"])

Wenn Sie auf diese Weise lesen, kann die Datumsspalte mit Datum / Uhrzeit gelesen werden. Wenn Sie es als "df.info ()" anzeigen, können Sie sehen, dass es vom Typ datetime ist (siehe unten).

RangeIndex: 1119570 entries, 0 to 1119569
Data columns (total 5 columns):
 #   Column  Non-Null Count    Dtype         
---  ------  --------------    -----         
0 Datum 1119570 nicht-null  datetime64[ns]
1 Store ID 1119570 nicht-null  int64         
2 Produkt-ID 1119570 nicht-null  int64         
3 Produktpreis 1119570 nicht-null  int64         
4 Anzahl der verkauften Einheiten 1119570 nicht-null  float64       
dtypes: datetime64[ns](1),float64(1),int64(3)
memory usage: 42.7 MB

Als nächstes möchte ich dies nach Monat aggregieren, damit ich eine Spalte erstellen kann, die dem Jahr und dem Monat entspricht.


df["Jahr Monat"] = df["Datum"].dt.strftime("%y%m")

Wenn Sie es als df [" Jahr / Monat "] .head () versuchen, können Sie sehen, dass es wie folgt erstellt wird. Übrigens, wenn Sie es auf "% Y" setzen, werden es in der AD 4 Stellen sein, und wenn Sie es auf "% y" setzen, werden es die letzten 2 Stellen sein.

0    1801
1    1801
2    1801
3    1801
4    1801
Name:Jahr Monat, dtype: object

Fassen wir es nach Monaten zusammen. Die Gesamtzahl der verkauften Einheiten ist in Ordnung, aber ich möchte den Durchschnittspreis anstelle des Gesamtpreises verwenden (diesmal habe ich den Medianwert verwendet, der nicht von abnormalen Werten beeinflusst wird), daher werde ich sie zusammen in "agg" beschreiben.


df = df.groupby(["Jahr Monat", "Produkt ID", "ID speichern"]).agg({"Anzahl der verkauften Einheiten":"sum", "Produktpreis":"median"}).reset_index()

Es wird nach Monat wie folgt zusammengefasst. Wenn Sie hier ".reset_index ()" verwenden, werden die für die Gruppierung verwendeten Spalten zu MultiIndex (der Index hat eine mehrstufige Hierarchie) und es ist schwierig zu handhaben. Lösen Sie ihn daher. Ich mache es.

Jahr / Monat Produkt-ID Geschäfts-ID Anzahl der verkauften Einheiten Produktpreis
0       1801  1000001     0   6.0   420
1       1801  1000001     1   2.0   325
2       1801  1000001     2   1.0   420

Schwenktisch

Es ist endlich das Hauptthema. Was wir diesmal tun sollten, ist, dass der Monat ohne Umsatz nicht 0 ist und es keine Daten selbst gibt. Wenn wir eine Vorhersage treffen, wie sie ist, gehen die Informationen verloren, dass der Umsatz 0 war, sodass der Monat ohne Daten 0 ist Ich möchte es mit füllen. Außerdem möchte ich den Betrag der Verzögerungsfunktion (Verkäufe des letzten Monats oder des Vormonats) hinzufügen. Der Pivot-Tisch macht es einfach, diese Dinge zu tun.


df_pivot = df.pivot_table(index=["Produkt ID", "ID speichern"], columns="Jahr Monat", values="Anzahl der verkauften Einheiten")

Wenn Sie den Index und die Spalte sowie den Wert angeben, der auf diese Weise aggregiert werden soll, ist dies ein gutes Gefühl.

Jahr 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810\
Produkt-ID Geschäfts-ID
1000001 0      6.0   3.0   1.0   2.0   NaN   4.0   3.0   2.0   1.0   NaN   
        1      2.0   1.0   NaN   2.0   NaN   2.0   1.0   NaN   NaN   1.0   
        2      1.0   NaN   1.0   NaN   1.0   2.0   3.0   4.0   2.0   1.0 

Wie Sie sehen, können Daten, die nicht vorhanden sind, als fehlender Wert ausgedrückt werden. Wenn Sie diesen Wert also mit 0 füllen, können Sie Verkäufe von 0 ausdrücken.


df_pivot = df_pivot.fillna(0)

Schauen wir uns als nächstes die Menge der Verzögerungsfunktionen an. Die Schreibmethode entspricht der Verschiebung einer Spalte in Zeitreihendaten.


sold_lag_1 = df_pivot.shift(1, axis=1)

Wenn Sie dies tun, wird eine nach rechts verschoben, wie unten gezeigt.

Jahr 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810\
Produkt-ID Geschäfts-ID
1000001 0      NaN   6.0   3.0   1.0   2.0   0.0   4.0   3.0   2.0   1.0   
        1      NaN   2.0   1.0   0.0   2.0   0.0   2.0   1.0   0.0   0.0   
        2      NaN   1.0   0.0   1.0   0.0   1.0   2.0   3.0   4.0   2.0    

Auf die gleiche Weise konnten wir die Verzögerung vor einigen Monaten als Feature hinzufügen.


sold_lag_2 = df_pivot.shift(2, axis=1)
sold_lag_3 = df_pivot.shift(3, axis=1)

Schließlich müssen Sie diese zum ursprünglichen Datenrahmen hinzufügen. Beispielsweise werden die Daten der Anzahl der verkauften Einheiten in dem entsprechenden Monat, der mit 0 gefüllt ist, wie folgt verarbeitet.


sold_lag_0 = df_pivot.stack().reset_index().rename(columns={0:"Gefüllt mit 0 verkauften Einheiten"})

Zunächst können Sie das, was durch ".stack ()" gedreht wurde, entfernen und mit einem vertikalen Multi-Index ausdrücken.

Produkt-ID Geschäfts-ID Jahr / Monat
1000001  0     1801    6.0
               1802    3.0
               1803    1.0
               1804    2.0
               1806    4.0

Auf diese Weise konnte ich den Multi-Index entfernen und so anordnen, dass er kombiniert werden kann, indem die Spaltennamen nach Bedarf angepasst werden. Sie müssen lediglich die Spaltennamen abgleichen und zusammenführen.


df_merge = pd.merge(df, sold_lag_0, how="right", on=['Jahr Monat', 'ID speichern', 'Produkt ID'])

Wenn Sie zu diesem Zeitpunkt "how =" right "" festlegen, können Sie dem rechten äußeren Join beitreten (Join basierend auf der Tabelle auf der rechten Seite) und es wird erfolgreich abgeschlossen.

Jahr / Monat Produkt-ID Geschäfts-ID Anzahl der verkauften Einheiten Produktpreis Anzahl der verkauften Einheiten 0
0       1801  1000001     0   6.0   420    6.0
1       1801  1000001     1   2.0   325    2.0
2       1801  1000001     2   1.0   420    1.0

Danach können die Verzögerungsmerkmale auf die gleiche Weise kombiniert werden, und der Preis kann linear mit "df_pivot.interpolate (" am nächsten ", limit_direction =" beide ", Achse = 1)" ergänzt werden. Ich kann es schaffen Mit anderen Worten, mehr Informationen können extrahiert werden, indem vier Regeln für Verzögerungsmerkmalsgrößen ausgeführt werden.

Basierend auf dem, was ich diesmal gelernt habe, möchte ich mich dafür einsetzen, im nächsten Wettbewerb bessere Ergebnisse zu erzielen.

Recommended Posts

<Pandas> Umgang mit Zeitreihendaten in der Pivot-Tabelle
Umgang mit Zeitreihendaten (Implementierung)
Lesen von Zeitreihendaten in PyTorch
Einfallsreichtum beim speichersparenden Umgang mit Daten mit Pandas
So formatieren Sie eine Tabelle mit Pandas Apply, Pivot und Swaplevel
So zeigen Sie DataFrame als Tabelle in Markdown an
Umgang mit Datenrahmen
[Pandas] So überprüfen Sie Duplikate in einer Tabelle und löschen Duplikate (entspricht dem Löschen von Duplikaten in Excel)
Zeichnen Sie Zeitreihendaten in Python mit Pandas und Matplotlib
[Python] So geben Sie eine Pandas-Tabelle in eine Excel-Datei aus
So erhalten Sie einen Überblick über Ihre Daten in Pandas
Data Science-Begleiter in Python, wie man Elemente in Pandas spezifiziert
Umgang mit Sitzungen in SQLAlchemy
Wie man nüchtern mit Pandas schreibt
[Python] Verwendung der Pandas-Serie
Umgang mit Japanisch mit Python
So berechnen Sie die Summe oder den Durchschnitt von Zeitreihen-CSV-Daten in einem Augenblick
So extrahieren Sie Funktionen von Zeitreihendaten mit PySpark Basics
[Python] So fügen Sie einer Tabelle Zeilen und Spalten hinzu (pandas DataFrame)
Wie erstelle ich eine große Menge an Testdaten in MySQL? ??
Beispiel für das Aggregieren einer großen Menge von Zeitreihendaten mit Python in einer kleinen Speicherumgebung mit einer angemessenen Geschwindigkeit
So vergleichen Sie Zeitreihendaten-Derivative DTW, DTW-
Wie bekomme ich Stacktrace in Python?
So zeigen Sie die neunundneunzig Tabelle in Python an
So weisen Sie den Index im Pandas-Datenrahmen neu zu
Umgang mit aufeinanderfolgenden Werten in MySQL
Lesen von CSV-Dateien mit Pandas
Hinzufügen von Serien zur Spalte in Python-Pandas
So ändern Sie mehrere Spalten von csv in Pandas (Unixtime-> Japan Time)
So senden Sie ein visualisiertes Bild der in Python erstellten Daten an Typetalk
So stoppen Sie das Programm bis zu einem bestimmten Datum und einer bestimmten Uhrzeit in Python
Bequeme Zeitreihenaggregation mit TimeGrouper von Pandas
Holen Sie sich mit Python Zeitreihendaten von k-db.com
So löschen Sie einen Taple in einer Liste (Python)
Verwendung der Python-Bildbibliothek in der Python3-Serie
Zusammenfassung der Kaggle-Kernel-Methode [Tabelle Zeitreihendaten]
So erstellen Sie eine JSON-Datei in Python
Eine clevere Möglichkeit zur Zeitverarbeitung mit Python
So implementieren Sie eine Verlaufsauswahl in Houdini
[Einführung in Python] Umgang mit Daten im JSON-Format
So erstellen Sie Daten für CNN (Chainer)
So benachrichtigen Sie Discord-Kanäle in Python
[Python] Wie zeichnet man mit Matplotlib ein Histogramm?
So erstellen Sie eine Rest-API in Django
Datenbereinigung Umgang mit fehlenden und Ausreißern
Wie schreibe ich ein benanntes Tupeldokument im Jahr 2020?
So zählen Sie Zahlen in einem bestimmten Bereich
Wie man mit dem Datum / Uhrzeit-Typ in Pythons SQLite3 umgeht
So lesen Sie Dateien in verschiedenen Verzeichnissen
Wie man eine öffentliche Funktion in Pytest verspottet
Extrahieren Sie Perioden, die einem bestimmten Muster entsprechen, aus den qualitativen Daten der Pandas-Zeitreihen
Der erste Schritt zur Protokollanalyse (Formatieren und Einfügen von Protokolldaten in Pandas)
So legen Sie das Schema in den Django-Datenbankeinstellungen fest
So konvertieren / wiederherstellen Sie einen String mit [] in Python
So wenden Sie mit matplotlib Marker nur auf bestimmte Daten an
Ich möchte einem Pandas-Datenrahmen eine group_id geben
So messen Sie die Verarbeitungszeit mit Python oder Java
Wie man Pferderenndaten mit pandas read_html kratzt
So konvertieren Sie horizontal gehaltene Daten mit Pandas in vertikal gehaltene Daten