[PYTHON] Scraping Data Wrangling von statistischen Informationen über neue Coronavirus-Infektionen in der Präfektur Yamanashi

Scraping Data Wrangling von statistischen Informationen über neue Coronavirus-Infektionen in der Präfektur Yamanashi

Einführung

yamanashi.png

Verfahren

  1. Teilen Sie den Zeitraum in Anfang und Ende, teilen Sie die Aufteilung nach Tag und kombinieren Sie sie
  2. Konvertieren Sie Start und Ende auf das Datum
  3. Nach Datum organisieren
  4. Teilen Sie in Tage und Zahlen
  5. Kombinieren Sie Start / Ende und Datum / Nummer
  6. Konvertieren Sie von Tag zu Datum
  7. Datum und Zwischensumme

Schaben

dfs = pd.read_html(
    "https://www.pref.yamanashi.jp/koucho/coronavirus/info_coronavirus_data.html"
)

df0 = df.iloc[1:].set_axis(["Zeitraum", "Nummer", "Nervenzusammenbruch"], axis=1)
Zeitraum Nummer Nervenzusammenbruch
1 4. Oktober (Sonntag) - 10. Oktober (Samstag) 25 25 Fälle an 4 Tagen
2 27. September (Sonntag) - 3. Oktober (Samstag) 245 27 Tage 18 Fälle, 28 Tage 21 Fälle, 29 Tage 56 Fälle, 30 Tage 46 Fälle, 1. Oktober 44 Fälle, 2 Tage 27 Fälle, 3 Tage 33 Fälle
3 20. September (So) - 26. September (Sa) 230 20. 23 Fälle, 21. 23 Fälle, 22. 17 Fälle, 23. 38 Fälle, 24. 44 Fälle, 25. 32 Fälle, 26. 53 Fälle
4 13. September (So) - 19. September (Sa) 296 13. 35 Fälle, 14. 63 Fälle, 15. 51 Fälle, 16. 29 Fälle, 17. 48 Fälle, 18. 31 Fälle, 19. 39 Fälle
5 6. September (So) - 12. September (Sa) 285 6 Tage 33 Fälle, 7 Tage 36 Fälle, 8 Tage 39 Fälle, 9 Tage 37 Fälle, 10 Tage 50 Fälle, 11 Tage 20 Fälle, 12 Tage 40 Fälle
6 30. August (Sonntag) - 5. September (Samstag) 280 30 Tage 34 Fälle, 31 Tage 23 Fälle, 1. September 57 Fälle, 2 Tage 35 Fälle, 3 Tage 42 Fälle, 4 Tage 49 Fälle, 5 Tage 40 Fälle
7 23. August (So) - 29. August (Sa) 371 23 Tage 26 Fälle, 24 Tage 90 Fälle, 25 Tage 54 Fälle, 26 Tage 58 Fälle, 27 Tage 56 Fälle, 28 Tage 49 Fälle, 29 Tage 38 Fälle
8 16. August (So) - 22. August (Sa) 537 16 Tage 83 Fälle, 17 Tage 54 Fälle, 18 Tage 94 Fälle, 19 Tage 108 Fälle, 20 Tage 95 Fälle, 21 Tage 69 Fälle, 22 Tage 34 Fälle
9 9. August (So) - 15. August (Sa) 500 9 Tage 68 Fälle, 10 Tage 75 Fälle, 11 Tage 57 Fälle, 12 Tage 73 Fälle, 13 Tage 77 Fälle, 14 Tage 63 Fälle, 15 Tage 87 Fälle
10 2. August (So) - 8. August (Sa) 711 2 Tage 52 Fälle, 3 Tage 43 Fälle, 4 Tage 90 Fälle, 5 Tage 84 Fälle, 6 Tage 126 Fälle, 7 Tage 141 Fälle, 8 Tage 175 Fälle

Daten-Wrangling

Teilen Sie den Zeitraum in Anfang und Ende, teilen Sie die Aufteilung nach Tag, kombinieren Sie

