web-dev-qa-db-fra.com

Comment soustraire la ligne précédente de la ligne actuelle dans un cadre de données pandas et l'appliquer à chaque ligne; sans utiliser de boucle?

J'utilise Python3.5 et je travaille avec des pandas. J'ai chargé les données boursières de Yahoo Finance et j'ai enregistré les fichiers au format CSV. Mes DataFrames chargent ces données depuis le csv. Ceci est une copie des dix lignes du fichier csv qui est mon DataFrame

  Date       Open       High      Low     Close    Volume   Adj Close  
1990-04-12  26.875000  26.875000  26.625  26.625      6100  250.576036
1990-04-16  26.500000  26.750000  26.375  26.750       500  251.752449
1990-04-17  26.750000  26.875000  26.750  26.875      2300  252.928863
1990-04-18  26.875000  26.875000  26.500  26.625      3500  250.576036
1990-04-19  26.500000  26.750000  26.500  26.750       700  251.752449
1990-04-20  26.750000  26.875000  26.750  26.875      2100  252.928863
1990-04-23  26.875000  26.875000  26.750  26.875       700  252.928863
1990-04-24  27.000000  27.000000  26.000  26.000      2400  244.693970
1990-04-25  25.250000  25.250000  24.875  25.125      9300  236.459076
1990-04-26  25.000000  25.250000  24.750  25.000      1200  235.282663

Je sais que je peux utiliser iloc, loc, ix mais ces valeurs que j'indexe ne donneront que mes lignes et colonnes spécifiques et n'effectueront pas l'opération sur chaque ligne. Par exemple: la ligne une des données de la colonne ouverte a une valeur de 26,875 et la ligne en dessous a 26,50. Le prix a chuté de .375 cents. Je veux pouvoir capturer le% d'augmentation ou de diminution de la veille, donc pour terminer cet exemple .375 divisé par 26.875 = diminution de 1,4% d'un jour à l'autre. Je veux pouvoir exécuter ce calcul sur chaque ligne, donc je sais combien il a augmenté ou diminué par rapport à la veille. Les fonctions d'index que j'ai essayées mais elles sont absolues, et je ne veux pas utiliser de boucle. Existe-t-il un moyen de le faire avec la fonction ix, iloc, loc ou une autre fonction?

13
ZacAttack

vous pouvez utiliser les méthodes pct_change () ou/et diff ()

Démo:

In [138]: df.Close.pct_change() * 100
Out[138]:
0         NaN
1    0.469484
2    0.467290
3   -0.930233
4    0.469484
5    0.467290
6    0.000000
7   -3.255814
8   -3.365385
9   -0.497512
Name: Close, dtype: float64

In [139]: df.Close.diff()
Out[139]:
0      NaN
1    0.125
2    0.125
3   -0.250
4    0.125
5    0.125
6    0.000
7   -0.875
8   -0.875
9   -0.125
Name: Close, dtype: float64
29
MaxU

Les solutions MaxU conviennent à votre cas. Si vous souhaitez effectuer des calculs plus complexes sur la base de vos lignes précédentes, vous devez utiliser shift

0
vozman