[PYTHON] Comment utiliser Pandas Rolling

Pour avoir une idée approximative des tendances des données qui fluctuent en détail, telles que les cours des actions et le nombre de nouveaux patients positifs pour les coronavirus, prenez la moyenne en incluant les chiffres avant et après un certain moment. Prenez note du roulement, une fonction Pandas qui fait cela.

Utilisation normale

import pandas as pd

Tout d'abord, pour confirmer l'opération de base du laminage, créez une série avec 10 1 et nommez-la.

ones = pd.Series([1] * 10)
ones
0    1
1    1
2    1
3    1
4    1
5    1
6    1
7    1
8    1
9    1
dtype: int64

Utilisez le roulement pour en ajouter quatre à la fois. Bien sûr, le résultat est une colonne de 4, car vous ajoutez simplement les nombres 1 par quatre. Cependant, le résultat des quatre premières données manquantes est NaN. J'ai répertorié sum-4 suite à l'ajout de ceux-ci pour comparaison avec la colonne d'origine.

De cette façon, spécifiez le nombre de données (largeur de la fenêtre) à agréger dans la fenêtre. C'est une image de quatre fenêtres se déplaçant du début à la fin et comptant. Les résultats agrégés sont enregistrés à la fin de la fenêtre, de sorte que les trois premières valeurs de sum-4 sont NaN.

pd.DataFrame({
    'ones': ones,
    'sum-4': ones.rolling(window=4).sum(),
})
ones sum-4
0 1 NaN
1 1 NaN
2 1 NaN
3 1 4.0
4 1 4.0
5 1 4.0
6 1 4.0
7 1 4.0
8 1 4.0
9 1 4.0

Si center = True est spécifié, le résultat agrégé peut être enregistré au centre au lieu d'être enregistré à la fin de la fenêtre. Organisons cela comme un centre de somme. Lorsque la fenêtre est égale, enregistrez après le centre. Maintenant, le dernier élément est NaN.

pd.DataFrame({
    'ones': ones,
    'sum-4': ones.rolling(window=4).sum(),
    'sum-center': ones.rolling(window=4, center=True).sum(),
})
ones sum-4 sum-center
0 1 NaN NaN
1 1 NaN NaN
2 1 NaN 4.0
3 1 4.0 4.0
4 1 4.0 4.0
5 1 4.0 4.0
6 1 4.0 4.0
7 1 4.0 4.0
8 1 4.0 4.0
9 1 4.0 NaN

Par défaut, la partie des données qui n'est pas assez large n'est pas agrégée. Cependant, si vous spécifiez min_periods, il sera agrégé s'il y a au moins min_periods. Dans cet exemple, min_period = 2 est spécifié, le résultat apparaîtra donc à partir de la deuxième ligne.

pd.DataFrame({
    'ones': ones,
    'sum-4': ones.rolling(4).sum(),
    'min-periods': ones.rolling(window=4, min_periods=2).sum(),
})
ones sum-4 min-periods
0 1 NaN NaN
1 1 NaN 2.0
2 1 NaN 3.0
3 1 4.0 4.0
4 1 4.0 4.0
5 1 4.0 4.0
6 1 4.0 4.0
7 1 4.0 4.0
8 1 4.0 4.0
9 1 4.0 4.0

Jusqu'à présent, tous les éléments de la fenêtre sont utilisés pour l'agrégation, mais il semble que le poids de la valeur agrégée puisse être changé en utilisant win_type. Nécessite une installation scipy.

pd.DataFrame({
    'ones': ones,
    'sum-4': ones.rolling(4).sum(),
    'win_type': ones.rolling(window=4, win_type='nuttall').sum(),
})
ones sum-4 win_type
0 1 NaN NaN
1 1 NaN NaN
2 1 NaN NaN
3 1 4.0 1.059185
4 1 4.0 1.059185
5 1 4.0 1.059185
6 1 4.0 1.059185
7 1 4.0 1.059185
8 1 4.0 1.059185
9 1 4.0 1.059185

