[PYTHON] Wie man Pandas Rolling benutzt

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.

Normaler Gebrauch

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

Verwenden Sie das Datum für den Index

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

Beispiel für einen gleitenden Durchschnitt

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 Präfekturname Name der Stadt Published_Date Tag Onset_date Patient_Residence Patient_age Patient_Gender Patientenattribut Patient_state Patientensymptome Patientenverlaufsflag Bemerkungen Entladenes Flag
0 1 130001 Tokio NaN 2020-01-24 Gold NaN Stadt Wuhan, Provinz Hubei 40s männlich NaN NaN NaN NaN NaN 1.0
1 2 130001 Tokio NaN 2020-01-25 Sa NaN Stadt Wuhan, Provinz Hubei 30s Frauen NaN NaN NaN NaN NaN 1.0
2 3 130001 Tokio NaN 2020-01-30 Baum NaN Stadt Changsha, Provinz Hunan 30s Frauen NaN NaN NaN NaN NaN 1.0
3 4 130001 Tokio NaN 2020-02-13 Baum NaN Tokio 70er männlich NaN NaN NaN NaN NaN 1.0
4 5 130001 Tokio NaN 2020-02-14 Gold NaN Tokio 50s Frauen NaN NaN NaN NaN NaN 1.0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
28131 28031 130001 Tokio NaN 2020-10-14 Wasser NaN NaN Unter 10 Jahren männlich NaN NaN NaN NaN NaN NaN
28132 28032 130001 Tokio NaN 2020-10-14 Wasser NaN NaN 20s männlich NaN NaN NaN NaN NaN NaN
28133 28033 130001 Tokio NaN 2020-10-14 Wasser NaN NaN 70er männlich NaN NaN NaN NaN NaN NaN
28134 28034 130001 Tokio NaN 2020-10-14 Wasser NaN NaN 20s Frauen NaN NaN NaN NaN NaN NaN
28135 28035 130001 Tokio NaN 2020-10-14 Wasser NaN NaN 40s Frauen 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()

output_23_1.png

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()

output_25_1.png

Referenz

Recommended Posts

Wie man Pandas Rolling benutzt
Verwendung von Pandas 2
[Python] Verwendung der Pandas-Serie
Verwendung von xml.etree.ElementTree
Wie benutzt man Python-Shell
[Python] Zusammenfassung der Verwendung von Pandas
Hinweise zur Verwendung von tf.data
Verwendung von virtualenv
Wie benutzt man Seaboan?
Verwendung von Image-Match
Wie man Shogun benutzt
[Pandas] Was ist set_option?
Verwendung von Virtualenv
Verwendung von numpy.vectorize
Wie man teilweise verwendet
Wie man Bio.Phylo benutzt
Verwendung von SymPy
Verwendung von WikiExtractor.py
Verwendung von IPython
Verwendung von virtualenv
Wie benutzt man Matplotlib?
Verwendung von iptables
Wie benutzt man numpy?
Verwendung von TokyoTechFes2015
Wie benutzt man venv
Verwendung des Wörterbuchs {}
Wie benutzt man Pyenv?
Verwendung der Liste []
Wie man Python-Kabusapi benutzt
Verwendung von OptParse
Verwendung von return
Verwendung von pandas Timestamp und date_range
Wie man Imutils benutzt
Verwendung von Qt Designer
[gensim] Verwendung von Doc2Vec
python3: Verwendung der Flasche (2)
Verstehen Sie, wie man Django-Filter verwendet
Verwendung des Generators
[Python] Verwendung von Liste 1
Verwendung von FastAPI ③ OpenAPI
Wie benutzt man Python Argparse?
Verwendung von IPython Notebook
[Hinweis] Verwendung von virtualenv
Verwendung von Redispy-Wörterbüchern
Python: Wie man pydub benutzt
[Python] Verwendung von checkio
[Go] Verwendung von "... (3 Perioden)"
So bedienen Sie GeoIp2 von Django
[Python] Verwendung von input ()
Wie benutzt man den Dekorateur?
[Einführung] Verwendung von open3d
Wie benutzt man Python Lambda?
So verwenden Sie Jupyter Notebook
[Python] Verwendung von virtualenv
python3: Verwendung der Flasche (3)
python3: Wie man eine Flasche benutzt
So verwenden Sie Google Colaboratory