Scraping Data Wrangling von statistischen Informationen über neue Coronavirus-Infektionen in der Präfektur Yamanashi
Einführung
Verfahren
- Teilen Sie den Zeitraum in Anfang und Ende, teilen Sie die Aufteilung nach Tag und kombinieren Sie sie
- Konvertieren Sie Start und Ende auf das Datum
- Nach Datum organisieren
- Teilen Sie in Tage und Zahlen
- Kombinieren Sie Start / Ende und Datum / Nummer
- Konvertieren Sie von Tag zu Datum
- 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
- Vergleichen Sie das Enddatum und den Tag, ersetzen Sie das Startdatum, wenn es größer ist, ersetzen Sie das Enddatum, wenn es kleiner ist, und erstellen Sie ein Datum
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")