[PYTHON] Aggregiert nach Präfektur / Stadt / Gemeinde / Stadt / Dorf aus dem PDF des wöchentlichen Bellmark-Empfangsstatus der Bellmark Education Grant Foundation

Einführung

Bellmark Education Grant Foundation Wöchentlicher Bellmark-Empfangsstatus Aggregiert aus PDF nach Präfektur / Stadt / Gemeinde / Stadt / Dorf

Derzeit wurde auch Webbellmark gestartet. Sie können über die Webbellmark-Website auf Ihren Lieblingsshop zugreifen und Bellmark-Punkte entsprechend Ihrem Einkauf sammeln.

Verfügbare Geschäfte

ウェブベルマーク.png

Sie können auch Jaran und Rakuten Travel verwenden, sodass Sie unterstützen können, ohne sich selbst zu bezahlen, indem Sie es verwenden, bevor Sie sich für Go To Travel bewerben.

Erläuterung

Dieser Prozess aggregiert den Grenzbereich der X- und Y-Koordinate zur Position vieler Koordinaten. Ich passe Dinge an, die viele Charaktere haben und sich in zwei Phasen befinden oder bei denen es eine leichte Abweichung gibt

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

Programm

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äfekturen", "Stadt", "Gemeinde, Stadt, Dorf", "Teilnehmende Gruppen", "Empfangsdatum"])
            dfs.append(df)

            time.sleep(3)

df = pd.concat(dfs)

df

df["Gemeinde"] = df["Stadt"].fillna("") + df["Gemeinde, Stadt, Dorf"].fillna("")

df1 = df.reindex(columns=["Präfekturen", "Gemeinde", "Teilnehmende Gruppen", "Empfangsdatum"])

df1.to_csv("data.csv")

df1

Durch die Präfektur

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

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

df1["Präfekturen"].value_counts(ascending=True).plot.barh(figsize=(5, 10))
#Grafik speichern
plt.savefig("01.png ", dpi=200, bbox_inches="tight")
plt.show()

01.png

Nach Stadt

s = df1.groupby(["Präfekturen", "Gemeinde"])["Gemeinde"].count().sort_values(ascending=True)

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

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

02.png

Recommended Posts

Aggregiert nach Präfektur / Stadt / Gemeinde / Stadt / Dorf aus dem PDF des wöchentlichen Bellmark-Empfangsstatus der Bellmark Education Grant Foundation
Lassen Sie uns den Entwicklungsstatus der Stadt anhand des Satellitenbildes erraten.