[PYTHON] Extraire et tracer les dernières données démographiques à partir des données PDF fournies par la ville

Les villes et les quartiers préfèrent les fichiers PDF pour fournir des données. Nous allons essayer de convertir les données dans un format aussi gênant en utilisant une commande pour les convertir au format texte et les tracer en utilisant les données de Gotenba City. (Il correspond aux données au 08 juin 2017 de l'administration.)

Préparation préalable

  1. BeautifulSoup de python
  2. R zoo
  3. Linux poppler, parallèle, wget

La méthode d'installation est la suivante.

# pip install bs4
$ R
> install.packages("zoo")
# pacman -S poppler parallel wget

Script créé

get_pdf_links.py


import urllib.request
from bs4 import BeautifulSoup
import re

url = "http://www.city.gotemba.shizuoka.jp/gyousei/g-6/g-6-1/2475.html"
req = urllib.request.Request(url, headers={'User-Agent': "Magic Browser"})
con = urllib.request.urlopen(req)
soup = BeautifulSoup(con.read(), 'html.parser')
result = soup.find_all("li")
li = []
for link in result:
    if re.match(r'.*PDF.*', link.get_text()) is not None:
        li.append(link.find("a")['href'])

for link in li:
    print(link)

pdf/print_data.py


import re, os

txt_files = []
for filename in os.listdir('.'):
    if filename.endswith('txt'):
        txt_files.append(filename)

txt_files.remove(".txt")

data = []
for filename in txt_files:
    fp = open(filename)
    year = None
    month = None
    population = None
    for i,line in enumerate(fp):
        if i == 0:
            year = re.sub(r'Heisei([0-9]+)Année.*$', r'\1', line)
            year = year.replace("\n","")
            month = re.sub(r'Heisei[0-9]+Année([0-9]+)Mois.*$', r'\1', line)
            month = month.replace("\n","")
        elif i == 554:
            population = line.replace(",","")
            population = population.replace("\n","")
    data.append([int(year), int(month), int(population)])
    fp.close()
data_fmt = []
for val in data:
    data_fmt.append([val[0]+1988, val[1], val[2]])

data_fmt.sort()
data_fmt2 = []
for val in data_fmt:
    data_fmt2.append([str(val[0])+"-"+str(val[1]), val[2]])

print("date, population")
for val in data_fmt2:
    print(val[0]+","+str(val[1]))

pdf/plot_data.R


library(zoo)
data <- read.csv("data.csv", header=T)
z <- read.zoo(data, FUN = as.yearmon)
plot(z)

Script d'exécution

process.sh


#/bin/bash

python get_pdf_links.py | parallel --gnu "wget {}"
mv *.pdf pdf
cd pdf
for file in *.pdf; do pdftotext "$file" "$file.txt"; done
rm dd92f76ed99f94259ade29d559663bc1.pdf.txt
rm 7a76d9a16bcc1ce29875b76a6ef12a2e.pdf.txt 
python print_data.py > data.csv
Rscript plot_data.R

Les données de sortie sont Rplots.pdf en pdf

Des données de sortie

Screenshot from 2017-06-08 15-36-54.png

Mise en garde

Les fichiers PDF sont bons pour l'impression et les rendre plus faciles à lire, mais ils peuvent être fastidieux à analyser en texte brut. Selon le PDF, l'image capturée peut être incorporée à la place du texte, il peut donc ne pas être possible de l'ouvrir du tout. Par conséquent, rm supprime les fichiers qui ne peuvent pas être ouverts par process.sh. Il n'existe aucune solution de contournement pour ces fichiers.

Demande personnelle

Si le gouvernement souhaite visualiser les données, le format de fichier doit être non seulement PDF, mais également au format texte brut tel que csv. Vous ne pouvez pas obtenir de nouvelles informations simplement en regardant les graphiques agrégés. En lisant les données brutes sous forme de valeurs numériques, un large éventail d'analyses est possible.

Recommended Posts

Extraire et tracer les dernières données démographiques à partir des données PDF fournies par la ville
L'analyse d'image a été facile à l'aide des données et de l'API fournies par Microsoft COCO
Extraire des images et des tableaux de pdf avec python pour réduire la charge de reporting
Data Langling PDF sur l'épidémie de grippe par le ministère de la Santé, du Travail et du Bien-être social
Extraction de données depuis S3
Suivez la structure de données de Blender et extrayez les coordonnées des sommets de fbx
Récupérer les données souhaitées du site Web en liant Python et Excel
Traiter les données extraites d'un certain système de point de vente pour créer un tableau récapitulatif par produit et par heure
Gzip compresser les données en streaming
Extraire les données csv et calculer
Début de l'analyse de l'encyclopédie Nico Nico ~ Appuyez sur les données fournies par JSON
Extraire le texte du pdf [python] et lire les caractères à haute voix avec Open-Jtalk
Préparez un environnement d'analyse haute vitesse en accédant à mysql depuis l'environnement d'analyse de données