Python: décompte des heures glissantes des variables catégorielles

Oct 04 2020

J'ai un dataframe pandas avec des colonnes ['DateTime', 'Variable'], et j'essaie d'obtenir un décompte glissant dans la dernière heure pour chacun Variable. Le pivot de pensée pourrait être utilisé d'une manière ou d'une autre.

Exemple de données

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

Production attendue

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

De nouvelles variables peuvent être ajoutées ou supprimées, j'aimerais donc avoir une solution dynamique.

Réponses

RichieV Oct 04 2020 at 02:47

Vous pourriez en fait commencer par pivot, ou le faire à la main avec groupby.unstack.

Ensuite, vous cherchez df.rollingà créer des fenêtres déroulantes qui peuvent être agrégées avec de nombreuses fonctions. Pour que les fenêtres soient créées avec un temporisateur (1 heure dans ce cas), vous devez vous assurer que l'index est de datetimetype.

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()

Production

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
PrakritiShaurya Oct 04 2020 at 02:01

Considérant que df est votre ensemble de données: new_df = df [df ['Variable'] == 'A']. Resample ('H'). Count ()

Vous pouvez créer un nouveau dataframe comme suit: final_df = pd.DataFrame ({'DateTime': new_df.index, 'A': new_df.values})

De même, prenez le décompte de chaque catégorie de la colonne Variable et essayez de le concater avec la boucle final_df using.

Je ne l'ai pas essayé mais j'espère que cela fonctionnerait.