2 votes

Changement en pourcentage sur une série temporelle dans pandas

Je suis nouveau dans Python et j'apprends en faisant quelques analyses de données boursières de base. Ci-dessous se trouve le dataframe que j'utilise

                      date      open      high  ...       close  volume 
0      2010-01-05 09:16:00   5282.00   5283.10  ...   5281.10  94700    NaN
1      2010-01-05 12:16:00   5281.60   5281.60  ...   5278.30  49100    NaN
2      2010-01-05 16:16:00   5278.50   5280.50  ...   5278.80  62550    NaN
3      2010-01-06 09:16:00   5278.80   5279.45  ...   5277.30  64850    NaN
4      2010-01-06 12:16:00   5277.95   5278.00  ...   5276.00  65251    NaN

Comme vous pouvez le constater, c'est une série temporelle où il y a différents intervalles de temps dans une journée. Je veux donc trouver le taux de variation (variation en pourcentage) de l'ouverture de 2010-01-06 09:16:00 par rapport à la clôture de 2010-01-05 16:16:00. comment pourrais-je le calculer?

Voici le type de sortie que je recherche:

                      date      open      high  ...       close  volume %change
0      2010-01-05 09:16:00   5282.00   5283.10  ...   5281.10  94700    
1      2010-01-05 12:16:00   5281.60   5281.60  ...   5278.30  49100    
2      2010-01-05 16:16:00   5278.50   5280.50  ...   5278.80*  62550    
3      2010-01-06 09:16:00   5278.80*   5279.45  ...   5277.30  64850    0
4      2010-01-06 12:16:00   5277.95   5278.00  ...   5276.00  65251    

La colonne %change a 0 pour la clôture de 2010-01-05 à l'ouverture de 2010-01-05 9:16 car l'ouverture = clôture (5278.80 == 5278.80) (marqué par *).

Note : J'ai manipulé un peu les données car je travaillais dessus. Voici les codes:

import pandas as pd
import datetime

df = pd.read_csv(r'C:\Users\Admin\Desktop\Python files\nifty.txt' , sep = ';' , names = ["dates","open","high","low","close","volume"])
## formation de la date et de l'heure
df['dates'] = pd.to_datetime(df['dates'].astype(str) , format='%Y%m%d %H%M%S' )
## division de la colonne datetime en date et heure
df['date'] = [d.date() for d in df['dates']]
df['time'] = [d.time() for d in df['dates']]

Le dataframe actuel ressemble à ceci:

                     dates      open      high  ...  volume        date      time
0      2010-01-05 09:16:00   5282.00   5283.10  ...   94700  2010-01-05  09:16:00
1      2010-01-05 12:16:00   5281.60   5281.60  ...   49100  2010-01-05  12:16:00
2      2010-01-05 16:16:00   5278.50   5280.50  ...   62550  2010-01-05  16:16:00
3      2010-01-06 09:16:00   5278.80   5279.45  ...   64850  2010-01-05  09:16:00
4      2010-01-06 12:16:00   5277.95   5278.00  ...   65251  2010-01-05  12:16:00

3voto

Valdi_Bo Points 5795

Pandas a une fonction pct_change, mais elle calcule le changement en pourcentage entre les éléments consécutifs d'une Series source, ou pour chaque colonne de type numérique dans un DataFrame source.

Donc dans votre cas, c'est inutile, et vous avez besoin d'une approche différente:

  1. La première étape est de trouver l'ouverture initiale et la clôture finale de chaque jour:

     jours = df.groupby(df.date.dt.date).agg({'open': 'first', 'close': 'last'})
  2. Ensuite, calculez le changement en pourcentage:

     100 * (jours.open - jours.close.shift()) / jours.open

Détails:

  • jours.open - l'ouverture la plus ancienne du jour en cours.
  • jours.close.shift() - la fermeture la plus récente du jour précédent.
  • 100 * ... - pour exprimer le résultat en pourcentage.

La deuxième étape consiste à "joindre" ces données avec le DataFrame d'origine (créez une nouvelle colonne):

  1. Définissez une fonction calculant la colonne %change pour un groupe de lignes pour un jour particulier:

     def pctChg(grp):
         rv = pd.Series('', index=grp.index)
         chg = jours.pct.asof(grp.iloc[0, 0])
         if pd.notnull(chg): rv.iloc[0] = chg
         return rv
  2. Ensuite, créez la nouvelle colonne:

     df['%change'] = df.groupby(df.date.dt.date)\
         .apply(pctChg).reset_index(level=0, drop=True)

2voto

Shubham Sharma Points 39381

Utilisation:

df['dates'] = pd.to_datetime(df['dates'])
close = df['close'].shift()
df['% changement'] = np.where(
    df['date'].dt.day.diff().gt(0), ((df['open'] - close) / close) * 100, '')

Résultat:

# print(df)
                 date     open     high   close  volume % change
0 2010-01-05 09:16:00  5282.00  5283.10  5281.1   94700         
1 2010-01-05 12:16:00  5281.60  5281.60  5278.3   49100         
2 2010-01-05 16:16:00  5278.50  5280.50  5278.8   62550         
3 2010-01-06 09:16:00  5278.80  5279.45  5277.3   64850      0.0
4 2010-01-06 12:16:00  5277.95  5278.00  5276.0   65251

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X