[PYTHON] [Visualisierung mit Folium] Ich habe das Gefühl, dass Famima in den letzten Jahren zu stark zugenommen hat.

Dies ist der Artikel zum 21. Tag von MYJLab Adventskalender 2019. Thatchy wird verantwortlich sein. (Entschuldigung für die Verspätung)

Diesmal

Machen

Vor kurzem gab es in meiner Heimatstadt ein Phänomen, bei dem es auf der anderen Straßenseite Familienmärkte gibt. Um dieses Phänomen zu visualisieren, möchte ich die Zunahme der Anzahl der Family Mart-Geschäfte auf einer Zeitreihen-Wärmekarte für jede Präfektur zeigen.

Was zu verwenden

Es gibt eine Bibliothek namens Leaflet, mit der Sie schöne Karten mit JavaScript zeichnen können. Dieses Mal werde ich eine Zeitreihen-Heatmap mit einer Bibliothek namens Folium erstellen, die es ermöglicht, Leaflet in Python zu verwenden.

Zeichne sofort

Ausführungsumgebung

Die Funktionen und die Verwendung von Folium variieren je nach Version. Stellen Sie daher die Version dieses Mal auf 0.10.1 ein.

#Bibliothekslast
import pandas as pd
import folium
from folium import plugins

Datenaufbereitung

Die Anzahl der Geschäfte von Family Mart für jede Präfektur von 1999 bis 2019 auf der Website von hier wurde in eine CSV-Datei konvertiert und die Daten wurden vorbereitet. .. Es wurde entwickelt, um von Python-Anfragen gelöscht zu werden. Außerdem werden beim Zeichnen auf der Karte der Breiten- und Längengrad jeder Präfektur benötigt. Diesmal ist der Ort, an dem sich das Präfekturbüro befindet, der Breiten- und Längengrad jeder Präfektur. Die Daten können von [hier] heruntergeladen werden (https://github.com/dataofjapan/land/blob/master/prefecturalCapital.csv).

#Daten zur Anzahl der Filialen
import requests
import io

URL = "https://drive.google.com/uc?id=1-8tppvHwwVJWufYVskTfGz7cCrBIE0SM"
r = requests.get(URL)
famima_data = pd.read_csv(io.BytesIO(r.content))
famima_data.head()
スクリーンショット 2019-12-21 15.22.03.png

Aufgrund des Anstiegs in den letzten Jahren hat die Anzahl der fehlenden Werte von 1999 bis 2006 erheblich zugenommen.

#Breite und Länge des Präfekturbüros
geo_data = pd.read_csv("./data/prefecturalCapital.csv")
geo_data.head()
スクリーンショット 2019-12-21 15.29.01.png

Kombinieren Sie dann die beiden Datenrahmen. Ich möchte mit der ID als Schlüssel kombinieren, also ändere die ID von geo_data auf 0 und kombiniere. Der fehlende Wert wird einmal auf 0 gesetzt.

import numpy as np

geo_data.id = geo_data.id - 1
merged_data = pd.merge(famima_data, geo_data[["id", "lat", "lon"]], on=["id"])
merged_data = merged_data.replace(np.nan, 0)
merged_data.head()
スクリーンショット 2019-12-21 18.02.45.png

Die Basisdaten sind fertig.

In zunehmende Daten konvertieren

Dieses Mal möchte ich die Änderung der Anzahl der Geschäfte visualisieren, damit ich den Unterschied in den Spalten berücksichtigen kann.

#Holen Sie sich ein Array von Zeitreihenspaltennamen
time_columns = merged_data.columns[2:23].values

#Diff, indem Sie den Unterschied nur im Datenteil der Anzahl der Geschäfte nehmen_Lass es Daten sein
merged_data.loc[:, time_columns] = merged_data.loc[:, time_columns].astype(float)
diff_data = merged_data.copy()
diff_data.loc[:, time_columns]  = merged_data.loc[:, time_columns].diff(axis=1)

#Da die Daten für 1999 verloren gehen, löschen Sie sie.
diff_data = diff_data.dropna(axis=1)
time_columns = time_columns[1:]

diff_data.head()
スクリーンショット 2019-12-21 19.06.26.png

Wenn die Differenz erhalten ist, führen Sie eine Min-Max-Skalierung durch. In der Folium-Wärmekarte ist 0 unpraktisch, also addiere 1e-4 zum Ganzen.

# diff_Daten skalieren und skalieren_Lass es Daten sein
scaled_data = diff_data.copy()

scaled_data.loc[:, time_columns] = (diff_data.loc[:, time_columns] - diff_data.loc[:, time_columns] .min().min()) / (diff_data.loc[:, time_columns] .max().max() - diff_data.loc[:, time_columns] .min().min())
scaled_data.loc[:, time_columns] = scaled_data.loc[:, time_columns] + 1e-4
scaled_data.head()
スクリーンショット 2019-12-21 19.11.27.png

Zum Schluss eine Zeitreihen-Wärmekarte zeichnen Erstellen Sie 3D-Daten, die Breitengrad, Längengrad, Daten * 47 Präfekturen * 1999 ~ 2019] sind.

