2017-08-02 7 views
1

Je donne les résultats suivants df de valeurs pour différentes tranches à travers le temps:Comment puis-je calculer les changements hebdomadaires dans les pandas?

date  A B C 
0 2016-01-01 5 7 2 
1 2016-01-02 6 12 15 
... 
2 2016-01-08 9 5 16 
... 
3 2016-12-24 5 11 13 
4 2016-12-31 3 52 22 

Je voudrais créer une nouvelle trame de données qui calcule le changement w-w dans chaque tranche, par date. Par exemple, je veux que la nouvelle table soit vide pour toutes les tranches de jan 1 - jan 7. Je veux que la valeur de jan 8 soit la valeur de jan 8 pour la tranche donnée moins la valeur de jan 1 de cette tranche. Je veux alors que la valeur de jan 9 soit la valeur de jan 9 pour la tranche donnée moins la valeur de la tranche de jan 2. Et ainsi de suite, tout le long.

Le tableau exemple ressemblerait à ceci:

date  A B C 
0 2016-01-01 0 0 0 
1 2016-01-02 0 0 0 
... 
2 2016-01-08 4 -2 14 
... 
3 2016-12-24 4 12 2 
4 2016-12-31 -2 41 9 

Vous peut supposer le décalage est toujours 7. En d'autres termes, il n'y a pas de dates manquantes.

+1

pouvez-vous vous restructurer des trames de données comme ils sont dans la console python? – DJK

+0

@ djk47463 - tous ensemble. –

Répondre

1

Si nous savons compensons est toujours 7 puis utilisez shift(), voici un exemple rapide montrant comment cela fonctionne:

df = pandas.DataFrame({'x': range(30)}) 
df.shift(7) 
     x 
0 NaN 
1 NaN 
2 NaN 
3 NaN 
4 NaN 
5 NaN 
6 NaN 
7 0.0 
8 1.0 
9 2.0 
10 3.0 
11 4.0 
12 5.0 
... 

Donc, avec cela, vous pouvez faire:

df - df.shift(7) 
     x 
0 NaN 
1 NaN 
2 NaN 
3 NaN 
4 NaN 
5 NaN 
6 NaN 
7 7.0 
8 7.0 
... 

Dans votre cas, ne pas oublier de set_index('date') avant.

1

@ La réponse de Unatiel est correcte dans ce cas, où il n'y a aucune date manquante, et devrait être acceptée.

Mais je voulais poster une modification ici pour les cas avec des dates manquantes, pour toute personne intéressée. De l'docs:

La méthode shift accepte un argument freq qui peut accepter une classe DateOffset ou autre timedelta -comme objet ou encore un alias décalage

from pandas.tseries.offsets import Week 
res = ((df - df.shift(1, freq=Week()).reindex(df.index)) 
     .fillna(value=0) 
     .astype(int)) 

print(res) 
      A B 
date    
2016-01-01 0 0 
2016-01-02 0 0 
2016-01-03 0 0 
2016-01-04 0 0 
2016-01-05 0 0 
2016-01-06 0 0 
2016-01-07 0 0 
2016-01-08 31 46 
2016-01-09 4 20 
2016-01-10 -51 -65 
2016-01-11 56 5 
2016-01-12 -51 24 
     .. .. 
2016-01-20 34 -30 
2016-01-21 -28 19 
2016-01-22 24 8 
2016-01-23 -28 -46 
2016-01-24 -11 -60 
2016-01-25 -34 -7 
2016-01-26 -12 -28 
2016-01-27 -41 42 
2016-01-28 -2 48 
2016-01-29 35 -51 
2016-01-30 -8 62 
2016-01-31 -6 -9