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('Sonniger bewölkter Regenschnee'))[np.random.randint(0, 4, 60)],
columns=['Wetter'], dtype='string')
df
Wetter
2020-01-01 bewölkt
2020-01-02 Schnee
2020-01-03 Bewölkt
2020-01-04 gut
2020-01-05 Bewölkt
2020-01-06 gut
2020-01-07 Regen
2020-01-08 gut
2020-01-09 bewölkt
2020-01-10 gut
2020-01-11 bewölkt
2020-01-12 Schnee
2020-01-13 Regen
2020-01-14 Schnee
2020-01-15 Schnee
2020-01-16 bewölkt
2020-01-17 bewölkt
2020-01-18 gut
2020-01-19 bewölkt
2020-01-20 Schnee
2020-01-21 Regen
2020-01-22 Schnee
2020-01-23 gut
2020-01-24 Schnee
2020-01-25 Regen
2020-01-26 gut
2020-01-27 gut
2020-01-28 gut
2020-01-29 gut
2020-01-30 gut
2020-01-31 bewölkt
2020-02-01 Schnee
2020-02-02 Schnee
2020-02-03 Schnee
2020-02-04 Regen
2020-02-05 Schnee
2020-02-06 Schnee
2020-02-07 Regen
2020-02-08 bewölkt
2020-02-09 Regen
2020-02-10 gut
2020-02-11 gut
2020-02-12 bewölkt
2020-02-13 Regen
2020-02-14 bewölkt
2020-02-15 bewölkt
2020-02-16 gut
2020-02-17 bewölkt
2020-02-18 Schnee
2020-02-19 bewölkt
2020-02-20 Schnee
2020-02-21 Schnee
2020-02-22 Regen
2020-02-23 Regen
2020-02-24 Regen
2020-02-25 Schnee
2020-02-26 bewölkt
2020-02-27 gut
2020-02-28 gut
2020-02-29 gut
Es ist ein Datensatz, wenn Sie den Zeitraum extrahieren möchten, der ein bestimmtes Wettermuster zeigt, wenn Sie über die oben genannten Daten verfügen.
Die tägliche Beurteilung ist einfach.
df[df['Wetter'] == 'Fein']
Wetter
2020-01-04 gut
2020-01-06 gut
2020-01-08 gut
2020-01-10 gut
2020-01-18 gut
2020-01-23 gut
2020-01-26 gut
2020-01-27 gut
2020-01-28 gut
2020-01-29 gut
2020-01-30 gut
2020-02-10 gut
2020-02-11 gut
2020-02-16 gut
2020-02-27 gut
2020-02-28 gut
2020-02-29 gut
Ich möchte es nur beenden.
df[(df['Wetter'] == 'Fein') & (df['Wetter'].shift(-1, fill_value='') == 'Fein')]
Wetter
2020-01-26 gut
2020-01-27 gut
2020-01-28 gut
2020-01-29 gut
2020-02-10 gut
2020-02-27 gut
2020-02-28 gut
Dies hat den Tag des "Bußgeldtages" und den nächsten "Bußgeldtag" extrahiert und die "Bußgeldperiode" nicht abgerufen. Der letzte Tag des Zeitraums, insbesondere der 30. Januar, der 11. Februar und der 29. Februar, wird in diesem Beispiel übersehen. Der Tag nach dem Tag, an dem das Ergebnis des bedingten Ausdrucks "Wahr" ist, muss ebenfalls "Wahr" sein.
Das Folgende ist also die richtige Antwort.
cond = (df['Wetter'] == 'Fein') & (df['Wetter'].shift(-1, fill_value='') == 'Fein')
cond |= cond.shift(fill_value=False)
out_df = df[cond]
out_df
Wetter
2020-01-26 gut
2020-01-27 gut
2020-01-28 gut
2020-01-29 gut
2020-01-30 gut
2020-02-10 gut
2020-02-11 gut
2020-02-27 gut
2020-02-28 gut
2020-02-29 gut
cond |= cond.shift(fill_value=False)
Istcond = cond | cond.shift(fill_value=False)
ist was es bedeutet.
Übrigens, um eine Gruppennummer für jeden Zeitraum zuzuweisen, können Sie sehen, ob es am nächsten Tag in Ordnung ist. Verwenden Sie also diff ()
to
ngroup = cond.diff()[cond].cumsum()
out_df.assign(ngroup=ngroup)
Wetter ngroup
2020-01-26 fein 1
2020-01-27 gut 1
2020-01-28 gut 1
2020-01-29 gut 1
2020-01-30 Geldstrafe 1
2020-02-10 fein 2
2020-02-11 gut 2
2020-02-27 gut 3
2020-02-28 gut 3
2020-02-29 gut 3
Es ist eine Anwendung des vorherigen Abschnitts.
cond = ((df['Wetter'] == 'Fein') & (df['Wetter'].shift(-1, fill_value='') == 'Fein')
& (df['Wetter'].shift(-2, fill_value='') == 'Fein'))
cond |= cond.shift(1, fill_value=False) | cond.shift(2, fill_value=False)
out_df = df[cond]
out_df
Wetter
2020-01-26 gut
2020-01-27 gut
2020-01-28 gut
2020-01-29 gut
2020-01-30 gut
2020-02-27 gut
2020-02-28 gut
2020-02-29 gut
Wie schreibe ich wie folgt
cond = ((df['Wetter'] == 'Fein')
& (df['Wetter'].shift(-1, fill_value='') == 'Fein')
& (df['Wetter'].shift(-2, fill_value='') == 'Fein')
& (df['Wetter'].shift(-3, fill_value='') == 'Fein')
& (df['Wetter'].shift(-4, fill_value='') == 'Fein'))
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
Es ist schmerzhaft, so weit zu gehen, also benutze scipy.ndimage.binary_closing ()
to
from scipy.ndimage import binary_closing
days = 5
cond = binary_closing((df['Wetter'] != 'Fein').to_numpy(dtype=bool),
np.ones(days, dtype=bool), border_value=True)
df[~cond]
Wetter
2020-01-26 gut
2020-01-27 gut
2020-01-28 gut
2020-01-29 gut
2020-01-30 gut
Wenn Sie "Regen [fein] fein fein fein Regen" bekommen möchten, wenn es "Regen fein fein fein fein feiner Regen" gibt.
Anwenden des beim Zuweisen der Gruppennummer verwendeten diff ()
,
cond = (df['Wetter'] == 'Fein') & (df['Wetter'].shift(-1, fill_value='') == 'Fein')
cond &= cond.diff()
cond |= cond.shift(fill_value=False)
out_df = df[cond]
out_df
Wetter
2020-01-26 gut
2020-01-27 gut
2020-02-10 gut
2020-02-11 gut
2020-02-27 gut
2020-02-28 gut
Wenn Sie "Regen, fein, fein, fein, fein, Regen" bekommen möchten, wenn Sie "Regen, fein, fein, fein, fein, fein" haben.
Es ist eine Anwendung des vorherigen Abschnitts.
cond = (df['Wetter'] == 'Fein') & (df['Wetter'].shift(-1, fill_value='') == 'Fein')
cond = ~cond & cond.diff()
cond |= cond.shift(-1, fill_value=False)
out_df = df[cond]
out_df
Wetter
2020-01-29 gut
2020-01-30 gut
2020-02-10 gut
2020-02-11 gut
2020-02-28 gut
2020-02-29 gut
Als Anwendung des vorherigen Abschnitts ist es einfach, als Bedingungen "nicht sonnig am Vortag" und "nicht sonnig am Vortag morgen" als Bedingungen hinzuzufügen. .. ..
cond = ((df['Wetter'] == 'Fein') & (df['Wetter'].shift(-1, fill_value='') == 'Fein')
& (df['Wetter'].shift(1, fill_value='') != 'Fein')
& (df['Wetter'].shift(-2, fill_value='') != 'Fein'))
cond |= cond.shift(fill_value=False)
out_df = df[cond]
out_df
Wetter
2020-02-10 gut
2020-02-11 gut
Dies können Sie vorerst auch tun.
is_sunny = (df['Wetter'] == 'Fein').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)
#Wetterbasis
# 2020-02-09 Regen* 1
# 2020-02-10 gut* 2
# 2020-02-11 gut* 4
# 2020-02-12 bewölkt* 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:]]
Extrahieren Sie zuerst nur die sonnigen und regnerischen Tage und erhalten Sie den sonnigen Tag und den nächsten regnerischen Tag. Verwenden Sie dann cumsum ()
, um die Gruppen zu trennen und zu extrahieren.
is_sun_rain = df['Wetter'].isin(set('Sonniger Regen'))
subdf = df[is_sun_rain]
subcond = ((subdf['Wetter'] == 'Fein')
& (subdf['Wetter'].shift(-1, fill_value='') == 'Regen'))
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)
Wetter ngroup
2020-01-06 gut 1
2020-01-07 Regen 1
2020-01-10 fein 2
2020-01-11 bewölkt 2
2020-01-12 Schnee 2
2020-01-13 Regen 2
2020-01-18 gut 3
2020-01-19 bewölkt 3
2020-01-20 Schnee 3
2020-01-21 Regen 3
2020-01-23 gut 4
2020-01-24 Schnee 4
2020-01-25 Regen 4
2020-01-30 Geldstrafe 5
2020-01-31 bewölkt 5
2020-02-01 Schnee 5
2020-02-02 Schnee 5
2020-02-03 Schnee 5
2020-02-04 Regen 5
2020-02-11 gut 6
2020-02-12 bewölkt 6
2020-02-13 Regen 6
2020-02-16 gut 7
2020-02-17 bewölkt 7
2020-02-18 Schnee 7
2020-02-19 bewölkt 7
2020-02-20 Schnee 7
2020-02-21 Schnee 7
2020-02-22 Regen 7
Es ist eine Anwendung des vorherigen Abschnitts.
is_sun_rain = df['Wetter'].isin(set('Sonniger bewölkter Regen'))
subdf = df[is_sun_rain]
subcond = ((subdf['Wetter'] == 'Fein')
& (subdf['Wetter'].shift(-1, fill_value='') == 'Wolkig')
& (subdf['Wetter'].shift(-2, fill_value='') == 'Regen'))
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)
Wetter ngroup
2020-01-10 fein 1
2020-01-11 bewölkt 1
2020-01-12 Schnee 1
2020-01-13 Regen 1
2020-01-18 gut 2
2020-01-19 bewölkt 2
2020-01-20 Schnee 2
2020-01-21 Regen 2
2020-01-30 fein 3
2020-01-31 bewölkt 3
2020-02-01 Schnee 3
2020-02-02 Schnee 3
2020-02-03 Schnee 3
2020-02-04 Regen 3
2020-02-11 gut 4
2020-02-12 bewölkt 4
2020-02-13 Regen 4
Oder
arr, _ = df['Wetter'].factorize()
# 0: 'Wolkig', 1: 'Schnee', 2: 'Fein', 3: 'Regen'
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