Grattage des données et des informations statistiques sur les nouvelles infections à coronavirus dans la préfecture de Yamanashi
introduction
procédure
- Divisez la période en début et en fin, divisez la ventilation par jour, combinez
- Convertissez le début et la fin en date
- Organiser par date
- Divisez en jours et en nombre
- Combinez début / fin et date / numéro
- Conversion d'un jour à l'autre
- Date et sous-total
Grattage
dfs = pd.read_html(
"https://www.pref.yamanashi.jp/koucho/coronavirus/info_coronavirus_data.html"
)
df0 = df.iloc[1:].set_axis(["période", "nombre", "Panne"], axis=1)
|
période |
nombre |
Panne |
1 |
4 octobre (dim) - 10 octobre (samedi) |
25 |
25 caisses en 4 jours |
2 |
27 septembre (dimanche) - 3 octobre (samedi) |
245 |
27 jours 18 cas, 28 jours 21 cas, 29 jours 56 cas, 30 jours 46 cas, 1 octobre 44 cas, 2 jours 27 cas, 3 jours 33 cas |
3 |
20 septembre (dim) -26 septembre (sam) |
230 |
20e 23 cas, 21e 23 cas, 22e 17 cas, 23e 38 cas, 24e 44 cas, 25e 32 cas, 26e 53 cas |
4 |
13 septembre (dim) - 19 septembre (sam) |
296 |
13e 35 cas, 14e 63 cas, 15e 51 cas, 16e 29 cas, 17e 48 cas, 18e 31 cas, 19e 39 cas |
5 |
6 septembre (dim) - 12 septembre (sam) |
285 |
6 jours 33 cas, 7 jours 36 cas, 8 jours 39 cas, 9 jours 37 cas, 10 jours 50 cas, 11 jours 20 cas, 12 jours 40 cas |
6 |
30 août (dimanche) - 5 septembre (samedi) |
280 |
30 jours 34 cas, 31 jours 23 cas, 1 septembre 57 cas, 2 jours 35 cas, 3 jours 42 cas, 4 jours 49 cas, 5 jours 40 cas |
7 |
23 août (dim) -29 août (sam) |
371 |
23 jours 26 cas, 24 jours 90 cas, 25 jours 54 cas, 26 jours 58 cas, 27 jours 56 cas, 28 jours 49 cas, 29 jours 38 cas |
8 |
16 août (dim) - 22 août (sam) |
537 |
16 jours 83 cas, 17 jours 54 cas, 18 jours 94 cas, 19 jours 108 cas, 20 jours 95 cas, 21 jours 69 cas, 22 jours 34 cas |
9 |
9 août (dim) - 15 août (sam) |
500 |
9 jours 68 cas, 10 jours 75 cas, 11 jours 57 cas, 12 jours 73 cas, 13 jours 77 cas, 14 jours 63 cas, 15 jours 87 cas |
10 |
2 août (dim) -8 août (sam) |
711 |
2 jours 52 cas, 3 jours 43 cas, 4 jours 90 cas, 5 jours 84 cas, 6 jours 126 cas, 7 jours 141 cas, 8 jours 175 cas |
Data wrangling
Divisez la période en début et en fin, divisez la ventilation par jour, combinez
df1 = pd.concat(
[
df0["période"].str.split("~", expand=True).rename(columns={0: "début", 1: "Fin"}),
df0["Panne"].str.split("、", expand=True),
],
axis=1,
)
|
début |
Fin |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
1 |
4 octobre (dimanche) |
Samedi 10 octobre |
25 caisses en 4 jours |
|
|
|
|
|
|
2 |
27 septembre (dimanche) |
Samedi 3 octobre |
18 cas le 27 |
28 jours 21 cas |
29 jours 56 cas |
46 cas en 30 jours |
1er octobre 44 cas |
27 cas en 2 jours |
33 cas en 3 jours |
3 |
20 septembre (dimanche) |
Samedi 26 septembre |
23 cas le 20 |
21 jours 23 cas |
22 jours 17 cas |
23 jours 38 cas |
44 cas le 24 |
32 cas le 25 |
26 jours 53 cas |
4 |
13 septembre (dimanche) |
Samedi 19 septembre |
13 jours 35 cas |
63 cas le 14 |
51 cas le 15 |
29 cas le 16 |
17 jours 48 cas |
18 jours 31 cas |
39 cas le 19 |
5 |
6 septembre (dim.) |
Samedi 12 septembre |
33 cas en 6 jours |
36 caisses en 7 jours |
39 cas le 8 |
37 cas le 9 |
50 cas en 10 jours |
20 cas le 11 |
40 cas le 12 |
6 |
30 août (dimanche) |
Samedi 5 septembre |
34 cas en 30 jours |
23 cas le 31 |
1 septembre 57 cas |
35 cas en 2 jours |
42 cas en 3 jours |
49 cas en 4 jours |
40 cas en 5 jours |
7 |
Dimanche 23 août |
Samedi 29 août |
26 cas le 23 |
90 cas le 24 |
54 cas le 25 |
26 jours 58 cas |
27 jours 56 cas |
28 jours 49 cas |
29 jours 38 cas |
8 |
16 août (dimanche) |
Samedi 22 août |
16 jours 83 cas |
54 cas le 17 |
18 jours 94 cas |
108 cas le 19 |
20 jours 95 cas |
21 jours 69 cas |
22 jours 34 cas |
9 |
9 août (dimanche) |
Samedi 15 août |
68 cas le 9 |
75 caisses sur 10 jours |
57 cas le 11 |
73 cas le 12 |
77 cas le 13 |
63 cas le 14 |
87 cas le 15 |
10 |
2 août (dimanche) |
Samedi 8 août |
52 cas en 2 jours |
43 cas en 3 jours |
90 cas sur 4 jours |
84 cas en 5 jours |
126 cas en 6 jours |
141 cas en 7 jours |
8 jours 175 cas |
Convertir le début et la fin en date
df1["début"] = df1["début"].str.normalize("NFKC").apply(my_parser)
df1["Fin"] = df1["Fin"].str.normalize("NFKC").apply(my_parser)
|
début |
Fin |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
1 |
2020-10-04 00:00:00 |
2020-10-10 00:00:00 |
25 caisses en 4 jours |
|
|
|
|
|
|
2 |
2020-09-27 00:00:00 |
2020-10-03 00:00:00 |
18 cas le 27 |
28 jours 21 cas |
29 jours 56 cas |
46 cas en 30 jours |
1er octobre 44 cas |
27 cas en 2 jours |
33 cas en 3 jours |
3 |
2020-09-20 00:00:00 |
2020-09-26 00:00:00 |
23 cas le 20 |
21 jours 23 cas |
22 jours 17 cas |
23 jours 38 cas |
44 cas le 24 |
32 cas le 25 |
26 jours 53 cas |
4 |
2020-09-13 00:00:00 |
2020-09-19 00:00:00 |
13 jours 35 cas |
63 cas le 14 |
51 cas le 15 |
29 cas le 16 |
17 jours 48 cas |
18 jours 31 cas |
39 cas le 19 |
5 |
2020-09-06 00:00:00 |
2020-09-12 00:00:00 |
33 cas en 6 jours |
36 caisses en 7 jours |
39 cas le 8 |
37 cas le 9 |
50 cas en 10 jours |
20 cas le 11 |
40 cas le 12 |
6 |
2020-08-30 00:00:00 |
2020-09-05 00:00:00 |
34 cas en 30 jours |
23 cas le 31 |
1 septembre 57 cas |
35 cas en 2 jours |
42 cas en 3 jours |
49 cas en 4 jours |
40 cas en 5 jours |
7 |
2020-08-23 00:00:00 |
2020-08-29 00:00:00 |
26 cas le 23 |
90 cas le 24 |
54 cas le 25 |
26 jours 58 cas |
27 jours 56 cas |
28 jours 49 cas |
29 jours 38 cas |
8 |
2020-08-16 00:00:00 |
2020-08-22 00:00:00 |
16 jours 83 cas |
54 cas le 17 |
18 jours 94 cas |
108 cas le 19 |
20 jours 95 cas |
21 jours 69 cas |
22 jours 34 cas |
9 |
2020-08-09 00:00:00 |
2020-08-15 00:00:00 |
68 cas le 9 |
75 caisses sur 10 jours |
57 cas le 11 |
73 cas le 12 |
77 cas le 13 |
63 cas le 14 |
87 cas le 15 |
10 |
2020-08-02 00:00:00 |
2020-08-08 00:00:00 |
52 cas en 2 jours |
43 cas en 3 jours |
90 cas sur 4 jours |
84 cas en 5 jours |
126 cas en 6 jours |
141 cas en 7 jours |
8 jours 175 cas |
Organisé par date
df2 = df1.melt(id_vars=["début", "Fin"]).dropna()
|
début |
Fin |
variable |
value |
0 |
2020-10-04 00:00:00 |
2020-10-10 00:00:00 |
0 |
25 caisses en 4 jours |
1 |
2020-09-27 00:00:00 |
2020-10-03 00:00:00 |
0 |
18 cas le 27 |
2 |
2020-09-20 00:00:00 |
2020-09-26 00:00:00 |
0 |
23 cas le 20 |
3 |
2020-09-13 00:00:00 |
2020-09-19 00:00:00 |
0 |
13 jours 35 cas |
4 |
2020-09-06 00:00:00 |
2020-09-12 00:00:00 |
0 |
33 cas en 6 jours |
5 |
2020-08-30 00:00:00 |
2020-09-05 00:00:00 |
0 |
34 cas en 30 jours |
6 |
2020-08-23 00:00:00 |
2020-08-29 00:00:00 |
0 |
26 cas le 23 |
7 |
2020-08-16 00:00:00 |
2020-08-22 00:00:00 |
0 |
16 jours 83 cas |
8 |
2020-08-09 00:00:00 |
2020-08-15 00:00:00 |
0 |
68 cas le 9 |
9 |
2020-08-02 00:00:00 |
2020-08-08 00:00:00 |
0 |
52 cas en 2 jours |
Divisé en jours et en nombre
df3 = (
df2["value"]
.str.extract("([0-9,]+)[du quotidien]([0-9,]+)Cas",expand=True)
.rename(columns={0: "journée", 1: "total"})
.astype(int)
)
|
journée |
total |
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 |
Combiner début / fin et date / numéro
df4 = pd.concat([df2, df3], axis=1)
|
début |
Fin |
variable |
value |
journée |
total |
0 |
2020-10-04 00:00:00 |
2020-10-10 00:00:00 |
0 |
25 caisses en 4 jours |
4 |
25 |
1 |
2020-09-27 00:00:00 |
2020-10-03 00:00:00 |
0 |
18 cas le 27 |
27 |
18 |
2 |
2020-09-20 00:00:00 |
2020-09-26 00:00:00 |
0 |
23 cas le 20 |
20 |
23 |
3 |
2020-09-13 00:00:00 |
2020-09-19 00:00:00 |
0 |
13 jours 35 cas |
13 |
35 |
4 |
2020-09-06 00:00:00 |
2020-09-12 00:00:00 |
0 |
33 cas en 6 jours |
6 |
33 |
5 |
2020-08-30 00:00:00 |
2020-09-05 00:00:00 |
0 |
34 cas en 30 jours |
30 |
34 |
6 |
2020-08-23 00:00:00 |
2020-08-29 00:00:00 |
0 |
26 cas le 23 |
23 |
26 |
7 |
2020-08-16 00:00:00 |
2020-08-22 00:00:00 |
0 |
16 jours 83 cas |
16 |
83 |
8 |
2020-08-09 00:00:00 |
2020-08-15 00:00:00 |
0 |
68 cas le 9 |
9 |
68 |
9 |
2020-08-02 00:00:00 |
2020-08-08 00:00:00 |
0 |
52 cas en 2 jours |
2 |
52 |
Convertir d'un jour à l'autre
- Comparez la date et le jour de fin, remplacez la date de début si elle est plus grande, remplacez la date de fin si elle est plus petite et créez une date
df4["Date"] = df4.apply(
lambda x: x["début"].replace(day=x["journée"])
if x["Fin"].day < x["journée"]
else x["Fin"].replace(day=x["journée"]),
axis=1,
)
|
début |
Fin |
variable |
value |
journée |
total |
Date |
0 |
2020-10-04 00:00:00 |
2020-10-10 00:00:00 |
0 |
25 caisses en 4 jours |
4 |
25 |
2020-10-04 00:00:00 |
1 |
2020-09-27 00:00:00 |
2020-10-03 00:00:00 |
0 |
18 cas le 27 |
27 |
18 |
2020-09-27 00:00:00 |
2 |
2020-09-20 00:00:00 |
2020-09-26 00:00:00 |
0 |
23 cas le 20 |
20 |
23 |
2020-09-20 00:00:00 |
3 |
2020-09-13 00:00:00 |
2020-09-19 00:00:00 |
0 |
13 jours 35 cas |
13 |
35 |
2020-09-13 00:00:00 |
4 |
2020-09-06 00:00:00 |
2020-09-12 00:00:00 |
0 |
33 cas en 6 jours |
6 |
33 |
2020-09-06 00:00:00 |
5 |
2020-08-30 00:00:00 |
2020-09-05 00:00:00 |
0 |
34 cas en 30 jours |
30 |
34 |
2020-08-30 00:00:00 |
6 |
2020-08-23 00:00:00 |
2020-08-29 00:00:00 |
0 |
26 cas le 23 |
23 |
26 |
2020-08-23 00:00:00 |
7 |
2020-08-16 00:00:00 |
2020-08-22 00:00:00 |
0 |
16 jours 83 cas |
16 |
83 |
2020-08-16 00:00:00 |
8 |
2020-08-09 00:00:00 |
2020-08-15 00:00:00 |
0 |
68 cas le 9 |
9 |
68 |
2020-08-09 00:00:00 |
9 |
2020-08-02 00:00:00 |
2020-08-08 00:00:00 |
0 |
52 cas en 2 jours |
2 |
52 |
2020-08-02 00:00:00 |
Date et sous-total
df = pd.DataFrame(
{"total": df4.set_index("Date")["total"].sort_index().asfreq("D", fill_value=0)}
)
Date |
total |
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(["période", "nombre", "Panne"], axis=1)
#Divisez la période en date de début et date de fin, divisez la ventilation par jour, combinez
df1 = pd.concat(
[
df0["période"].str.split("~", expand=True).rename(columns={0: "début", 1: "Fin"}),
df0["Panne"].str.split("、", expand=True),
],
axis=1,
)
#Convertir en date
df1["début"] = df1["début"].str.normalize("NFKC").apply(my_parser)
df1["Fin"] = df1["Fin"].str.normalize("NFKC").apply(my_parser)
#Organisé par date
df2 = df1.melt(id_vars=["début", "Fin"]).dropna()
#Divisé en jours et en nombre
df3 = (
df2["value"]
.str.extract("([0-9,]+)[du quotidien]([0-9,]+)Cas",expand=True)
.rename(columns={0: "journée", 1: "total"})
.astype(int)
)
#Combiner début / fin et date / numéro
df4 = pd.concat([df2, df3], axis=1)
#Convertir d'un jour à l'autre
df4["Date"] = df4.apply(
lambda x: x["début"].replace(day=x["journée"])
if x["Fin"].day < x["journée"]
else x["Fin"].replace(day=x["journée"]),
axis=1,
)
#Date et sous-total
df = pd.DataFrame(
{"total": df4.set_index("Date")["total"].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)
#État de l'inspection des pseudo cas à l'Institut Préfectoral de Santé et Environnement
df1 = df_conv(dfs[1])
df1.to_csv("pcr.csv", encoding="utf_8_sig")
#Retour au centre de consultation / contact
df2 = df_conv(dfs[2])
df2.to_csv("soudan.csv", encoding="utf_8_sig")
#Cadran de consultation pour une nouvelle infection à coronavirus
df3 = df_conv(dfs[3])
df3.to_csv("dial.csv", encoding="utf_8_sig")