Dies ist der Artikel zum 21. Tag von MYJLab Adventskalender 2019. Thatchy wird verantwortlich sein. (Entschuldigung für die Verspätung)
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.
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.
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
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()
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()
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()
Die Basisdaten sind fertig.
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()
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()
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]]
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
Es sind nur Inkremente sichtbar, da weniger als etwa 0,052 negativ sein sollten.
Ich bin zufrieden mit der beweglichen Karte ...! !! !!
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.