memo.
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.
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
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
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
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
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
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
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:]]
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
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