Utiliser la date pour l'index

Jusqu'à présent, vous avez spécifié le nombre d'éléments dans la fenêtre. Ici, vous pouvez spécifier la période telle que l'heure ou le nombre de jours dans la fenêtre uniquement lorsque l'index de la série est la date ou l'heure. Je vais créer des échantillons de données immédiatement.

date_ones = pd.Series(
    index=[
        pd.Timestamp('2020-01-01'),
        pd.Timestamp('2020-01-02'),
        pd.Timestamp('2020-01-07'),
        pd.Timestamp('2020-01-08'),
        pd.Timestamp('2020-01-09'),
        pd.Timestamp('2020-01-16'),
    ],
    data=[1,1,1,1,1,1]
)
date_ones
2020-01-01    1
2020-01-02    1
2020-01-07    1
2020-01-08    1
2020-01-09    1
2020-01-16    1
dtype: int64

Si vous spécifiez window = '7d' ici, les éléments d'il y a 7 jours seront utilisés pour l'agrégation.

pd.DataFrame({
    'ones': date_ones,
    'rolling-7d': date_ones.rolling('7D').sum(),
})
ones rolling-7d
2020-01-01 1 1.0
2020-01-02 1 2.0
2020-01-07 1 3.0
2020-01-08 1 3.0
2020-01-09 1 3.0
2020-01-16 1 1.0

Dans cet exemple

Ce sera.

Cette méthode de spécification de type '7D' est appelée offset. Il est expliqué dans Offset aliases.

Si vous utilisez le décalage pour la fenêtre, les données seront au moins agrégées, donc NaN ne sera pas enregistré arbitrairement. Inversement, si min_periods est spécifié, il sera NaN s'il n'y a pas plus de données que celles spécifiées dans la période de décalage spécifiée.

pd.DataFrame({
    'ones': date_ones,
    'rolling-7d': date_ones.rolling('7D').sum(),
    'rolling-min-periods': date_ones.rolling('7D', min_periods=3).sum(),
})
ones rolling-7d rolling-min-periods
2020-01-01 1 1.0 NaN
2020-01-02 1 2.0 NaN
2020-01-07 1 3.0 3.0
2020-01-08 1 3.0 3.0
2020-01-09 1 3.0 3.0
2020-01-16 1 1.0 NaN

Exemple de moyenne mobile

Maintenant, dessinons un graphique de moyenne mobile du nombre de personnes infectées par le nouveau virus corona à Tokyo en utilisant les connaissances jusqu'à présent.

Les données sont empruntées à Détails de l'annonce de nouveaux patients positifs au coronavirus à Tokyo.

covid_src = pd.read_csv('https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv', parse_dates=['Publié_Date'])
covid_src
No Code national des organisations publiques locales Nom de la préfecture Nom de la ville Published_Date Jour Onset_date Patient_Residence Patient_age Patient_Gender Patient_attribute état_patient Symptômes_du_patient Indicateur d'historique de voyage du patient Remarques Drapeau déchargé
0 1 130001 Tokyo NaN 2020-01-24 or NaN Ville de Wuhan, province du Hubei 40 s homme NaN NaN NaN NaN NaN 1.0
1 2 130001 Tokyo NaN 2020-01-25 Sam NaN Ville de Wuhan, province du Hubei 30 s Femmes NaN NaN NaN NaN NaN 1.0
2 3 130001 Tokyo NaN 2020-01-30 arborescence NaN Ville de Changsha, province du Hunan 30 s Femmes NaN NaN NaN NaN NaN 1.0
3 4 130001 Tokyo NaN 2020-02-13 arborescence NaN Tokyo années 70 homme NaN NaN NaN NaN NaN 1.0
4 5 130001 Tokyo NaN 2020-02-14 or NaN Tokyo 50 s Femmes NaN NaN NaN NaN NaN 1.0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
28131 28031 130001 Tokyo NaN 2020-10-14 eau NaN NaN Moins de 10 ans homme NaN NaN NaN NaN NaN NaN
28132 28032 130001 Tokyo NaN 2020-10-14 eau NaN NaN 20 s homme NaN NaN NaN NaN NaN NaN
28133 28033 130001 Tokyo NaN 2020-10-14 eau NaN NaN années 70 homme NaN NaN NaN NaN NaN NaN
28134 28034 130001 Tokyo NaN 2020-10-14 eau NaN NaN 20 s Femmes NaN NaN NaN NaN NaN NaN
28135 28035 130001 Tokyo NaN 2020-10-14 eau NaN NaN 40 s Femmes NaN NaN NaN NaN NaN NaN

