C'est un sujet brûlant des données ouvertes maintenant, mais ce ne sont pas nécessairement des données brutes telles que CSV, donc cela peut être subtilement difficile à gérer. Bien sûr, le fait que nous publions de nouvelles données dont nous disposons est quelque chose qui mérite d’être loué, et nous l’attendons avec le sentiment que «je veux vraiment des données brutes». C'est pourquoi ce n'est pas mal car il a été publié en PDF, mais lors de l'utilisation des données, il est nécessaire de le rendre plus lisible par machine que le PDF. Cette fois, les données CSV sont basées sur les données PDF de À propos de la situation de la congestion dans la voiture pendant l'heure de pointe du matin publiées par le Bureau des transports de la ville de Sapporo. Je vais vous présenter la procédure de formation.
Le fichier PDF obtenu à partir du site Web ci-dessus a ce format
Pour le moment, les données sont structurées et cela ressemble à une sortie Excel sous forme de PDF. Donc, "de la structure à la voie de l'analyse" vient à l'esprit, mais il semblait que cela prendrait du temps et des efforts, comme le japonais stocké dans le tableau étant brouillé pendant l'analyse. C'est pourquoi j'ai conçu une procédure comme l'image ci-dessous.
Il était difficile d'utiliser un logiciel de traitement d'image, alors je l'ai écrit à la main sur mon iPad. En bref, en regardant certains fichiers PDF, j'ai trouvé que la cellule supérieure gauche est toujours dans la même position dans les tableaux de gauche et de droite, et que les tailles de cellule sont toutes les mêmes. Ensuite, si vous extrayez la valeur RVB (= couleur) du point rouge dans l'image et la convertissez en données de degré de congestion, vous obtiendrez les données souhaitées.
J'ai pu l'implémenter comme ça https://github.com/Kanahiro/sapporo_subway_analyze/
Sortie CSV comme ceci
Vous pouvez voir que la partie rouge est 4, la partie blanche est 0 et la partie bleue est 2. Maintenant, suivons les étapes de lecture du PDF → conversion en image → obtention de la couleur du pixel spécifié → génération des données de degré de congestion de la cellule à partir de la couleur → conversion en un fichier CSV.
Utilisez pdf2image. Consultez l'article ci-dessus pour savoir comment l'utiliser. Dans l'article, il est dit pip install poppler, mais actuellement, il ne peut pas être installé avec pip. Pour Linux: L'explication des autres systèmes d'exploitation est omise.
sudo apt install poppler-utils
Les données lues par pdf2image peuvent être converties en tableau numpy. En d'autres termes, le tableau RVB est inséré dans le tableau bidimensionnel qui correspond à la structure de pixels pour former un tableau tridimensionnel.
#convert_from_le chemin est une fonction de pdf2image
pdf_images = convert_from_path(pdffile)
img_array = np.asarray(pdf_images[0])
'''
img_échantillon de tableau
[[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
(Omis)
...
[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]]
Les bords du PDF sont blancs, donc c'est naturel, mais [255 255 255], c'est-à-dire tout est blanc. J'ai pu le stocker dans un tableau en unités de pixels.
Accès à un pixel spécifique (data_of_pixel)
x = START_CELL[0] + c * CELL_SIZE[0] #coordonnée x
y = START_CELL[1] + r * CELL_SIZE[1] #coordonnée y
data_of_pixel = img_array[y][x]
Ce sera. Vous pouvez maintenant obtenir la valeur RVB d'une partie spécifique de l'image convertie en PDF.
À partir de l'image ci-dessus, vous pouvez voir que la congestion est plus élevée dans l'ordre du blanc, du bleu clair, du bleu, du jaune et du rouge. Cependant, dans la zone de légende et de données en haut à droite, le PDF a été terminé avec des valeurs RVB légèrement différentes. Heureusement, il y a une grande différence de couleur d'une étape à l'autre, je voudrais donc juger ici par la taille de la différence de valeurs RVB entre la légende et les cellules dans la zone de données.
#Valeur RVB de la légende de la congestion
CROWD_RGBs = [
[255, 255, 255],
[112, 200, 241],
[57, 83, 164],
[246, 235, 20],
[237, 32, 36]
]
def rgb_to_type(rgb_list)->int:
#Seuil de différence de couleur
threshold = 50
color_array = np.asarray(rgb_list)
for i in range(len(CROWD_RGBs)):
crowd_rgb_array = np.asarray(CROWD_RGBs[i])
color_dist = abs(color_array - crowd_rgb_array)
sum_dist = color_dist.sum()
if sum_dist < threshold:
return i #0 -4 Combien de monde
La transmission d'une liste de valeurs RVB à cette fonction renverra le degré de congestion sous forme de valeur entière de 0 à 4. Ce que nous faisons, c'est comparer la valeur RVB du pixel que nous avons obtenu plus tôt avec la valeur RVB de la légende de congestion. La somme des valeurs absolues des différences entre les valeurs RVB est définie comme la différence de couleur, et si la différence est dans les 50, le degré de congestion est déterminé.
Avec cela, le degré de congestion de toutes les cellules est évalué, et s'il est converti en CSV, les données CSV au début sont terminées.
Ce type de traitement est une certaine histoire dans le domaine des données ouvertes. Certaines personnes ont dit qu'elles feraient du riz avec des gâteaux de riz, mais est-ce que je peux me qualifier d'alchimiste? Cependant, après tout, le riz ne peut pas être fondu sans données primaires (mochi), donc je suis seulement reconnaissant pour cela, merci toujours. Puisque la quantité de données a augmenté, je me demande si la prochaine étape sera la qualité de ces données ...
Recommended Posts