[PYTHON] Grattage des données et des informations statistiques sur les nouvelles infections à coronavirus dans la préfecture de Yamanashi

Grattage des données et des informations statistiques sur les nouvelles infections à coronavirus dans la préfecture de Yamanashi

introduction

yamanashi.png

procédure

  1. Divisez la période en début et en fin, divisez la ventilation par jour, combinez
  2. Convertissez le début et la fin en date
  3. Organiser par date
  4. Divisez en jours et en nombre
  5. Combinez début / fin et date / numéro
  6. Conversion d'un jour à l'autre
  7. 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

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

Recommended Posts

Grattage des données et des informations statistiques sur les nouvelles infections à coronavirus dans la préfecture de Yamanashi
J'ai essayé d'utiliser des données PDF de soins médicaux en ligne basés sur la propagation d'une nouvelle infection à coronavirus
Jetons un coup d'œil à la tendance infectieuse du nouveau coronavirus COVID-19 dans chaque pays et à l'état de la réponse médicale (informations supplémentaires).
Pré-traitement des données préfectorales
Essayez de gratter les données COVID-19 Tokyo avec Python
Informations de raclage Web sur les programmes de rire et notification en ligne