df1 = pd.concat(
    [
        df0["Zeitraum"].str.split("~", expand=True).rename(columns={0: "Start", 1: "Ende"}),
        df0["Nervenzusammenbruch"].str.split("、", expand=True),
    ],
    axis=1,
)
Start Ende 0 1 2 3 4 5 6
1 4. Oktober (So) Samstag, 10. Oktober 25 Fälle an 4 Tagen
2 27. September (So) Samstag, 3. Oktober 18 Fälle am 27 .. 28 Tage 21 Fälle 29 Tage 56 Fälle 46 Fälle in 30 Tagen 1. Oktober 44 Fälle 27 Fälle an 2 Tagen 33 Fälle in 3 Tagen
3 20. September (So) Samstag, 26. September 23 Fälle am 20 .. 21 Tage 23 Fälle 22 Tage 17 Fälle 23 Tage 38 Fälle 44 Fälle am 24 .. 32 Fälle am 25 .. 26 Tage 53 Fälle
4 13. September (So) Samstag, 19. September 13 Tage 35 Fälle 63 Fälle am 14 .. 51 Fälle am 15 .. 29 Fälle am 16 .. 17 Tage 48 Fälle 18 Tage 31 Fälle 39 Fälle am 19 ..
5 6. September (So) Samstag, 12. September 33 Fälle an 6 Tagen 36 Fälle an 7 Tagen 39 Fälle am 8 .. 37 Fälle am 9 .. 50 Fälle in 10 Tagen 20 Fälle am 11 .. 40 Fälle am 12 ..
6 30. August (So) Samstag, 5. September 34 Fälle in 30 Tagen 23 Fälle am 31 1. September 57 Fälle 35 Fälle in 2 Tagen 42 Fälle an 3 Tagen 49 Fälle an 4 Tagen 40 Fälle in 5 Tagen
7 Sonntag, 23. August Samstag, 29. August 26 Fälle am 23 .. 90 Fälle am 24 .. 54 Fälle am 25 .. 26 Tage 58 Fälle 56 Fälle am 27 .. 28 Tage 49 Fälle 29 Tage 38 Fälle
8 16. August (So) Samstag, 22. August 16 Tage 83 Fälle 54 Fälle am 17 .. 18 Tage 94 Fälle 108 Fälle am 19 .. 20 Tage 95 Fälle 21 Tage 69 Fälle 22 Tage 34 Fälle
9 9. August (So) Samstag, 15. August 68 Fälle am 9 .. 75 Fälle an 10 Tagen 57 Fälle am 11 .. 73 Fälle am 12 .. 77 Fälle am 13 .. 63 Fälle am 14 .. 87 Fälle am 15 ..
10 2. August (So) Samstag, 8. August 52 Fälle in 2 Tagen 43 Fälle in 3 Tagen 90 Fälle an 4 Tagen 84 Fälle an 5 Tagen 126 Fälle an 6 Tagen 141 Fälle an 7 Tagen 8 Tage 175 Fälle

Konvertieren Sie Start und Ende auf das Datum

df1["Start"] = df1["Start"].str.normalize("NFKC").apply(my_parser)
df1["Ende"] = df1["Ende"].str.normalize("NFKC").apply(my_parser)
Start Ende 0 1 2 3 4 5 6
1 2020-10-04 00:00:00 2020-10-10 00:00:00 25 Fälle an 4 Tagen
2 2020-09-27 00:00:00 2020-10-03 00:00:00 18 Fälle am 27 .. 28 Tage 21 Fälle 29 Tage 56 Fälle 46 Fälle in 30 Tagen 1. Oktober 44 Fälle 27 Fälle an 2 Tagen 33 Fälle in 3 Tagen
3 2020-09-20 00:00:00 2020-09-26 00:00:00 23 Fälle am 20 .. 21 Tage 23 Fälle 22 Tage 17 Fälle 23 Tage 38 Fälle 44 Fälle am 24 .. 32 Fälle am 25 .. 26 Tage 53 Fälle
4 2020-09-13 00:00:00 2020-09-19 00:00:00 13 Tage 35 Fälle 63 Fälle am 14 .. 51 Fälle am 15 .. 29 Fälle am 16 .. 17 Tage 48 Fälle 18 Tage 31 Fälle 39 Fälle am 19 ..
5 2020-09-06 00:00:00 2020-09-12 00:00:00 33 Fälle an 6 Tagen 36 Fälle an 7 Tagen 39 Fälle am 8 .. 37 Fälle am 9 .. 50 Fälle in 10 Tagen 20 Fälle am 11 .. 40 Fälle am 12 ..
6 2020-08-30 00:00:00 2020-09-05 00:00:00 34 Fälle in 30 Tagen 23 Fälle am 31 1. September 57 Fälle 35 Fälle in 2 Tagen 42 Fälle an 3 Tagen 49 Fälle an 4 Tagen 40 Fälle in 5 Tagen
7 2020-08-23 00:00:00 2020-08-29 00:00:00 26 Fälle am 23 .. 90 Fälle am 24 .. 54 Fälle am 25 .. 26 Tage 58 Fälle 56 Fälle am 27 .. 28 Tage 49 Fälle 29 Tage 38 Fälle
8 2020-08-16 00:00:00 2020-08-22 00:00:00 16 Tage 83 Fälle 54 Fälle am 17 .. 18 Tage 94 Fälle 108 Fälle am 19 .. 20 Tage 95 Fälle 21 Tage 69 Fälle 22 Tage 34 Fälle
9 2020-08-09 00:00:00 2020-08-15 00:00:00 68 Fälle am 9 .. 75 Fälle an 10 Tagen 57 Fälle am 11 .. 73 Fälle am 12 .. 77 Fälle am 13 .. 63 Fälle am 14 .. 87 Fälle am 15 ..
10 2020-08-02 00:00:00 2020-08-08 00:00:00 52 Fälle in 2 Tagen 43 Fälle in 3 Tagen 90 Fälle an 4 Tagen 84 Fälle an 5 Tagen 126 Fälle an 6 Tagen 141 Fälle an 7 Tagen 8 Tage 175 Fälle

