Pandas Pivot Table: Spalten nach speziellem Intervall einteilen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Benutzeravatar
noisefloor
User
Beiträge: 4325
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ich bekomme etwas bei Pandas nicht hin bzw verstehe nicht, wie ich das anstellen soll.

Ich habe einen DateFrame (imporiert aus einer Excel-Datei aus einem ERP System, der u.a. Spalten für Produktgruppe, Umsatz und Datum hat. Die Daten sind zeilenbasiert, es kann mehrere Zeilen pro Produktgruppe und Datum geben.

Die Daten möchte ich pivotieren. Was auch keine Problem ist, wenn ich die Produktgruppe als Index, den Umsatz als `values`, die Aggregierung mit `sum` mache und als `columns` Monat und Jahr (aus dem Datum abgeleitet) nehme.

Jetzt sollen die Spalten aber nicht Jahr / Monats Intervalle sein, sondern ein etwas schräges Interval vom Samstag nach dem letzten Freitag des Vormonats bis zum letzten Freitag des aktuellen Monats sein. Das Berechnen der Intervalle ist kein Problem:

Code: Alles auswählen

def calc_periods(start_date, last_date):
    date_range = pd.date_range(start_date, last_date, freq='M')
    periods = date_range.where(date_range.weekday == 4, date_range - pd.offsets.Week(weekday=4))
    return periods
(Disclaimer: das basiert nicht auf meinen Pandas-Skills, findet man so bei SO.

Damit bekomme ich einen passenden DatetimeIndex. Soweit, so gut. Nur: ich habe keinen Plan, wie ich dem `columns` Argument von `pd.pivot_table` mitgebe, dass das die Datumsspalte des DataFrames für die Pivot Tabelle nach dem DatetimeIndex gruppiert wird. `columns` kann ein pd.Grouper Objekt als Argument bekommen - aber ich habe keine Ahnung, was ich pd.Grouper() als Argumente mitgeben muss, um das passende Grouper-Objekt zu bekommen.

Gruß, noisefloor
Benutzeravatar
noisefloor
User
Beiträge: 4325
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ich habe für mich hier jetzt folgenden Workaround genutzt, weil ich das mit dem Gruppieren auf dem angefragten Weg bis jetzt nicht hinbekommen habe:

Ich füge in den DataFrame eine Spalte "Periode" ein, wo basierend auf der Spalte "Datum" das Datum des letzten Freitags der Periode eingetragen wird. Das geht mit Pandas `map`:

Code: Alles auswählen

df['Periode'] = df['Versanddatum'].map(_get_last_day_of_period)
`_get_last_day_of_period` ist die Funktion, die ein Datum als Argument nimmt und dann den letzten Freitag der Periode zurückliefert. Mit der Spalte "Periode" kann man dann wieder pivotieren.

Gruß, noisefloor
Antworten