[PYTHON] Agréger par préfecture / ville / quartier / ville / village à partir du PDF du statut de réception hebdomadaire Bellmark de la Fondation Bellmark Education Grant

introduction

Bellmark Education Grant Foundation État de la réception hebdomadaire Bellmark Agrégé à partir du PDF par préfecture / ville / quartier / ville / village

Actuellement, Webbellmark a également commencé, et vous pouvez accéder à votre boutique préférée depuis le site webbellmark et collecter des points de repère en fonction de vos achats.

Boutiques disponibles

ウェブベルマーク.png

Vous pouvez également utiliser Jaran et Rakuten Travel, de sorte que vous pouvez soutenir sans vous payer en l'utilisant simplement avant de postuler à Go To Travel.

Explication

Ce processus regroupe ce qui se trouve dans la plage limite de la coordonnée X et de la coordonnée Y à la position de nombreuses coordonnées. J'ajuste ceux avec de nombreux caractères et deux colonnes, et ceux qui sont légèrement désalignés

def snap_adjustment(s, limit=5):

    count = s.value_counts().sort_index()

    index = 0
    value = 0

    for i, v in count.items():

        if (i - index) < limit:

            if v > value:
                s = s.replace(index, i)
                index = i
                value = v

            else:
                s = s.replace(i, index)

        else:
            index = i
            value = v

    return s

programme

import pathlib
import time

import pandas as pd
import pdfplumber
import requests
from bs4 import BeautifulSoup


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


def snap_adjustment(s, limit=5):

    count = s.value_counts().sort_index()

    index = 0
    value = 0

    for i, v in count.items():

        if (i - index) < limit:

            if v > value:
                s = s.replace(index, i)
                index = i
                value = v

            else:
                s = s.replace(i, index)

        else:
            index = i
            value = v

    return s


url = "https://www.bellmark.or.jp/collect/accept.htm"

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

links = {
    href.get("href")
    for href in soup.select("div.cal-process > div.cal-row-date > div > a")
}

dfs = []

for link in links:

    p = fetch_file(link)

    with pdfplumber.open(p) as pdf:

        for page in pdf.pages:

            crop = page.within_bbox((0, 65, page.width, page.height - 40))

            df_tmp = (
                pd.DataFrame(crop.extract_words(keep_blank_chars=True))
                .astype({"x0": float, "x1": float, "top": float, "bottom": float})
                .sort_values(["top", "x0"])
            )

            df_tmp["top"] = snap_adjustment(df_tmp["top"], 6)
            df_tmp["x0"] = snap_adjustment(df_tmp["x0"])

            table = (
                df_tmp.pivot_table(
                    index=["top"],
                    columns="x0",
                    values="text",
                    aggfunc=lambda x: "".join(str(v) for v in x),
                )
            ).values

            df = pd.DataFrame(table, columns=["Préfectures", "ville", "Ward, ville, village", "Groupes participants", "Date de réception"])
            dfs.append(df)

            time.sleep(3)

df = pd.concat(dfs)

df

df["Municipalité"] = df["ville"].fillna("") + df["Ward, ville, village"].fillna("")

df1 = df.reindex(columns=["Préfectures", "Municipalité", "Groupes participants", "Date de réception"])

df1.to_csv("data.csv")

df1

Par préfecture

import japanize_matplotlib
import matplotlib as mpl
import matplotlib.pyplot as plt

mpl.rcParams["figure.dpi"] = 200

df1["Préfectures"].value_counts(ascending=True).plot.barh(figsize=(5, 10))
#Enregistrer le graphique
plt.savefig("01.png ", dpi=200, bbox_inches="tight")
plt.show()

01.png

Par ville

s = df1.groupby(["Préfectures", "Municipalité"])["Municipalité"].count().sort_values(ascending=True)

s.tail(50).plot.barh(figsize=(5, 10))

#Enregistrer le graphique
plt.savefig("02.png ", dpi=200, bbox_inches="tight")
plt.show()

02.png

Recommended Posts

Agréger par préfecture / ville / quartier / ville / village à partir du PDF du statut de réception hebdomadaire Bellmark de la Fondation Bellmark Education Grant
Devinons l'état de développement de la ville à partir de l'image satellite.