[PYTHON] Daten Langling PDF über den Ausbruch der Influenza durch das Ministerium für Gesundheit, Arbeit und Soziales

Einführung

Installation

pip install camelot
pip install pandas
pip install requests
pip install beautifulsoup4
pip install matplotlib
pip install japanize-matplotlib

Programm

import csv
import datetime
import pathlib
import re
from urllib.parse import urljoin

import camelot
import pandas as pd
import requests
from bs4 import BeautifulSoup
from pdfminer.high_level import extract_text

def fetch_file(url, dir="."):

    r = requests.get(url)
    r.raise_for_status()

    p = pathlib.Path(dir, pathlib.PurePath(url).name)
    p.parent.mkdir(parents=True, exist_ok=True)

    with p.open(mode="wb") as fw:
        fw.write(r.content)
    return p

url = "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kenkou_iryou/kenkou/kekkaku-kansenshou01/houdou_00008.html"

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
}

r = requests.get(url, headers=headers)
r.raise_for_status()

soup = BeautifulSoup(r.content, "html.parser")

d1 = []
d2 = []

for i in soup.select('ul.m-listLink > li > a[href$=".pdf"]')[::-1]:

    text = i.get_text(strip=True)

    t = re.match("(\d{4})Jahr(\d{1,2})Mond(\d{1,2})Tag", text)

    #Datum der Pressemitteilung

    if t:
        year, month, day = map(int, t.groups())
        dt_date = datetime.date(year, month, day)
    else:
        dt_date = datetime.date.today()

    #PDF Datei

    link = urljoin(url, i.get("href"))

    p = fetch_file(link)
    s = extract_text(p, page_numbers=[1])

    m = re.search("(\d{4})Jahr(\d{1,2})Woche\((\d{1,2})Mond(\d{1,2})So ~(\d{1,2})Mond(\d{1,2})Tag\)", s)

    if m:
        s_year, s_week, s_month, s_day, e_month, e_day = map(int, m.groups())

        dt_start = datetime.date(s_year, s_month, s_day)
        dt_end = datetime.date(s_year, e_month, e_day)

        if dt_start > dt_end:
            dt_end = datetime.date(s_year + 1, e_month, e_day)

        tables = camelot.read_pdf(
            link, pages="2", split_text=True, strip_text="  ,\n", line_scale=40
        )

        df_tmp = pd.DataFrame(
            tables[0].data[2:], columns=["Präfekturen", "Anzahl der Berichte", "Pro Fixpunkt"]
        ).set_index("Präfekturen")
        
        df_tmp = df_tmp.mask(df_tmp == "-").astype(float)
        df_tmp["Anzahl der Berichte"] = df_tmp["Anzahl der Berichte"].astype("Int64")

        df_tmp.loc["Jahr"] = s_year
        df_tmp.loc["Woche"] = s_week
        df_tmp.loc["Anfangsdatum"] = dt_start
        df_tmp.loc["Endtermin"] = dt_end

        s1 = df_tmp["Anzahl der Berichte"]
        s1.name = dt_date
        d1.append(s1)

        s2 = df_tmp["Pro Fixpunkt"]
        s2.name = dt_date
        d2.append(s2)

df1 = pd.concat(d1, axis=1, sort=False).T.astype({"Jahr": int, "Woche": int})

df2 = pd.concat(d2, axis=1, sort=False).T.astype({"Jahr": int, "Woche": int})

df3 = df1.join(df2, rsuffix="(Pro Fixpunkt)")

