Ich habe eine große pandas
Datenframe df
mit Lager Daten zeigt Mengen der empfangenen Artikel.Pandas - Aggregat Teil der Spalte auf neuen Wert in der neuen Spalte
Stellen Sie sich den entsprechenden Teil der Struktur als:
Date SKU received
2017-05-29 sku1 0
2017-05-30 sku1 0
2017-05-31 sku1 0
2017-06-01 sku1 0
2017-06-02 sku1 6
2017-06-03 sku1 2
2017-05-29 sku2 4
2017-05-30 sku2 4
2017-05-31 sku2 0
2017-06-01 sku2 0
2017-06-02 sku2 0
2017-06-03 sku2 24
Von hier würde ich den Bestellprozess rekonstruieren möchte. Ich weiß, dass der Lagerbestand an Montagen überprüft wird, basierend auf dem Lagerbestand werden neue Aufträge platziert. Etwa eine Woche später kommen die Bestellungen im Lager an, manchmal aufgeteilt in mehrere Lieferungen.
Ich dachte an das Erstellen einer zusätzlichen Spalte für die Wochentage (df["Weekday"]
) und für die erteilten Bestellungen (df["Order"]
). Basierend auf dem Wochentag möchte ich die Daten der Spalte "Received" für die nächsten 4 bis 11 Tage aggregieren, beschränkt auf die entsprechende SKU.
Die Ausgabe könnte wie folgt aussehen:
Date SKU received Weekday Order
2017-05-29 sku1 0 0 8
2017-05-30 sku1 0 1 0
2017-05-31 sku1 0 2 0
2017-06-01 sku1 0 3 0
2017-06-02 sku1 6 4 0
2017-06-03 sku1 2 5 0
2017-05-29 sku2 4 0 24
2017-05-30 sku2 4 1 0
2017-05-31 sku2 0 2 0
2017-06-01 sku2 0 3 0
2017-06-02 sku2 0 4 0
2017-06-03 sku2 24 5 0
Hier ist der Code, den ich versuchte:
import pandas as pd
# 0 is Monday, 1 is Tuesday, etc
df["Weekday"] = df["Date"].dt.dayofweek
# create new column for the orders
df["Order"] = 0
min_days = 4
max_days = min_days + 7
for i in range(len(df)):
if df.loc[i, "Weekday"] == 0:
df.loc[i, "Order"] = df.loc[(df.Date >= df.loc[i, "Date"] + pd.to_timedelta(min_days, unit="D")) &
(df.Date < df.loc[i, "Date"] + pd.to_timedelta(max_days, unit="D")) &
(df.SKU == df.loc[i, "SKU"]), "received"].sum()
Es scheint, die Arbeit zu tun, aber in einer langsamen Art und Weise. Vielleicht kann mir jemand helfen, einen Python/Pandas-Ansatz zu finden, um Rechenzeit zu sparen.
Danke für Ihre Hilfe.
dank @FLab. Mein 'df' ist in der Tat ein bisschen größer und hat mehr Spalten,' Date' ist nicht der Index, weshalb ich Schwierigkeiten habe, den Code 'y.index.dayofweek == 0' auszuführen. – Axel
Anpassung des Codes an 'count_between (x.received, min_days, max_days)' und '.where (lambda y: y.Date.dayofweek == 0' hilft nicht. Fehle ich etwas? – Axel
Oh, ja, sollte haben erwähnt, dass ich Datum als Index gesetzt habe.Kann man nicht auf einer Teilmenge des Datenrahmens operieren, die aussieht wie das gemeldete Beispiel? In der Zwischenzeit denke ich an eine Lösung – FLab