Organisiert nach Datum

df2 = df1.melt(id_vars=["Start", "Ende"]).dropna()
Start Ende variable value
0 2020-10-04 00:00:00 2020-10-10 00:00:00 0 25 Fälle an 4 Tagen
1 2020-09-27 00:00:00 2020-10-03 00:00:00 0 18 Fälle am 27 ..
2 2020-09-20 00:00:00 2020-09-26 00:00:00 0 23 Fälle am 20 ..
3 2020-09-13 00:00:00 2020-09-19 00:00:00 0 13 Tage 35 Fälle
4 2020-09-06 00:00:00 2020-09-12 00:00:00 0 33 Fälle an 6 Tagen
5 2020-08-30 00:00:00 2020-09-05 00:00:00 0 34 Fälle in 30 Tagen
6 2020-08-23 00:00:00 2020-08-29 00:00:00 0 26 Fälle am 23 ..
7 2020-08-16 00:00:00 2020-08-22 00:00:00 0 16 Tage 83 Fälle
8 2020-08-09 00:00:00 2020-08-15 00:00:00 0 68 Fälle am 9 ..
9 2020-08-02 00:00:00 2020-08-08 00:00:00 0 52 Fälle in 2 Tagen

Unterteilt in Tage und Anzahl

df3 = (
    df2["value"]
    .str.extract("([0-9,]+)[Täglich]([0-9,]+)Fall",expand=True)
    .rename(columns={0: "Tag", 1: "Zwischensumme"})
    .astype(int)
)
Tag Zwischensumme
0 4 25
1 27 18
2 20 23
3 13 35
4 6 33
5 30 34
6 23 26
7 16 83
8 9 68
9 2 52

Kombinieren Sie Start / Ende und Datum / Nummer

df4 = pd.concat([df2, df3], axis=1)
Start Ende variable value Tag Zwischensumme
0 2020-10-04 00:00:00 2020-10-10 00:00:00 0 25 Fälle an 4 Tagen 4 25
1 2020-09-27 00:00:00 2020-10-03 00:00:00 0 18 Fälle am 27 .. 27 18
2 2020-09-20 00:00:00 2020-09-26 00:00:00 0 23 Fälle am 20 .. 20 23
3 2020-09-13 00:00:00 2020-09-19 00:00:00 0 13 Tage 35 Fälle 13 35
4 2020-09-06 00:00:00 2020-09-12 00:00:00 0 33 Fälle an 6 Tagen 6 33
5 2020-08-30 00:00:00 2020-09-05 00:00:00 0 34 Fälle in 30 Tagen 30 34
6 2020-08-23 00:00:00 2020-08-29 00:00:00 0 26 Fälle am 23 .. 23 26
7 2020-08-16 00:00:00 2020-08-22 00:00:00 0 16 Tage 83 Fälle 16 83
8 2020-08-09 00:00:00 2020-08-15 00:00:00 0 68 Fälle am 9 .. 9 68
9 2020-08-02 00:00:00 2020-08-08 00:00:00 0 52 Fälle in 2 Tagen 2 52

Von Tag zu Datum konvertieren

df4["Datum"] = df4.apply(
    lambda x: x["Start"].replace(day=x["Tag"])
    if x["Ende"].day < x["Tag"]
    else x["Ende"].replace(day=x["Tag"]),
    axis=1,
)
Start Ende variable value Tag Zwischensumme Datum
0 2020-10-04 00:00:00 2020-10-10 00:00:00 0 25 Fälle an 4 Tagen 4 25 2020-10-04 00:00:00
1 2020-09-27 00:00:00 2020-10-03 00:00:00 0 18 Fälle am 27 .. 27 18 2020-09-27 00:00:00
2 2020-09-20 00:00:00 2020-09-26 00:00:00 0 23 Fälle am 20 .. 20 23 2020-09-20 00:00:00
3 2020-09-13 00:00:00 2020-09-19 00:00:00 0 13 Tage 35 Fälle 13 35 2020-09-13 00:00:00
4 2020-09-06 00:00:00 2020-09-12 00:00:00 0 33 Fälle an 6 Tagen 6 33 2020-09-06 00:00:00
5 2020-08-30 00:00:00 2020-09-05 00:00:00 0 34 Fälle in 30 Tagen 30 34 2020-08-30 00:00:00
6 2020-08-23 00:00:00 2020-08-29 00:00:00 0 26 Fälle am 23 .. 23 26 2020-08-23 00:00:00
7 2020-08-16 00:00:00 2020-08-22 00:00:00 0 16 Tage 83 Fälle 16 83 2020-08-16 00:00:00
8 2020-08-09 00:00:00 2020-08-15 00:00:00 0 68 Fälle am 9 .. 9 68 2020-08-09 00:00:00
9 2020-08-02 00:00:00 2020-08-08 00:00:00 0 52 Fälle in 2 Tagen 2 52 2020-08-02 00:00:00

