Ceci est l'article du 21e jour du Calendrier de l'Avent MYJLab 2019. Thatchy sera en charge. (Désolé d'être en retard)
Récemment, il y a un phénomène dans ma ville natale où il y a des marches familiales de l'autre côté de la route. Afin de visualiser ce phénomène, je voudrais montrer l'augmentation du nombre de magasins Family Mart sur une carte thermique chronologique pour chaque préfecture.
Il existe une bibliothèque appelée Leaflet qui vous permet de dessiner de jolies cartes avec JavaScript. Cette fois, je vais créer une carte thermique de séries chronologiques à l'aide d'une bibliothèque appelée folium qui permet d'utiliser Leaflet en Python.
Les fonctions et l'utilisation de folium varient en fonction de la version, assurez-vous donc de définir la version sur 0.10.1 cette fois.
#Charge de la bibliothèque
import pandas as pd
import folium
from folium import plugins
Nous avons préparé les données en réécrivant le nombre de magasins du Family Mart pour chaque préfecture de 1999 à 2019 sur le site de ici dans un fichier csv. .. Il est conçu pour être supprimé par les requêtes Python. De plus, la latitude et la longitude de chaque préfecture sont requises lors du dessin sur la carte. Cette fois, le lieu où se trouve l'office préfectoral est la latitude et la longitude de chaque préfecture. Les données peuvent être téléchargées depuis ici.
#Données sur le nombre de magasins
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()
En raison de l'augmentation des dernières années, le nombre de valeurs manquantes a considérablement augmenté de 1999 à 2006.
#Latitude et longitude du bureau préfectoral
geo_data = pd.read_csv("./data/prefecturalCapital.csv")
geo_data.head()
Combinez ensuite les deux blocs de données. Je veux combiner en utilisant l'id comme clé, alors changez l'id de geo_data en 0 et combinez. La valeur manquante est mise à 0 une fois.
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()
Les données de base sont prêtes.
Cette fois, je veux visualiser l'évolution du nombre de magasins, je vais donc prendre la différence dans la colonne.
#Obtenir un tableau de noms de colonnes de séries chronologiques
time_columns = merged_data.columns[2:23].values
#Différer en prenant la différence uniquement dans la partie données du nombre de magasins_Que ce soit des données
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)
#Puisque les données de 1999 seront perdues, supprimez-les.
diff_data = diff_data.dropna(axis=1)
time_columns = time_columns[1:]
diff_data.head()
Lorsque la différence est obtenue, effectuez une mise à l'échelle min-max. Dans la carte thermique du folium, 0 n'est pas pratique, alors ajoutez 1e-4 à l'ensemble.
# diff_Mettre les données à l'échelle et les mettre à l'échelle_Que ce soit des données
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()
Enfin, pour dessiner une carte thermique de séries chronologiques Créez des données 3D qui seront [[[latitude, longitude, données] * 47 préfectures] * 1999 ~ 2019].
heat_map_data = [[[row['lat'],row['lon'], row[idx]] for index, row in scaled_data.iterrows()] for idx in time_columns]
#La forme des données étant difficile à comprendre, seule la première sortie
heat_map_data[0]
#production
[[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
Seuls les incréments sont visibles car moins d'environ 0,052 doit être négatif.
Je suis content de la carte en mouvement ...! !! !!
J'ai trouvé très pratique de pouvoir visualiser la transition des données pour chaque série temporelle sans écrire autant de code. Je veux l'utiliser pour quelque chose de plus significatif. Jusqu'à la fin Merci d'avoir lu. Je vous serais reconnaissant de bien vouloir commenter les corrections.