[PYTHON] Extraire les périodes qui correspondent à un modèle spécifique des données qualitatives de séries chronologiques de pandas

memo.

Extraire les périodes qui correspondent à un modèle spécifique des données qualitatives de séries chronologiques de pandas

import numpy as np
import pandas as pd

np.random.seed(99)
df = pd.DataFrame(index=pd.date_range('2020-01-01', periods=60, freq='D'),
                  data=np.array(list('Ensoleillé nuageux pluie neige'))[np.random.randint(0, 4, 60)],
                  columns=['Météo'], dtype='string')
df
Météo
2020-01-01 nuageux
2020-01-02 Neige
2020-01-03 Nuageux
2020-01-04 bien
2020-01-05 Nuageux
2020-01-06 bien
2020-01-07 pluie
2020-01-08 bien
2020-01-09 nuageux
2020-01-10 amende
2020-01-11 nuageux
2020-01-12 neige
2020-01-13 pluie
2020-01-14 neige
2020-01-15 neige
2020-01-16 nuageux
2020-01-17 nuageux
2020-01-18 amende
2020-01-19 nuageux
2020-01-20 neige
2020-01-21 pluie
2020-01-22 neige
2020-01-23 amende
2020-01-24 neige
2020-01-25 pluie
2020-01-26 amende
2020-01-27 amende
2020-01-28 amende
2020-01-29 amende
2020-01-30 amende
2020-01-31 nuageux
2020-02-01 Neige
2020-02-02 Neige
2020-02-03 Neige
2020-02-04 pluie
2020-02-05 Neige
2020-02-06 Neige
2020-02-07 pluie
2020-02-08 nuageux
2020-02-09 pluie
2020-02-10 amende
2020-02-11 amende
2020-02-12 nuageux
2020-02-13 pluie
2020-02-14 nuageux
2020-02-15 nuageux
2020-02-16 amende
2020-02-17 nuageux
2020-02-18 neige
2020-02-19 nuageux
2020-02-20 neige
2020-02-21 neige
2020-02-22 pluie
2020-02-23 pluie
2020-02-24 pluie
2020-02-25 neige
2020-02-26 nuageux
2020-02-27 amende
2020-02-28 amende
2020-02-29 amende

Il s'agit d'un enregistrement lorsque vous souhaitez extraire la période montrant un modèle météorologique spécifique lorsque vous disposez des données ci-dessus.

Extraire les jours ensoleillés

Le jugement au quotidien est facile.

df[df['Météo'] == 'Bien']
Météo
2020-01-04 bien
2020-01-06 bien
2020-01-08 bien
2020-01-10 amende
2020-01-18 amende
2020-01-23 amende
2020-01-26 amende
2020-01-27 amende
2020-01-28 amende
2020-01-29 amende
2020-01-30 amende
2020-02-10 amende
2020-02-11 amende
2020-02-16 amende
2020-02-27 amende
2020-02-28 amende
2020-02-29 amende

Extrayez la période "ensoleillée pendant 2 jours ou plus"

Je veux juste le finir.

df[(df['Météo'] == 'Bien') & (df['Météo'].shift(-1, fill_value='') == 'Bien')]
Météo
2020-01-26 amende
2020-01-27 amende
2020-01-28 amende
2020-01-29 amende
2020-02-10 amende
2020-02-27 amende
2020-02-28 amende

Cela a extrait le jour du "jour de" l'amende "et le jour suivant de" l'amende "" et n'a pas réussi à récupérer la "période d'amende" ". Le dernier jour de la période, en particulier le 30 janvier, le 11 février et le 29 février, est omis dans cet exemple. Le lendemain du jour où le résultat de l'expression conditionnelle est «True» doit également être «True».

Voici donc la bonne réponse.

cond = (df['Météo'] == 'Bien') & (df['Météo'].shift(-1, fill_value='') == 'Bien')
cond |= cond.shift(fill_value=False)
out_df = df[cond]

out_df
Météo
2020-01-26 amende
2020-01-27 amende
2020-01-28 amende
2020-01-29 amende
2020-01-30 amende
2020-02-10 amende
2020-02-11 amende
2020-02-27 amende
2020-02-28 amende
2020-02-29 amende

cond |= cond.shift(fill_value=False)Estcond = cond | cond.shift(fill_value=False)est ce que cela signifie.

Au fait, afin d'attribuer un numéro de groupe pour chaque période, vous pouvez voir si tout ira bien le lendemain, alors utilisez diff () pour

ngroup = cond.diff()[cond].cumsum()

out_df.assign(ngroup=ngroup)
Météo Ngroup
2020-01-26 amende 1
2020-01-27 amende 1
2020-01-28 amende 1
2020-01-29 amende 1
2020-01-30 amende 1
2020-02-10 amende 2
2020-02-11 amende 2
2020-02-27 amende 3
2020-02-28 amende 3
2020-02-29 amende 3

