[PYTHON] Extrahieren Sie Perioden, die einem bestimmten Muster entsprechen, aus den qualitativen Daten der Pandas-Zeitreihen

memo.

Extrahieren Sie Perioden, die einem bestimmten Muster entsprechen, aus den qualitativen Daten der Pandas-Zeitreihen

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.

Extrahieren Sie sonnige Tage

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

Extrahieren Sie den Zeitraum "2 Tage oder länger sonnig".

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

Extrahieren Sie den Zeitraum "3 Tage oder länger sonnig".

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

Extrahieren Sie den Zeitraum "5 Tage oder länger sonnig".

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

Extrahieren Sie die ersten zwei Tage des Zeitraums "zwei Tage oder länger sonnig"

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

Extrahieren Sie die letzten 2 Tage der Periode "2 Tage oder länger sonnig"

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

Extrahieren Sie den Zeitraum "2 Tage hintereinander und sonnig (ausgenommen 3 Tage oder mehr)".

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 den Zeitraum von "von einem sonnigen Tag bis zum nächsten Regentag".

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

Extrahieren Sie den Zeitraum von einem sonnigen Tag bis zum nächsten Regentag mit einem bewölkten Tag dazwischen

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

Extrahieren Sie Perioden, die einem bestimmten Muster entsprechen, aus den qualitativen Daten der Pandas-Zeitreihen
Merkmalsmenge, die aus Zeitreihendaten extrahiert werden kann
Bibliothek tsfresh, die Features automatisch aus Zeitreihendaten extrahiert
Python-Programm, das die Zeitnutzung aus icalendar-Daten aggregiert
[numpy] Erstellen Sie eine sich bewegende Fenstermatrix aus mehrdimensionalen Zeitreihendaten
<Pandas> Umgang mit Zeitreihendaten in der Pivot-Tabelle
Extrahieren Sie mit Python Zeilen, die den Bedingungen entsprechen, aus einer Textdatei
Suchen Sie den Index der Elemente, die den Bedingungen im Pandas-Datenrahmen / der Pandas-Serie entsprechen
Holen Sie sich mit Python Zeitreihendaten von k-db.com
Extrahieren Sie mit Python Daten von einer Webseite
Vorhersage aus verschiedenen Daten in Python mit dem Zeitreihen-Vorhersage-Tool Facebook Prophet
[Python] Extrahiert Datenrahmen von Pandas, die einer bestimmten Spalte nicht mit anderen Datenrahmen entsprechen
Daten aus S3 extrahieren
Ein Memo, das mit Python & Spark Daten aus dashDB liest
Zeichnen Sie Zeitreihendaten in Python mit Pandas und Matplotlib
Eine Geschichte über das Clustering von Zeitreihendaten des Austauschs