df = df3.reindex(
    columns=[
        "Jahr",
        "Woche",
        "Anfangsdatum",
        "Endtermin",
        "Hokkaido",
        "Hokkaido (pro Fixpunkt)",
        "Präfektur Aomori",
        "Präfektur Aomori (pro Fixpunkt)",
        "Präfektur Iwate",
        "Präfektur Iwate (pro Festpunkt)",
        "Präfektur Miyagi",
        "Präfektur Miyagi (pro Festpunkt)",
        "Akita",
        "Präfektur Akita (pro Fixpunkt)",
        "Präfektur Yamagata",
        "Präfektur Yamagata (pro Festpunkt)",
        "Präfektur Fukushima",
        "Präfektur Fukushima (pro Festpunkt)",
        "Präfektur Ibaraki",
        "Präfektur Ibaraki (pro Festpunkt)",
        "Präfektur Tochigi",
        "Präfektur Tochigi (pro Festpunkt)",
        "Präfektur Gunma",
        "Präfektur Gunma (pro Festpunkt)",
        "Saitama",
        "Präfektur Saitama (pro Festpunkt)",
        "Präfektur Chiba",
        "Präfektur Chiba (pro Festpunkt)",
        "Tokio",
        "Tokio (pro Festpunkt)",
        "Präfektur Kanagawa",
        "Präfektur Kanagawa (pro Festpunkt)",
        "Präfektur Niigata",
        "Präfektur Niigata (pro Festpunkt)",
        "Präfektur Toyama",
        "Präfektur Toyama (pro Festpunkt)",
        "Präfektur Ishikawa",
        "Präfektur Ishikawa (pro Festpunkt)",
        "Präfektur Fukui",
        "Präfektur Fukui (pro Festpunkt)",
        "Präfektur Yamanashi",
        "Präfektur Yamanashi (pro Fixpunkt)",
        "Präfektur Nagano",
        "Präfektur Nagano (pro Festpunkt)",
        "Präfektur Gifu",
        "Präfektur Gifu (pro Festpunkt)",
        "Präfektur Shizuoka",
        "Präfektur Shizuoka (pro Fixpunkt)",
        "Präfektur Aichi",
        "Präfektur Aichi (pro Festpunkt)",
        "Präfektur Mie",
        "Präfektur Mie (pro Festpunkt)",
        "Präfektur Shiga",
        "Präfektur Shiga (pro Festpunkt)",
        "Kyoto",
        "Kyoto (pro Festpunkt)",
        "Präfektur Osaka",
        "Osaka (pro Fixpunkt)",
        "Präfektur Hyogo",
        "Präfektur Hyogo (pro Festpunkt)",
        "Präfektur Nara",
        "Präfektur Nara (pro Festpunkt)",
        "Präfektur Wakayama",
        "Präfektur Wakayama (pro Festpunkt)",
        "Präfektur Tottori",
        "Präfektur Tottori (pro Festpunkt)",
        "Präfektur Shimane",
        "Präfektur Shimane (pro Festpunkt)",
        "Präfektur Okayama",
        "Präfektur Okayama (pro Festpunkt)",
        "Präfektur Hiroshima",
        "Präfektur Hiroshima (pro Festpunkt)",
        "Präfektur Yamaguchi",
        "Präfektur Yamaguchi (pro Festpunkt)",
        "Präfektur Tokushima",
        "Präfektur Tokushima (pro Festpunkt)",
        "Präfektur Kagawa",
        "Präfektur Kagawa (pro Festpunkt)",
        "Präfektur Ehime",
        "Präfektur Ehime (pro Festpunkt)",
        "Präfektur Kochi",
        "Präfektur Kochi (pro Fixpunkt)",
        "Präfektur Fukuoka",
        "Präfektur Fukuoka (pro Festpunkt)",
        "Präfektur Saga",
        "Präfektur Saga (pro Festpunkt)",
        "Präfektur Nagasaki",
        "Präfektur Nagasaki (pro Festpunkt)",
        "Präfektur Kumamoto",
        "Präfektur Kumamoto (pro Festpunkt)",
        "Präfektur Oita",
        "Präfektur Oita (pro Festpunkt)",
        "Präfektur Miyazaki",
        "Präfektur Miyazaki (pro Fixpunkt)",
        "Präfektur Kagoshima",
        "Präfektur Kagoshima (pro Festpunkt)",
        "Präfektur Okinawa",
        "Präfektur Okinawa (pro Fixpunkt)",
        "Gesamtzahl",
        "Gesamtzahl (pro Festpunkt)",
        "Letztes Jahr synchronisiert (insgesamt)",
        "Letztes Jahr synchronisiert (Gesamtzahl) (pro Fixpunkt)",
    ]
)

df.to_csv(
    "influ_all.csv", index=False, quoting=csv.QUOTE_NONNUMERIC, encoding="utf_8_sig", na_rep="-",
)

Visualisierung

import japanize_matplotlib
import matplotlib.pyplot as plt

#Auflösung
import matplotlib as mpl
mpl.rcParams['figure.dpi'] = 200

df1.set_index("Endtermin", inplace=True)

df1.loc[:, "Hokkaido": "Präfektur Okinawa"].fillna(0).plot.bar(subplots=True, layout=(7, 7), figsize=(30, 30), sharey=True)

#Grafik speichern
plt.savefig("influ.png ", dpi=200, bbox_inches="tight")
plt.show()

influ.png

Recommended Posts

Daten Langling PDF über den Ausbruch der Influenza durch das Ministerium für Gesundheit, Arbeit und Soziales
Data Langling (pdfplumber) PDF über den Ausbruch der Influenza durch das Ministerium für Gesundheit, Arbeit und Soziales
PDF-Datei mit der nationalen Liste der Mindestlöhne nach Regionen des Ministeriums für Gesundheit, Arbeit und Soziales
Datenbereinigung offener Daten zur Ereignissituation des Ministeriums für Gesundheit, Arbeit und Soziales
PDF-Kratzer über den Status testpositiver Personen in jeder Präfektur des Ministeriums für Gesundheit, Arbeit und Soziales
[Python] Lesen Sie automatisch Informationen der Präfektur des neuen Koronavirus aus dem PDF des Ministeriums für Gesundheit, Arbeit und Soziales und schreiben Sie sie in eine Tabelle oder in Excel.
[Python] Erstellen Sie ein Skript, das FeedParser und LINE Notify verwendet, um LINE über die neuesten Informationen zum neuen Koronavirus des Ministeriums für Gesundheit, Arbeit und Soziales zu informieren.
Scraping von IDWR-Bulletin-Daten nach Anzahl der Berichte pro Influenza-Fixpunkt und nach Präfektur
Extrahieren und zeichnen Sie die neuesten Bevölkerungsdaten aus den von der Stadt bereitgestellten PDF-Daten
Die Niederschlagsdaten der Meteorologischen Agentur kratzen und auf M5Stack anzeigen
Ich habe versucht, die Daten des Laptops durch Booten unter Ubuntu zu retten
Analyse von Finanzdaten durch Pandas und deren Visualisierung (2)
Analyse von Finanzdaten durch Pandas und deren Visualisierung (1)
Visualisierung von Daten anhand einer erklärenden Variablen und einer objektiven Variablen
Ich analysierte die Rangkampfdaten des Pokemon-Schwertschilds und visualisierte sie auf Tableau
Festkomma-Beobachtung bestimmter Daten im Web durch automatische Ausführung des Webbrowsers auf dem Server (Ubuntu16.04) (1) -Webbrowser-Installation-