Extrayez la période "ensoleillé pendant 3 jours ou plus"

C'est une application de la section précédente.

cond = ((df['Météo'] == 'Bien') & (df['Météo'].shift(-1, fill_value='') == 'Bien')
        & (df['Météo'].shift(-2, fill_value='') == 'Bien'))
cond |= cond.shift(1, fill_value=False) | cond.shift(2, fill_value=False)
out_df = df[cond]

out_df
Météo
2020-01-26 amende
2020-01-27 amende
2020-01-28 amende
2020-01-29 amende
2020-01-30 amende
2020-02-27 amende
2020-02-28 amende
2020-02-29 amende

Extrayez la période "ensoleillé pendant 5 jours ou plus"

Comment écrire comme suit

cond = ((df['Météo'] == 'Bien')
        & (df['Météo'].shift(-1, fill_value='') == 'Bien')
        & (df['Météo'].shift(-2, fill_value='') == 'Bien')
        & (df['Météo'].shift(-3, fill_value='') == 'Bien')
        & (df['Météo'].shift(-4, fill_value='') == 'Bien'))
cond |= (cond.shift(1, fill_value=False) | cond.shift(2, fill_value=False)
         | cond.shift(3, fill_value=False) | cond.shift(4, fill_value=False))
out_df = df[cond]

out_df

C'est douloureux d'aller aussi loin, alors utilisez scipy.ndimage.binary_closing () pour

from scipy.ndimage import binary_closing

days = 5
cond = binary_closing((df['Météo'] != 'Bien').to_numpy(dtype=bool),
                      np.ones(days, dtype=bool), border_value=True)
df[~cond]
Météo
2020-01-26 amende
2020-01-27 amende
2020-01-28 amende
2020-01-29 amende
2020-01-30 amende

Extraire les deux premiers jours de la période "ensoleillé pendant deux jours ou plus"

Lorsque vous voulez avoir pluie [fine] fine fine pluie fine quand il y a pluie fine fine fine fine fine pluie.

En appliquant le diff () utilisé lors de l'attribution du numéro de groupe,

cond = (df['Météo'] == 'Bien') & (df['Météo'].shift(-1, fill_value='') == 'Bien')
cond &= cond.diff()
cond |= cond.shift(fill_value=False)
out_df = df[cond]

out_df
Météo
2020-01-26 amende
2020-01-27 amende
2020-02-10 amende
2020-02-11 amende
2020-02-27 amende
2020-02-28 amende

Extraire les 2 derniers jours de la période "ensoleillé pendant 2 jours ou plus"

Lorsque vous voulez avoir «pluie, fine, fine, fine, fine, pluie» lorsque vous avez «pluie, fine, fine, fine, fine, pluie».

C'est une application de la section précédente.

cond = (df['Météo'] == 'Bien') & (df['Météo'].shift(-1, fill_value='') == 'Bien')
cond = ~cond & cond.diff()
cond |= cond.shift(-1, fill_value=False)
out_df = df[cond]

out_df
Météo
2020-01-29 amende
2020-01-30 amende
2020-02-10 amende
2020-02-11 amende
2020-02-28 amende
2020-02-29 amende

Extrayez la période de "2 jours consécutifs et ensoleillé (hors 3 jours ou plus)"

Comme application de la section précédente, il est facile d'ajouter «pas ensoleillé la veille» et «pas ensoleillé après-demain» comme conditions. .. ..

cond = ((df['Météo'] == 'Bien') & (df['Météo'].shift(-1, fill_value='') == 'Bien')
        & (df['Météo'].shift(1, fill_value='') != 'Bien')
        & (df['Météo'].shift(-2, fill_value='') != 'Bien'))
cond |= cond.shift(fill_value=False)
out_df = df[cond]

out_df
Météo
2020-02-10 amende
2020-02-11 amende

Pour le moment, vous pouvez également le faire.

is_sunny = (df['Météo'] == 'Bien').to_numpy(dtype=int)
# array([0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
#        1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,
#        0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1])

base = 2**np.arange(4)
#Base météo
# 2020-02-09 pluie* 1
# 2020-02-10 amende* 2
# 2020-02-11 amende* 4
# 2020-02-12 nuageux* 8
# 0*1 + 1*2 + 1*4 + 0*8 = 6
target_number = 6
cond = np.convolve(is_sunny, base) == target_number
out_df = df[cond[2:-1] | cond[3:]]

Extrayez la période de "d'une journée ensoleillée au jour de pluie suivant"

Tout d'abord, n'extrayez que les jours ensoleillés et pluvieux, et obtenez le jour ensoleillé et le jour pluvieux suivant. Ensuite, utilisez cumsum () pour séparer les groupes et extraire.

