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.
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
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
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