[PYTHON] [Analyse du cours de l'action] Apprentissage des pandas moyens Nikkei (005: Regroupement par année / année-confirmation des informations statistiques)

De la suite de la dernière fois (jusqu'au graphique en chandeliers (pseudonyme))

La dernière fois, j'ai pensé à modifier le graphique en chandeliers et à l'éditer, mais je voulais résumer les fonctions de groupby avant cela, donc je vais d'abord écrire cet article.

Programmer jusqu'à la dernière fois (republier)

Study_Code.py


import pandas as pd
import logging
#[Analyse du cours de l'action] Apprentissage des pandas avec des données fictives(003)Ajouter plus
from pandas import Series, DataFrame
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from mpl_finance import candlestick_ohlc

#Spécifiez le format du journal
# %(asctime)s :Une représentation lisible par l'homme de l'heure à laquelle le LogRecord a été généré.
# %(funcName)s :Le nom de la fonction qui contient l'appel de journalisation
# %(levelname)s :Niveau de journalisation des caractères pour les messages
# %(lineno)d :Numéro de la ligne source sur laquelle l'appel de journalisation a été émis
# %(message)s : msg %Message de journal demandé en tant qu'args
fomatter = logging.Formatter('%(asctime)s:%(funcName)s:%(levelname)s:%(lineno)d:\n%(message)s')

#Paramètres de l'enregistreur(Niveau de journalisation INFO)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

#Paramètres du gestionnaire(Modifier le fichier de sortie/Réglage du niveau de journal/Paramètres de format de journal)
handler = logging.FileHandler('info_log.log')
handler.setLevel(logging.INFO)
handler.setFormatter(fomatter)

logger.addHandler(handler)

#Fichier CSV(SampleStock01.csv)Spécifiez le code de caractère de
dframe = pd.read_csv('NikkeiAverage.csv', encoding='SJIS', \
	header=1, sep='\t')

#Convertir en type de date
dframe['Date'] = pd.to_datetime(dframe['Date'])
#Spécifiez une colonne de date comme index
dframe = dframe.set_index('Date')

#Convertir le prix d'ouverture en prix de clôture en valeur numérique
dframe =  dframe.apply(lambda x: x.str.replace(',','')).astype(np.float32)

#Changer pour utiliser l'enregistreur
logger.info(dframe)
#Index de sortie
logger.info(dframe.columns)
#Sortie uniquement des prix d'ouverture et de fermeture
logger.info(dframe[['Prix ouvert','le dernier prix']])
#Vérification de l'index
logger.info(dframe.index)
#Confirmation de type
logger.info(dframe.dtypes)


#Création de données pour le traçage
ohlc = zip(mdates.date2num(dframe.index), dframe['Prix ouvert'], dframe['le dernier prix'], dframe['Prix élevé'], dframe['le dernier prix'])
logger.info(ohlc)

#Créer un campus
fig = plt.figure()

#Formater l'axe X
ax = plt.subplot()
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y/%m/%d'))

#Dessinez un graphique en chandeliers
candlestick_ohlc(ax, ohlc, width=0.7, colorup='g', colordown='r')

#Enregistrer l'image
plt.savefig('Candle_Chart.png')

Regrouper par année / année

Le programme jusqu'à la dernière fois a traité des données pendant 4 ans de 2016 à 2019 à la fois, mais comme l'index a été fait de type date, cette fois

  1. Données 2016

  2. Données 2017

  3. Données 2018

  4. Données 2019 Et chaque année encore

  5. Données de janvier 2016

  6. Données pour février 2016

  7. Données pour mars 2016 ︙

  8. Données d'octobre 2019

  9. Données pour novembre 2019

J'essaierai de regrouper par année et par mois.

De plus, comme l'article est un peu déroutant, je voudrais ne décrire que les points de cet article et décrire l'ensemble du programme dans le dernier chapitre.

Extraire les informations année / année / mois de l'indice de confirmation

Tout d'abord, vérifiez les informations d'année de l'index avec le code source suivant.

Conf_Code.py


logger.info(dframe.index.year)

Résultat d'exécution

info_log


2019-11-12 21:40:26,133:<module>:INFO:42:
Int64Index([2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016,
            ...
            2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019],
           dtype='int64', name='Date', length=942)

Ensuite, vérifions les informations de date de l'index.

Conf_Code.py


logger.info([dframe.index.year, dframe.index.month])

Résultat d'exécution

info_log


2019-11-12 22:12:26,052:<module>:INFO:42:
[Int64Index([2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016,
            ...
            2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019],
           dtype='int64', name='Date', length=942), Int64Index([ 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
            ...
            10, 10, 10, 10, 10, 11, 11, 11, 11, 11],
           dtype='int64', name='Date', length=942)]

Regroupement par année

Conf_Code.py


for Conf_DF in dframe.groupby([dframe.index.year]) :
	logger.info(Conf_DF)

Résultat d'exécution

info_log


2019-11-12 21:49:34,031:<module>:INFO:44:
(2016,Prix ouvert Prix élevé Prix bas Prix de clôture
Date
2016-01-04  18818.580078  18951.119141  18394.429688  18450.980469
2016-01-05  18398.759766  18547.380859  18327.519531  18374.000000
2016-01-06  18410.570312  18469.380859  18064.300781  18191.320312
2016-01-07  18139.769531  18172.039062  17767.339844  17767.339844
2016-01-08  17562.230469  17975.310547  17509.640625  17697.960938
...                  ...           ...           ...           ...
2016-12-26  19394.410156  19432.480469  19385.939453  19396.640625
2016-12-27  19353.429688  19478.580078  19352.060547  19403.060547
2016-12-28  19392.109375  19442.130859  19364.730469  19401.720703
2016-12-29  19301.039062  19301.039062  19092.220703  19145.140625
2016-12-30  18997.679688  19176.810547  18991.589844  19114.369141

[245 rows x 4 columns])
2019-11-12 21:49:34,051:<module>:INFO:44:
(2017,Prix ouvert Prix élevé Prix bas Prix de clôture
Date
2017-01-04  19298.679688  19594.160156  19277.929688  19594.160156
2017-01-05  19602.099609  19615.400391  19473.279297  19520.689453
2017-01-06  19393.550781  19472.369141  19354.439453  19454.330078
2017-01-10  19414.830078  19484.900391  19255.349609  19301.439453
2017-01-11  19358.640625  19402.169922  19325.460938  19364.669922
...                  ...           ...           ...           ...
2017-12-25  22909.410156  22948.830078  22870.189453  22939.179688
2017-12-26  22922.949219  22950.150391  22877.630859  22892.689453
2017-12-27  22854.390625  22936.160156  22854.390625  22911.210938
2017-12-28  22912.050781  22954.449219  22736.429688  22783.980469
2017-12-29  22831.490234  22881.210938  22753.199219  22764.939453

[247 rows x 4 columns])
2019-11-12 21:49:34,069:<module>:INFO:44:
(2018,Prix ouvert Prix élevé Prix bas Prix de clôture
Date
2018-01-04  23073.730469  23506.330078  23065.199219  23506.330078
2018-01-05  23643.000000  23730.470703  23520.519531  23714.529297
2018-01-09  23948.970703  23952.609375  23789.029297  23849.990234
2018-01-10  23832.810547  23864.759766  23755.449219  23788.199219
2018-01-11  23656.390625  23734.970703  23601.839844  23710.429688
...                  ...           ...           ...           ...
2018-12-21  20310.500000  20334.730469  20006.669922  20166.189453
2018-12-25  19785.429688  19785.429688  19117.960938  19155.740234
2018-12-26  19302.589844  19530.349609  18948.580078  19327.060547
2018-12-27  19706.189453  20211.570312  19701.759766  20077.619141
2018-12-28  19957.880859  20084.380859  19900.039062  20014.769531

[245 rows x 4 columns])
2019-11-12 21:49:34,088:<module>:INFO:44:
(2019,Prix ouvert Prix élevé Prix bas Prix de clôture
Date
2019-01-04  19655.130859  19692.580078  19241.369141  19561.960938
2019-01-07  19944.609375  20266.220703  19920.800781  20038.970703
2019-01-08  20224.669922  20347.919922  20106.359375  20204.039062
2019-01-09  20366.300781  20494.349609  20331.199219  20427.060547
2019-01-10  20270.880859  20345.919922  20101.929688  20163.800781
...                  ...           ...           ...           ...
2019-11-01  22730.490234  22852.720703  22705.599609  22850.769531
2019-11-05  23118.789062  23328.519531  23090.939453  23251.990234
2019-11-06  23343.509766  23352.560547  23246.570312  23303.820312
2019-11-07  23283.140625  23336.000000  23253.320312  23330.320312
2019-11-08  23550.039062  23591.089844  23313.410156  23391.869141

[205 rows x 4 columns])

Si vous groupez par ** dframe.groupby ([dframe.index.year]) **

  1. 2016 est [245 lignes x 4 colonnes]
  2. 2017 correspond à [247 lignes x 4 colonnes]
  3. 2018 est [245 lignes x 4 colonnes]
  4. 2019 est [205 lignes x 4 colonnes]

J'ai pu extraire les données normalement.

Avant le regroupement, il était de [942 lignes x 4 colonnes], vous pouvez donc voir les changements. Je suis juste un peu inquiet Les données de la source de lecture sont 2019/11/8 23,550.04 23,591.09 23,313.41 23,391.87 La valeur stockée dans le bloc de données est 2019-11-08 23550.039062 23591.089844 23313.410156 23391.869141 C'était (tous les autres jours), donc probablement

dframe =  dframe.apply(lambda x: x.str.replace(',','')).astype(np.float32)

Il semble que ** les deuxièmes chiffres et les chiffres inférieurs après la virgule décimale ne soient pas correctement convertis </ font> ** lors de la conversion avec.

Pour être honnête, à partir du 12 novembre 2019, je ne ressens pas le besoin de m'inquiéter des chiffres après la virgule décimale dans l'analyse des actions, je vais donc l'ignorer, mais lorsque je fais des calculs scientifiques, j'ai l'impression de souffrir du problème des erreurs d'arrondi ...

Regroupement par année

Conf_Code.py


for Conf_DF in dframe.groupby([dframe.index.year, dframe.index.month]) :
	logger.info(Conf_DF)

Résultat d'exécution

info_log


(Omission)
2019-11-12 22:05:00,120:<module>:INFO:45:
((2019, 11),Prix ouvert Prix élevé Prix bas Prix de clôture
Date
2019-11-01  22730.490234  22852.720703  22705.599609  22850.769531
2019-11-05  23118.789062  23328.519531  23090.939453  23251.990234
2019-11-06  23343.509766  23352.560547  23246.570312  23303.820312
2019-11-07  23283.140625  23336.000000  23253.320312  23330.320312
2019-11-08  23550.039062  23591.089844  23313.410156  23391.869141)

Il y a encore des déchets à la deuxième place après la virgule décimale, mais ...

Vérifier les statistiques mensuelles

Puisque nous avons pu diviser chaque mois dans le chapitre précédent, vérifions les informations statistiques pour chaque mois.

Conf_Code.py


def Output_Describe(temp_DF) :
	logger.info(temp_DF.index)
	logger.info(temp_DF.describe())

dframe.groupby([dframe.index.year, dframe.index.month]).apply(Output_Describe)

Résultat d'exécution

info_log


(Omission)
2019-11-12 22:25:51,012:Output_Describe:INFO:43:
DatetimeIndex(['2019-10-01', '2019-10-02', '2019-10-03', '2019-10-04',
               '2019-10-07', '2019-10-08', '2019-10-09', '2019-10-10',
               '2019-10-11', '2019-10-15', '2019-10-16', '2019-10-17',
               '2019-10-18', '2019-10-21', '2019-10-23', '2019-10-24',
               '2019-10-25', '2019-10-28', '2019-10-29', '2019-10-30',
               '2019-10-31'],
              dtype='datetime64[ns]', name='Date', freq=None)
2019-11-12 22:25:51,043:Output_Describe:INFO:44:
Prix ouvert Prix élevé Prix bas Prix de clôture
count     21.000000     21.000000     21.000000     21.000000
mean   22173.896484  22250.916016  22117.458984  22197.476562
std      610.297974    598.321411    619.635559    591.679626
min    21316.179688  21410.199219  21276.009766  21341.740234
25%    21494.480469  21629.240234  21483.179688  21587.779297
50%    22451.150391  22522.390625  22424.919922  22451.859375
75%    22725.439453  22780.990234  22704.330078  22750.599609
max    22953.169922  23008.429688  22935.349609  22974.130859
(Omission)

Si vous vérifiez la colonne des cours de clôture sur la base des données d'octobre 2019,

  • Le nombre de données est de 21 jours
  • Le prix moyen du Nikkei moyen en octobre 2019 (déroutant) est de 22197,476562 yens au cours de clôture.
  • La distribution est 591.679626 --Le prix le moins cher (point 0%) est 21341.740234 yens
  • Le prix de 25% points dans la fourchette de prix d'octobre 2019 est 21587,779297 yens
  • Le prix de 25% points dans la fourchette de prix d'octobre 2019 est de 22451,859375 yens
  • Le prix de 25% points dans la fourchette de prix d'octobre 2019 est de 22750,599609 yens --Le prix le plus élevé (100% point) est 22974,130859 yens

Peut être confirmé.

J'écris (je suis désolé pour les articles à moitié finis alignés. Je vais le résumer jusqu'à la fin, mais si je ne l'écris pas quand je m'en souviendrai, je l'oublierai bientôt, alors ...)

Que signifie dispersion? Que se passe-t-il si cela est visualisé dans un graphique? Quel jour a été le moins cher de octobre 2019? Etc. Je voudrais le décrire dans les chapitres suivants.

Recommended Posts

[Analyse du cours de l'action] Apprentissage des pandas moyens Nikkei (005: Regroupement par année / année-confirmation des informations statistiques)
Tracez l'indice boursier moyen Nikkei avec des pandas
[Analyse du cours de l'action] pandas apprenant avec des données fictives (002: sortie log)
Le cours de l'action a chuté avec "nouvelle Corona"? J'ai essayé d'obtenir le cours moyen de l'action Nikkei par grattage Web
[Analyse du cours de l'action] Apprenez les pandas avec la moyenne Nikkei (004: Changer les données lues en moyenne Nikkei)
[Analyse du cours de l'action] pandas apprenant avec des données fictives (001: préparation de l'environnement à la lecture de fichiers)
[Analyse du cours de l'action] Apprentissage des pandas avec des données fictives (003: De l'arrangement de type au graphique en chandelier)
Comparez le retour nocturne et le retour diurne du cours moyen de l'action Nikkei avec Python
Pandas du débutant, par le débutant, pour le débutant [Python]