is_sun_rain = df['Météo'].isin(set('Pluie ensoleillée'))

subdf = df[is_sun_rain]
subcond = ((subdf['Météo'] == 'Bien')
           & (subdf['Météo'].shift(-1, fill_value='') == 'pluie'))
subcond |= subcond.shift(fill_value=False)

cond = ((is_sun_rain & subcond).cumsum() % 2).astype('boolean')
cond |= cond.shift(fill_value=False)
out_df = df[cond]

ngroup = cond.diff()[cond].cumsum()
out_df.assign(ngroup=ngroup)
Météo Ngroup
2020-01-06 bien 1
2020-01-07 pluie 1
2020-01-10 amende 2
2020-01-11 nuageux 2
2020-01-12 neige 2
2020-01-13 pluie 2
2020-01-18 amende 3
2020-01-19 nuageux 3
2020-01-20 neige 3
2020-01-21 pluie 3
2020-01-23 amende 4
2020-01-24 neige 4
2020-01-25 pluie 4
2020-01-30 amende 5
2020-01-31 nuageux 5
2020-02-01 neige 5
2020-02-02 Neige 5
2020-02-03 Neige 5
2020-02-04 pluie 5
2020-02-11 amende 6
2020-02-12 nuageux 6
2020-02-13 pluie 6
2020-02-16 amende 7
2020-02-17 nuageux 7
2020-02-18 neige 7
2020-02-19 nuageux 7
2020-02-20 neige 7
2020-02-21 neige 7
2020-02-22 pluie 7

Extrayez la période d'une journée ensoleillée au jour de pluie suivant avec une journée nuageuse entre les deux

C'est une application de la section précédente.

is_sun_rain = df['Météo'].isin(set('Ensoleillé nuageux pluie'))

subdf = df[is_sun_rain]
subcond = ((subdf['Météo'] == 'Bien')
           & (subdf['Météo'].shift(-1, fill_value='') == 'Nuageux')
           & (subdf['Météo'].shift(-2, fill_value='') == 'pluie'))
subcond |= subcond.shift(2, fill_value=False)

cond = ((is_sun_rain & subcond).cumsum() % 2).astype('boolean')
cond |= cond.shift(fill_value=False)

out_df = df[cond]

ngroup = cond.diff()[cond].cumsum()
out_df.assign(ngroup=ngroup)
Météo Ngroup
2020-01-10 amende 1
2020-01-11 nuageux 1
2020-01-12 neige 1
2020-01-13 pluie 1
2020-01-18 amende 2
2020-01-19 nuageux 2
2020-01-20 neige 2
2020-01-21 pluie 2
2020-01-30 amende 3
2020-01-31 nuageux 3
2020-02-01 Neige 3
2020-02-02 Neige 3
2020-02-03 Neige 3
2020-02-04 pluie 3
2020-02-11 amende 4
2020-02-12 nuageux 4
2020-02-13 pluie 4

Ou

arr, _ = df['Météo'].factorize()
# 0: 'Nuageux', 1: 'neige', 2: 'Bien', 3: 'pluie'
subarr, = (arr != 1).nonzero()
subcond = np.convolve(arr[subarr], [1, 10, 100]) == 203

flags = np.zeros(arr.size, dtype=int)
flags[subarr[subcond[2:]]] = 1
flags[subarr[subcond[:-2]]+1] = -1
cond = flags.cumsum().astype(bool)
out_df = df[cond]

ngroup = flags[cond].cumsum()
out_df.assign(ngroup=ngroup)

Recommended Posts

Extraire les périodes qui correspondent à un modèle spécifique des données qualitatives de séries chronologiques de pandas
Quantité d'entités pouvant être extraite des données de séries chronologiques
Bibliothèque tsfresh qui extrait automatiquement les caractéristiques des données de séries chronologiques
Programme Python qui agrège l'utilisation du temps à partir des données icalendar
[numpy] Créer une matrice de fenêtre mobile à partir de données de séries chronologiques multidimensionnelles
<Pandas> Comment gérer les données de séries chronologiques dans le tableau croisé dynamique
Extraire les lignes qui correspondent aux conditions d'un fichier texte avec python
Trouvez l'index des éléments qui correspondent aux conditions dans la trame / série de données pandas
Obtenez des données de séries chronologiques de k-db.com avec Python
Extraire des données d'une page Web avec Python
Prédire à partir de diverses données en Python à l'aide de l'outil de prédiction de séries chronologiques Facebook Prophet
[Python] Extrait les blocs de données de Pandas qui ne correspondent pas à une colonne spécifique avec d'autres blocs de données
Extraction de données depuis S3
Un mémo qui lit les données de dashDB avec Python et Spark
Graphique des données de séries chronologiques en Python à l'aide de pandas et matplotlib
Une histoire de regroupement de données de séries chronologiques d'échange