Datum und Zwischensumme

df = pd.DataFrame(
    {"Zwischensumme": df4.set_index("Datum")["Zwischensumme"].sort_index().asfreq("D", fill_value=0)}
)
Datum Zwischensumme
2020-02-02 00:00:00 1
2020-02-03 00:00:00 2
2020-02-04 00:00:00 1
2020-02-05 00:00:00 1
2020-02-06 00:00:00 0
2020-02-07 00:00:00 0
2020-02-08 00:00:00 0
2020-02-09 00:00:00 0
2020-02-10 00:00:00 0
2020-02-11 00:00:00 1
import datetime
import re

import pandas as pd


def my_parser(s):

    y = dt_now.year
    m, d = map(int, re.findall("(\d{1,2})", s))

    return pd.Timestamp(year=y, month=m, day=d)


def df_conv(df):

    df0 = df.iloc[1:].set_axis(["Zeitraum", "Nummer", "Nervenzusammenbruch"], axis=1)

    #Teilen Sie den Zeitraum in Start- und Enddatum, teilen Sie die Aufteilung nach Tag und kombinieren Sie sie
    df1 = pd.concat(
        [
            df0["Zeitraum"].str.split("~", expand=True).rename(columns={0: "Start", 1: "Ende"}),
            df0["Nervenzusammenbruch"].str.split("、", expand=True),
        ],
        axis=1,
    )

    #Auf Datum konvertieren
    df1["Start"] = df1["Start"].str.normalize("NFKC").apply(my_parser)
    df1["Ende"] = df1["Ende"].str.normalize("NFKC").apply(my_parser)

    #Organisiert nach Datum
    df2 = df1.melt(id_vars=["Start", "Ende"]).dropna()

    #Unterteilt in Tage und Anzahl
    df3 = (
        df2["value"]
        .str.extract("([0-9,]+)[Täglich]([0-9,]+)Fall",expand=True)
        .rename(columns={0: "Tag", 1: "Zwischensumme"})
        .astype(int)
    )

    #Kombinieren Sie Start / Ende und Datum / Nummer
    df4 = pd.concat([df2, df3], axis=1)

    #Von Tag zu Datum konvertieren
    df4["Datum"] = df4.apply(
        lambda x: x["Start"].replace(day=x["Tag"])
        if x["Ende"].day < x["Tag"]
        else x["Ende"].replace(day=x["Tag"]),
        axis=1,
    )

    #Datum und Zwischensumme
    df = pd.DataFrame(
        {"Zwischensumme": df4.set_index("Datum")["Zwischensumme"].sort_index().asfreq("D", fill_value=0)}
    )

    return df


JST = datetime.timezone(datetime.timedelta(hours=+9))
dt_now = datetime.datetime.now(JST)


dfs = pd.read_html(
    "https://www.pref.yamanashi.jp/koucho/coronavirus/info_coronavirus_data.html"
)

len(dfs)


#Inspektionsstatus von Pseudofällen am Präfekturinstitut für Gesundheit und Umwelt

df1 = df_conv(dfs[1])
df1.to_csv("pcr.csv", encoding="utf_8_sig")

#Rückkehrer / Kontaktberatungsstelle

df2 = df_conv(dfs[2])
df2.to_csv("soudan.csv", encoding="utf_8_sig")

#Konsultationszifferblatt für neue Coronavirus-Infektion

df3 = df_conv(dfs[3])
df3.to_csv("dial.csv", encoding="utf_8_sig")

Recommended Posts

Scraping Data Wrangling von statistischen Informationen über neue Coronavirus-Infektionen in der Präfektur Yamanashi
Ich habe versucht, PDF-Daten der medizinischen Online-Versorgung zu verwenden, die auf der Ausbreitung einer neuen Coronavirus-Infektion basieren
Werfen wir einen Blick auf die Infektionstendenz des neuen Coronavirus COVID-19 in jedem Land und den Status der medizinischen Reaktion (zusätzliche Informationen).
Vorverarbeitung von Präfekturdaten
Versuchen Sie, COVID-19 Tokyo-Daten mit Python zu kratzen
Web-Scraping-Informationen zu Lachprogrammen und Benachrichtigungen über LINE