Ich arbeite mit einem DataFrame, bei dem jeder Zeilenbeobachtung ein ordinales Datetime-Objekt zugeordnet ist. Ich habe eine Funktion geschrieben, dass ich schaut durch meine Datenrahmen glauben und identifiziert nacheinander auftretenden Tage und die Länge des Laufes dieser nacheinander auftretenden Tage mit dem folgenden Code:Identifizieren konsekutiver Sequenzen von Daten und Zählen ihrer Längen
def consecutiveCount(df):
df= df.copy()
cond1 = df['DATE_INT'].shift(-1) - df['DATE_INT'] == 1
cond2 = df['DATE_INT'].shift(1) - df['DATE_INT'] == -1
cond3 = df['DATE_INT'].shift(-2) - df['DATE_INT'] == 2
cond4 = df['DATE_INT'].shift(2) - df['DATE_INT'] == -2
Jetzt fahre ich fort, diese Bedingungen in der gleichen Art und Weise zu machen bis zu dem Punkt:
cond55 = df['DATE_INT'].shift(-28) - df['DATE_INT'] == 28
cond56 = df['DATE_INT'].shift(28) - df['DATE_INT'] == -28
cond57 = df['DATE_INT'].shift(-29) - df['DATE_INT'] == 29
cond58 = df['DATE_INT'].shift(29) - df['DATE_INT'] == -29
I dann um die Länge des 'Run' von Tagen in einer Spaltenvariable schreiben mit dem folgenden Code:
df.loc[cond1 | cond2, 'CONSECUTIVE_COUNT'] = 2
df.loc[cond3 | cond4, 'CONSECUTIVE_COUNT'] = 3
wieder ich weiter, bis ich ‚läuft‘ der Tage der Länge 30.
df.loc[cond55 | cond56, 'CONSECUTIVE_COUNT'] = 29
df.loc[cond57 | cond58, 'CONSECUTIVE_COUNT'] = 30
Schließlich wende ich die Funktion auf bestimmte Gruppen von meiner Datenrahmen wie folgt erreichen:
df1 = df.groupby(['COUNTY_GEOID_YEAR','TEMPBIN']).apply(consecutiveCount)
Ich bin sicher, dass es viel sind effizientere Möglichkeiten, diesen Code zu schreiben. Ich habe den Flaschenhals in meinem Skript identifiziert, wenn ich die Funktion durch Drucken verschiedener Strings in meinem Skript anwende.
Jede Hilfe beim Schreiben der Funktion auf eine effizientere Art und Weise oder wie man die Anwendung beschleunigt, wäre großartig! Bitte lassen Sie mich wissen, wenn ich weitere Informationen zur Verfügung stellen kann.
EDIT: Wie @DSM wies darauf hin, dass mein Code nicht genau die Länge der aufeinanderfolgenden Läufe von Tagen richtig zählt. Seine Lösung hat so genau für mich gemacht!
Ihr aktueller Code scheint so zu sein, als würde es bedeuten, dass eine DATE_INT-Spalte von [1,2,3,4] (für die gleiche COUNTY_GEOID_YEAR und TEMPBIN) aufeinanderfolgende Zählungen von [4,3,3,4] hätte. Ich bin mir nicht sicher, ob ich die Logik dort verstehe. – DSM
oh - du hast recht, danke, dass du das gezeigt hast. Das ist nicht was ich will - ich werde versuchen, Ihre Lösung unten zu implementieren. – Justin