web-dev-qa-db-fra.com

pandas fenêtre déroulante et index datetime: que signifie «décalage»?

La fonction de fenêtre déroulante pandas.DataFrame.rolling sur pandas 0,22 prend un argument window qui est décrit comme suit:

fenêtre : int ou offset

Taille de la fenêtre mobile. Il s'agit du nombre d'observations utilisées pour calculer la statistique. Chaque fenêtre aura une taille fixe.

Si c'est un décalage, ce sera la période de temps de chaque fenêtre. Chaque fenêtre sera de taille variable en fonction des observations incluses dans la période. Ceci n'est valable que pour les index datetimelike. C'est nouveau dans 0.19.0

Qu'est-ce qu'un offset dans ce contexte?

9
ascripter

En bref, si vous utilisez un offset comme "2d" (2 jours), pandas utilisera les informations datetime dans l'index (si disponible), ce qui pourrait potentiellement représenter tout lignes manquantes ou fréquences irrégulières. Mais si vous utilisez un simple int comme 2, alors pandas traitera l'index comme un simple indice entier [0,1,2, .. .] et ignorer toutes les informations datetime de l'index.

Un exemple simple devrait clarifier ceci:

df=pd.DataFrame({'x':range(4)}, 
    index=pd.to_datetime(['1-1-2018','1-2-2018','1-4-2018','1-5-2018']))

            x
2018-01-01  0
2018-01-02  1
2018-01-04  2
2018-01-05  3

Notez que (1) l'index est un datetime, mais aussi (2) il manque '2018-01-03'. Donc, si vous utilisez un entier simple comme 2, rolling ne fera que regarder les deux dernières lignes, quelle que soit la valeur datetime (dans un sens, il se comporte comme iloc[i-1:i]i est la ligne courante):

df.rolling(2).count()

              x
2018-01-01  1.0
2018-01-02  2.0
2018-01-04  2.0
2018-01-05  2.0

Inversement, si vous utilisez un décalage de 2 jours ('2d'), rolling utilisera les valeurs datetime réelles et rend compte de toute irrégularité dans l'index datetime.

df.rolling('2d').count()

              x
2018-01-01  1.0
2018-01-02  2.0
2018-01-04  1.0
2018-01-05  2.0

Notez également que vous devez trier l'index dans l'ordre croissant lorsque vous utilisez un décalage de date, mais cela n'a pas d'importance lorsque vous utilisez un simple entier (puisque vous ignorez tout simplement l'index de toute façon).

11
JohnE