28136 rows × 16 columns

Comme nous n'avons besoin que du nombre de personnes, nous utiliserons le groupe par et la taille pour obtenir le nombre de cas par date.

covid_daily = covid_src.groupby("Publié_Date").size()
covid_daily.index.name = 'date'
covid_daily
date
2020-01-24      1
2020-01-25      1
2020-01-30      1
2020-02-13      1
2020-02-14      2
             ... 
2020-10-10    249
2020-10-11    146
2020-10-12     78
2020-10-13    166
2020-10-14    177
Length: 239, dtype: int64

Si vous dessinez simplement le nombre d'observations pour chaque date sur le graphique, ce sera en zigzag comme ceci.

covid_daily.plot()

output_23_1.png

Mettre en place une fenêtre hebdomadaire pour capturer les tendances chez les patients positifs. Si vous utilisez mean () au lieu de sum (), vous obtiendrez une moyenne mobile.

covid_daily.rolling(window='7D').mean().plot()

output_25_1.png

référence

Recommended Posts

Comment utiliser Pandas Rolling
Comment utiliser Pandas 2
[Python] Comment utiliser la série Pandas
Comment utiliser xml.etree.ElementTree
Comment utiliser Python-shell
[Python] Résumé de l'utilisation des pandas
Remarques sur l'utilisation de tf.data
Comment utiliser virtualenv
Comment utiliser Seaboan
Comment utiliser la correspondance d'image
Comment utiliser le shogun
[Pandas] Qu'est-ce que set_option [Comment utiliser]
Comment utiliser Virtualenv
Comment utiliser numpy.vectorize
Comment utiliser partiel
Comment utiliser Bio.Phylo
Comment utiliser SymPy
Comment utiliser WikiExtractor.py
Comment utiliser IPython
Comment utiliser virtualenv
Comment utiliser Matplotlib
Comment utiliser iptables
Comment utiliser numpy
Comment utiliser TokyoTechFes2015
Comment utiliser venv
Comment utiliser le dictionnaire {}
Comment utiliser Pyenv
Comment utiliser la liste []
Comment utiliser python-kabusapi
Comment utiliser OptParse
Comment utiliser le retour
Comment utiliser pyenv-virtualenv
Comment utiliser les pandas Timestamp et date_range
Comment utiliser imutils
Comment utiliser Qt Designer
[gensim] Comment utiliser Doc2Vec
python3: Comment utiliser la bouteille (2)
Comprendre comment utiliser django-filter
Comment utiliser le générateur
[Python] Comment utiliser la liste 1
Comment utiliser FastAPI ③ OpenAPI
Comment utiliser Python Argparse
Comment utiliser IPython Notebook
[Note] Comment utiliser virtualenv
Comment utiliser les dictionnaires redis-py
Python: comment utiliser pydub
[Python] Comment utiliser checkio
[Aller] Comment utiliser "... (3 périodes)"
Comment faire fonctionner GeoIp2 de Django
[Python] Comment utiliser input ()
Comment utiliser le décorateur
[Introduction] Comment utiliser open3d
Comment utiliser Python lambda
Comment utiliser Jupyter Notebook
[Python] Comment utiliser virtualenv
python3: Comment utiliser la bouteille (3)
python3: Comment utiliser la bouteille
Comment utiliser Google Colaboratory