Um eine ungefähre Vorstellung von den Daten zu erhalten, die im Detail schwanken, wie z. B. Aktienkurse und die Anzahl neuer Coronavirus-positiver Patienten, nehmen Sie den Durchschnitt einschließlich der Zahlen vor und nach einem bestimmten Zeitpunkt. Notieren Sie sich das Rollen, eine Pandas-Funktion, die dies tut.
import pandas as pd
Um den grundlegenden Vorgang des Walzens zu bestätigen, erstellen Sie zunächst eine Serie mit 10 Einsen und benennen Sie diese.
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
Verwenden Sie das Rollen, um jeweils vier hinzuzufügen. Das Ergebnis ist natürlich eine Spalte von 4, da Sie nur die Zahlen 1 mal 4 addieren. Das Ergebnis der ersten vier fehlenden Daten ist jedoch NaN. Ich habe die Summe 4 aufgelistet, weil ich sie zum Vergleich mit der ursprünglichen Spalte hinzugefügt habe.
Geben Sie auf diese Weise die Anzahl der Daten (Fensterbreite) an, die im Fenster aggregiert werden sollen. Es ist ein Bild von vier Fenstern, die sich vom Anfang bis zum Ende bewegen und zählen. Die aggregierten Ergebnisse werden am Ende des Fensters aufgezeichnet, sodass die ersten drei Werte für Summe 4 NaN sind.
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 |
Wenn center = True angegeben ist, kann das aggregierte Ergebnis in der Mitte aufgezeichnet werden, anstatt am Ende des Fensters aufgezeichnet zu werden. Ordnen wir dies als Summenzentrum an. Wenn das Fenster gerade ist, zeichnen Sie nach der Mitte auf. Jetzt ist das letzte Element 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 |
Standardmäßig wird der Teil der Daten, der nicht breit genug ist, nicht aggregiert. Wenn Sie jedoch min_periods angeben, wird es aggregiert, wenn mindestens min_periods vorhanden sind. In diesem Beispiel wird min_period = 2 angegeben, sodass das Ergebnis in der zweiten Zeile angezeigt wird.
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 |
Bis zu diesem Punkt werden alle Elemente des Fensters für die Aggregation verwendet, aber es scheint, dass das Gewicht des aggregierten Werts mithilfe von "win_type" geändert werden kann. Erfordert eine einfache Installation.
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 |
Bisher haben Sie die Anzahl der Elemente im Fenster angegeben. Hier können Sie den Zeitraum wie Uhrzeit oder Anzahl der Tage im Fenster nur angeben, wenn der Index der Serie Datum oder Uhrzeit ist. Ich werde sofort Beispieldaten erstellen.
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
Wenn Sie hier window = '7d' angeben, werden die Elemente bis vor 7 Tagen für die Aggregation verwendet.
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 |
In diesem Beispiel
Es wird sein.
Diese '7D'-ähnliche Spezifikationsmethode wird als Offset bezeichnet. Dies wird in Offset-Aliase erläutert.
Wenn Sie Offset für Fenster verwenden, werden die Daten mindestens aggregiert, sodass NaN nicht willkürlich aufgezeichnet wird. Wenn dagegen min_periods angegeben wird, ist es NaN, wenn nicht mehr Daten als in der angegebenen Versatzperiode angegeben sind.
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 |
Zeichnen wir nun ein gleitendes Durchschnittsdiagramm der Anzahl der mit dem neuen Koronavirus in Tokio infizierten Personen, wobei wir das bisherige Wissen nutzen.
Die Daten stammen von Details zur Ankündigung neuer Coronavirus-positiver Patienten in Tokio.
covid_src = pd.read_csv('https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv', parse_dates=['Veröffentlicht_Datum'])
covid_src
No | Nationaler Code der lokalen öffentlichen Organisation th> | Präfekturname th> | Name der Stadt th> | Published_Date th> | Tag th> | Onset_date th> | Patient_Residence th> | Patient_age th> | Patient_Gender th> | Patientenattribut th> | Patient_state th> | Patientensymptome th> | Patientenverlaufsflag th> | Bemerkungen th> | Entladenes Flag th> | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 130001 | Tokio td> | NaN | 2020-01-24 | Gold td> | NaN | Stadt Wuhan, Provinz Hubei td> | 40s td> | männlich td> | NaN | NaN | NaN | NaN | NaN | 1.0 |
1 | 2 | 130001 | Tokio td> | NaN | 2020-01-25 | Sa td> | NaN | Stadt Wuhan, Provinz Hubei td> | 30s td> | Frauen td> | NaN | NaN | NaN | NaN | NaN | 1.0 |
2 | 3 | 130001 | Tokio td> | NaN | 2020-01-30 | Baum td> | NaN | Stadt Changsha, Provinz Hunan td> | 30s td> | Frauen td> | NaN | NaN | NaN | NaN | NaN | 1.0 |
3 | 4 | 130001 | Tokio td> | NaN | 2020-02-13 | Baum td> | NaN | Tokio td> | 70er td> | männlich td> | NaN | NaN | NaN | NaN | NaN | 1.0 |
4 | 5 | 130001 | Tokio td> | NaN | 2020-02-14 | Gold td> | NaN | Tokio td> | 50s td> | Frauen td> | NaN | NaN | NaN | NaN | NaN | 1.0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
28131 | 28031 | 130001 | Tokio td> | NaN | 2020-10-14 | Wasser td> | NaN | NaN | Unter 10 Jahren td> | männlich td> | NaN | NaN | NaN | NaN | NaN | NaN |
28132 | 28032 | 130001 | Tokio td> | NaN | 2020-10-14 | Wasser td> | NaN | NaN | 20s td> | männlich td> | NaN | NaN | NaN | NaN | NaN | NaN |
28133 | 28033 | 130001 | Tokio td> | NaN | 2020-10-14 | Wasser td> | NaN | NaN | 70er td> | männlich td> | NaN | NaN | NaN | NaN | NaN | NaN |
28134 | 28034 | 130001 | Tokio td> | NaN | 2020-10-14 | Wasser td> | NaN | NaN | 20s td> | Frauen td> | NaN | NaN | NaN | NaN | NaN | NaN |
28135 | 28035 | 130001 | Tokio td> | NaN | 2020-10-14 | Wasser td> | NaN | NaN | 40s td> | Frauen td> | NaN | NaN | NaN | NaN | NaN | NaN |
28136 rows × 16 columns
Da wir nur die Anzahl der Personen benötigen, verwenden wir die Gruppe nach und die Größe, um die Anzahl der Fälle nach Datum zu ermitteln.
covid_daily = covid_src.groupby("Veröffentlicht_Datum").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
Wenn Sie einfach die Anzahl der Fälle für jedes Datum in einem Diagramm zeichnen, wird es wie folgt im Zickzack angezeigt.
covid_daily.plot()
Richten Sie ein wöchentliches Fenster ein, um Trends bei positiven Patienten zu erfassen. Wenn Sie mean () anstelle von sum () verwenden, erhalten Sie einen gleitenden Durchschnitt.
covid_daily.rolling(window='7D').mean().plot()
Recommended Posts