Python: Anzahl der rollierenden Stunden für kategoriale Variablen
Ich habe einen Pandas-Datenrahmen mit Spalten ['DateTime', 'Variable']und versuche, in der letzten Stunde jeweils eine fortlaufende Zählung zu erhalten Variable. Thinking Pivot könnte irgendwie verwendet werden.
Beispieldaten
DateTime Variable
8/24/19 3:30PM A
8/24/19 3:32PM A
8/24/19 3:36PM B
8/24/19 3:50PM C
8/25/19 2:50PM A
Erwartete Ausgabe
DateTime A B C
8/24/19 3:30PM 1 0 0
8/24/19 3:32PM 2 0 0
8/24/19 3:36PM 2 1 0
8/24/19 3:50PM 2 1 1
8/25/19 2:50PM 1 0 0
Neue Variablen können hinzugefügt oder entfernt werden, sodass ich eine dynamische Lösung haben möchte.
Antworten
Man könnte in der Tat beginnen mit pivot, oder es zu tun mit der Hand mit groupby.unstack.
Dann möchten Sie rollende Fensterdf.rolling erstellen , die mit vielen Funktionen zusammengefasst werden können. Damit die Fenster mit einem Zeitdelta (in diesem Fall 1 Stunde) erstellt werden können, müssen Sie sicherstellen, dass der Index vom Typ ist.datetime
df['DateTime'] = pd.to_datetime(df['DateTime'])
out = (
df
.groupby(['DateTime', 'Variable']) # set the columns as index
.size() # aggregate by row count
.unstack(fill_value=0) # move 'Variable' index level to columns
.sort_index()
)
out = out.rolling('1h').sum()
Ausgabe
Variable A B C
DateTime
2019-08-24 15:30:00 1.0 0.0 0.0
2019-08-24 15:32:00 2.0 0.0 0.0
2019-08-24 15:36:00 2.0 1.0 0.0
2019-08-24 15:50:00 2.0 1.0 1.0
2019-08-25 14:50:00 1.0 0.0 0.0
Unter Berücksichtigung von df ist Ihr Datensatz: new_df = df [df ['Variable'] == 'A']. Resample ('H'). Count ()
Sie können einen neuen Datenrahmen wie folgt erstellen: final_df = pd.DataFrame ({'DateTime': new_df.index, 'A': new_df.values})
Nehmen Sie in ähnlicher Weise die Anzahl für jede Kategorie der Variablenspalte und versuchen Sie, sie mit der Schleife final_df zu verknüpfen.
Ich habe es nicht versucht, aber hoffentlich würde es funktionieren.