heat_map_data = [[[row['lat'],row['lon'], row[idx]] for index, row in scaled_data.iterrows()] for idx in time_columns]

#Da die Form der Daten schwer zu verstehen ist, wird nur die erste Ausgabe
heat_map_data[0]
#Ausgabe
[[43.064359, 141.347449, 0.051760516605166056],
 [40.824294, 140.74005400000001, 0.051760516605166056],
 [39.70353, 141.15266699999998, 0.05545055350553506],
 [38.268737, 140.872183, 0.060985608856088565],
 [39.718175, 140.10335600000002, 0.051760516605166056],
 [38.240127, 140.362533, 0.07390073800738008],
 [37.750146, 140.466754, 0.0923509225092251],
 [36.341817, 140.446796, 0.04807047970479705],
 [36.56575, 139.883526, 0.05545055350553506],
 [36.391205, 139.060917, 0.060985608856088565],
 [35.857771, 139.647804, 0.060985608856088565],
 [35.604563, 140.123179, 0.04807047970479705],
 [35.689184999999995, 139.691648, 0.0997309963099631],
 [35.447505, 139.642347, 0.06467564575645757],
 [37.901699, 139.022728, 0.051760516605166056],
 [36.695274, 137.211302, 0.06467564575645757],
 [36.594729, 136.62555, 0.06467564575645757],
 [36.065220000000004, 136.221641, 0.06283062730627306],
 [35.665102000000005, 138.568985, 0.05545055350553506],
 [36.651282, 138.180972, 0.051760516605166056],
 [35.39116, 136.722204, 0.05729557195571956],
 [34.976987, 138.383057, 0.05729557195571956],
 [35.180246999999994, 136.906698, 0.07574575645756458],
 [34.730546999999994, 136.50861, 0.06836568265682658],
 [35.004532, 135.868588, 0.05360553505535055],
 [35.020996200000006, 135.7531135, 0.05360553505535055],
 [34.686492, 135.518992, 0.0978859778597786],
 [34.69128, 135.183087, 0.08128081180811808],
 [34.685296, 135.832745, 0.04622546125461255],
 [34.224806, 135.16795, 0.08866088560885609],
 [35.503463, 134.238258, 0.051760516605166056],
 [35.472248, 133.05083, 0.051760516605166056],
 [34.66132, 133.934414, 0.060985608856088565],
 [34.396033, 132.459595, 0.06836568265682658],
 [34.185648, 131.470755, 0.051760516605166056],
 [34.065732000000004, 134.559293, 0.051760516605166056],
 [34.340140000000005, 134.04297, 0.051760516605166056],
 [33.841649, 132.76585, 0.051760516605166056],
 [33.55969, 133.530887, 0.051760516605166056],
 [33.606767, 130.418228, 0.060985608856088565],
 [33.249367, 130.298822, 0.05360553505535055],
 [32.744541999999996, 129.873037, 0.10526605166051661],
 [32.790385, 130.742345, 0.06652066420664207],
 [33.2382, 131.612674, 0.05914059040590406],
 [31.91109, 131.423855, 0.05729557195571956],
 [31.560219, 130.557906, 0.0868158671586716],
 [26.211538, 127.68111499999999, 0.07759077490774909]]

Zeichnen

japan_map = folium.Map(location=[35, 135], zoom_start=6)
hm = plugins.HeatMapWithTime(heat_map_data, index=list(time_columns),auto_play=False,radius=30,max_opacity=1,gradient={0.1: 'blue', 0.25: 'lime', 0.5:'yellow',0.75: 'orange', 0.9:'red'})
hm.add_to(japan_map)

japan_map

画面収録-2019-12-21-19.37.12.gif

Es sind nur Inkremente sichtbar, da weniger als etwa 0,052 negativ sein sollten.

Ich bin zufrieden mit der beweglichen Karte ...! !! !!

Erwägung

das Ende

Ich fand es sehr praktisch, den Datenübergang für jede Zeitreihe visualisieren zu können, ohne so viel Code zu schreiben. Ich möchte es für etwas Sinnvolleres verwenden. Bis zum Ende Danke fürs Lesen. Ich würde mich freuen, wenn Sie Korrekturen kommentieren könnten.

Referenzquelle

Recommended Posts

[Visualisierung mit Folium] Ich habe das Gefühl, dass Famima in den letzten Jahren zu stark zugenommen hat.
Beachten Sie, dass ich mich mit HTML in Beautiful Soup befasst habe
Arbeitsnotiz, die ich i18n mit Flask App ausprobiert habe