From 57ee88e5d863cea7d5701ece8e3aa12f5936a468 Mon Sep 17 00:00:00 2001 From: Gillesa Date: Thu, 8 Apr 2021 16:22:10 +0200 Subject: [PATCH] =?UTF-8?q?Carto=20des=20stations=20avec=20=C3=A9tat=20sui?= =?UTF-8?q?vant=20pr=C3=A9diction=20algo=20(donn=C3=A9es=20simul=C3=A9es).?= =?UTF-8?q?=20Fix=20#49?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../07_visualisation_map_stations #49.ipynb | 10778 ++++++++++++++++ vcub_keeper/config.py | 2 + vcub_keeper/visualisation.py | 364 +- 3 files changed, 11142 insertions(+), 2 deletions(-) create mode 100644 notebooks/02_Features/07_visualisation_map_stations #49.ipynb diff --git a/notebooks/02_Features/07_visualisation_map_stations #49.ipynb b/notebooks/02_Features/07_visualisation_map_stations #49.ipynb new file mode 100644 index 0000000..9cf39ae --- /dev/null +++ b/notebooks/02_Features/07_visualisation_map_stations #49.ipynb @@ -0,0 +1,10778 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "toc": true + }, + "source": [ + "

Table of Contents

\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T14:13:03.349065Z", + "start_time": "2021-04-08T14:13:03.265635Z" + } + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import io\n", + "\n", + "from vcub_keeper.reader.reader import *\n", + "from vcub_keeper.transform.features_factory import *\n", + "from vcub_keeper.visualisation import plot_station_activity\n", + "from vcub_keeper.config import MAPBOX_TOKEN\n", + "\n", + "import plotly.express as px\n", + "import plotly.graph_objs as go\n", + "from plotly.offline import init_notebook_mode, iplot, offline\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "sns.set_style('whitegrid')\n", + "%matplotlib inline\n", + "\n", + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Objectifs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Création d'une map afin de connaitre les stations actives, inactives et HS (d'après le résultat de l'algo).\n", + "- Prendre en compte la structure des données en INPUT pour que cela puisse marcher avec les données de `station_control.csv` (Projet `vcub_watcher` ).\n", + "- Issue gitub : https://github.com/armgilles/vcub_keeper/issues/49" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Dev" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Données et preprocessing" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T14:06:37.931996Z", + "start_time": "2021-04-08T14:06:37.893957Z" + } + }, + "outputs": [], + "source": [ + "# Simulation de données\n", + "\n", + "simulated_data=\"\"\"station_id,mean_activity,is_anomaly,is_inactive,last_date_anomaly,anomaly_since\n", + "6,0.4,1,0,2021-04-07 11:10:00+02:00,2021-04-07 09:00:00+02:00\n", + "59,0.42,1,0,2021-04-07 11:10:00+02:00,2021-04-07 10:10:00+02:00\n", + "138,0.36,0,1,,\n", + "181,0.0,0,0,,\n", + "181,0.0,0,0,,\n", + "160,0.0,0,0,,\n", + "161,0.01,0,0,,\n", + "180,0.01,0,0,,\n", + "92,0.01,0,0,,\n", + "167,0.01,0,0,,\n", + "168,0.01,0,0,,\n", + "183,0.01,0,0,,\n", + "81,0.02,0,0,,\n", + "150,0.02,0,0,,\n", + "72,0.02,0,0,,\n", + "71,0.02,0,0,,\n", + "91,0.02,0,0,,\n", + "80,0.02,0,0,,\n", + "165,0.02,0,0,,\n", + "156,0.02,0,0,,\n", + "157,0.03,0,0,,\n", + "87,0.03,0,0,,\n", + "182,0.03,0,0,,\n", + "93,0.03,0,0,,\n", + "94,0.03,0,0,,\n", + "149,0.04,0,0,,\n", + "82,0.04,0,0,,\n", + "88,0.05,0,0,,\n", + "164,0.05,0,0,,\n", + "76,0.05,0,0,,\n", + "77,0.05,0,0,,\n", + "158,0.05,0,0,,\n", + "148,0.05,0,0,,\n", + "79,0.05,0,0,,\n", + "95,0.05,0,0,,\n", + "151,0.05,0,0,,\n", + "86,0.06,0,0,,\n", + "153,0.06,0,0,,\n", + "159,0.06,0,0,,\n", + "85,0.06,0,0,,\n", + "162,0.06,0,0,,\n", + "169,0.07,0,0,,\n", + "177,0.07,0,0,,\n", + "78,0.07,0,0,,\n", + "147,0.07,0,0,,\n", + "97,0.07,0,0,,\n", + "84,0.08,0,0,,\n", + "163,0.08,0,0,,\n", + "63,0.09,0,0,,\n", + "146,0.09,0,0,,\n", + "166,0.1,0,0,,\n", + "89,0.1,0,0,,\n", + "152,0.1,0,0,,\n", + "143,0.1,0,0,,\n", + "115,0.1,0,0,,\n", + "142,0.11,0,0,,\n", + "64,0.11,0,0,,\n", + "74,0.12,0,0,,\n", + "144,0.12,0,0,,\n", + "51,0.12,0,0,,\n", + "114,0.13,0,0,,\n", + "145,0.13,0,0,,\n", + "83,0.13,0,0,,\n", + "113,0.13,0,0,,\n", + "251,0.13,0,0,,\n", + "38,0.13,0,0,,\n", + "70,0.14,0,0,,\n", + "75,0.14,0,0,,\n", + "175,0.14,0,0,,\n", + "178,0.16,0,0,,\n", + "32,0.16,0,0,,\n", + "12,0.17,0,0,,\n", + "90,0.17,0,0,,\n", + "50,0.17,0,0,,\n", + "49,0.18,0,0,,\n", + "155,0.18,0,0,,\n", + "129,0.18,0,0,,\n", + "52,0.18,0,0,,\n", + "26,0.18,0,0,,\n", + "31,0.18,0,0,,\n", + "29,0.19,0,0,,\n", + "53,0.2,0,0,,\n", + "30,0.2,0,0,,\n", + "154,0.2,0,0,,\n", + "35,0.2,0,0,,\n", + "126,0.2,0,0,,\n", + "176,0.21,0,0,,\n", + "25,0.21,0,0,,\n", + "117,0.21,0,0,,\n", + "122,0.21,0,0,,\n", + "137,0.21,0,0,,\n", + "96,0.22,0,0,,\n", + "73,0.23,0,0,,\n", + "141,0.23,0,0,,\n", + "27,0.23,0,0,,\n", + "69,0.23,0,0,,\n", + "14,0.23,0,0,,\n", + "179,0.23,0,0,,\n", + "47,0.24,0,0,,\n", + "13,0.24,0,0,,\n", + "46,0.24,0,0,,\n", + "116,0.24,0,0,,\n", + "48,0.24,0,0,,\n", + "67,0.25,0,0,,\n", + "121,0.25,0,0,,\n", + "173,0.25,0,0,,\n", + "17,0.26,0,0,,\n", + "140,0.27,0,0,,\n", + "107,0.27,0,0,,\n", + "171,0.27,0,0,,\n", + "33,0.27,0,0,,\n", + "61,0.27,0,0,,\n", + "34,0.27,0,0,,\n", + "170,0.28,0,0,,\n", + "132,0.28,0,0,,\n", + "128,0.28,0,0,,\n", + "119,0.28,0,0,,\n", + "15,0.29,0,0,,\n", + "18,0.29,0,0,,\n", + "124,0.3,0,0,,\n", + "118,0.3,0,0,,\n", + "111,0.31,0,0,,\n", + "10,0.31,0,0,,\n", + "62,0.32,0,0,,\n", + "66,0.32,0,0,,\n", + "105,0.32,0,0,,\n", + "130,0.32,0,0,,\n", + "112,0.32,0,0,,\n", + "2,0.32,0,0,,\n", + "68,0.32,0,0,,\n", + "23,0.34,0,0,,\n", + "11,0.34,0,0,,\n", + "60,0.34,0,0,,\n", + "120,0.34,0,0,,\n", + "9,0.34,0,0,,\n", + "3,0.35,0,0,,\n", + "45,0.35,0,0,,\n", + "136,0.36,0,0,,\n", + "24,0.36,0,0,,\n", + "21,0.36,0,0,,\n", + "108,0.37,0,0,,\n", + "16,0.37,0,0,,\n", + "131,0.37,0,0,,\n", + "36,0.38,0,0,,\n", + "20,0.39,0,0,,\n", + "110,0.39,0,0,,\n", + "139,0.39,0,0,,\n", + "42,0.4,0,0,,\n", + "125,0.4,0,0,,\n", + "19,0.41,0,0,,\n", + "135,0.41,0,0,,\n", + "41,0.43,0,0,,\n", + "28,0.44,0,0,,\n", + "7,0.44,0,0,,\n", + "109,0.44,0,0,,\n", + "4,0.44,0,0,,\n", + "57,0.44,0,0,,\n", + "55,0.44,0,0,,\n", + "37,0.45,0,0,,\n", + "8,0.46,0,0,,\n", + "58,0.47,0,0,,\n", + "99,0.48,0,0,,\n", + "134,0.48,0,0,,\n", + "104,0.49,0,0,,\n", + "40,0.49,0,0,,\n", + "98,0.49,0,0,,\n", + "172,0.5,0,0,,\n", + "1,0.51,0,0,,\n", + "56,0.51,0,0,,\n", + "43,0.51,0,0,,\n", + "44,0.53,0,0,,\n", + "100,0.54,0,0,,\n", + "133,0.55,0,0,,\n", + "103,0.58,0,0,,\n", + "101,0.6,0,0,,\n", + "102,0.63,0,0,,\n", + "5,0.64,0,0,,\n", + "65,0.65,0,0,,\n", + "174,0.67,0,0,,\n", + "123,0.74,0,0,,\n", + "54,0.74,0,0,,\n", + "39,0.82,0,0,,\n", + "22,0.82,0,0,,\n", + "127,0.9,0,0,,\n", + "106,1.03,0,0,,\n", + "\"\"\"\n", + "\n", + "station_control = pd.read_csv( io.StringIO(simulated_data) , sep=\",\")\n", + "\n", + "# Idem as read_station_control_from_s3 from vcub_watcher functino\n", + "station_control['last_date_anomaly'] = \\\n", + " pd.to_datetime(station_control['last_date_anomaly'])\n", + "try:\n", + " station_control['last_date_anomaly'] = \\\n", + " station_control['last_date_anomaly'].dt.tz_localize('Europe/Paris')\n", + "except: # try to convert TZ\n", + " station_control['last_date_anomaly'] = \\\n", + " station_control['last_date_anomaly'].dt.tz_convert('Europe/Paris')\n", + "\n", + "#station_control['anomaly_since'] = \\\n", + "# pd.to_datetime(station_control['anomaly_since'], utc=True)\n", + "station_control['anomaly_since'] = \\\n", + " pd.to_datetime(station_control['anomaly_since'])\n", + "try:\n", + " station_control['anomaly_since'] = \\\n", + " station_control['anomaly_since'].dt.tz_localize('Europe/Paris')\n", + "except: # try to convert TZ\n", + " station_control['anomaly_since'] = \\\n", + " station_control['anomaly_since'].dt.tz_convert('Europe/Paris')\n", + " \n", + "# Simulate \"available_bikes\" - Nombre de vélo présent à la station\n", + "station_control['available_bikes'] = np.random.randint(0, 40, len(station_control))" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T14:06:38.801168Z", + "start_time": "2021-04-08T14:06:38.769236Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
station_idmean_activityis_anomalyis_inactivelast_date_anomalyanomaly_sinceavailable_bikes
060.40102021-04-07 11:10:00+02:002021-04-07 09:00:00+02:0019
1590.42102021-04-07 11:10:00+02:002021-04-07 10:10:00+02:0030
21380.3601NaTNaT22
31810.0000NaTNaT16
41810.0000NaTNaT17
........................
180540.7400NaTNaT34
181390.8200NaTNaT33
182220.8200NaTNaT1
1831270.9000NaTNaT25
1841061.0300NaTNaT29
\n", + "

185 rows × 7 columns

\n", + "
" + ], + "text/plain": [ + " station_id mean_activity is_anomaly is_inactive \\\n", + "0 6 0.40 1 0 \n", + "1 59 0.42 1 0 \n", + "2 138 0.36 0 1 \n", + "3 181 0.00 0 0 \n", + "4 181 0.00 0 0 \n", + ".. ... ... ... ... \n", + "180 54 0.74 0 0 \n", + "181 39 0.82 0 0 \n", + "182 22 0.82 0 0 \n", + "183 127 0.90 0 0 \n", + "184 106 1.03 0 0 \n", + "\n", + " last_date_anomaly anomaly_since available_bikes \n", + "0 2021-04-07 11:10:00+02:00 2021-04-07 09:00:00+02:00 19 \n", + "1 2021-04-07 11:10:00+02:00 2021-04-07 10:10:00+02:00 30 \n", + "2 NaT NaT 22 \n", + "3 NaT NaT 16 \n", + "4 NaT NaT 17 \n", + ".. ... ... ... \n", + "180 NaT NaT 34 \n", + "181 NaT NaT 33 \n", + "182 NaT NaT 1 \n", + "183 NaT NaT 25 \n", + "184 NaT NaT 29 \n", + "\n", + "[185 rows x 7 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "station_control" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T14:06:39.064903Z", + "start_time": "2021-04-08T14:06:39.037230Z" + } + }, + "outputs": [], + "source": [ + "# Ajouter le lat/lon à station_control\n", + "# Lecture du fichier de réf des stations\n", + "stations = read_stations_attributes(path_directory=ROOT_DATA_REF)\n", + "stations = stations[['station_id', 'lat', 'lon', 'NOM']]\n", + "stations\n", + "\n", + "# Merge des données\n", + "station_control = station_control.merge(stations, on='station_id', how='left')\n", + "\n", + "# On ne prend que les stations avec lat / lon\n", + "station_control = station_control[~station_control.lat.isna()]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T14:06:40.015098Z", + "start_time": "2021-04-08T14:06:39.994241Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
station_idmean_activityis_anomalyis_inactivelast_date_anomalyanomaly_sinceavailable_bikeslatlonNOM
\n", + "
" + ], + "text/plain": [ + "Empty DataFrame\n", + "Columns: [station_id, mean_activity, is_anomaly, is_inactive, last_date_anomaly, anomaly_since, available_bikes, lat, lon, NOM]\n", + "Index: []" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "station_control[station_control.lat.isna()] # Ne dois pas avoir de ligne" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T14:06:40.793077Z", + "start_time": "2021-04-08T14:06:40.764500Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
station_idmean_activityis_anomalyis_inactivelast_date_anomalyanomaly_sinceavailable_bikeslatlonNOM
060.40102021-04-07 11:10:00+02:002021-04-07 09:00:00+02:001944.837794-0.581662Square André Lhote
1590.42102021-04-07 11:10:00+02:002021-04-07 10:10:00+02:003044.849783-0.570244CAPC
21380.3601NaTNaT2244.826560-0.564554Barbey
51600.0000NaTNaT2944.911972-0.724650Eglise St Aubin
61610.0100NaTNaT1444.904736-0.668962Le Taillan Mairie
.................................
180540.7400NaTNaT3444.826421-0.557323Rue St Vincent de Paul
181390.8200NaTNaT3344.844227-0.574345Quinconces
182220.8200NaTNaT144.838262-0.576482Hôtel de Ville
1831270.9000NaTNaT2544.826297-0.557072Gare St Jean
1841061.0300NaTNaT2944.830636-0.573213Place de la Victoire
\n", + "

174 rows × 10 columns

\n", + "
" + ], + "text/plain": [ + " station_id mean_activity is_anomaly is_inactive \\\n", + "0 6 0.40 1 0 \n", + "1 59 0.42 1 0 \n", + "2 138 0.36 0 1 \n", + "5 160 0.00 0 0 \n", + "6 161 0.01 0 0 \n", + ".. ... ... ... ... \n", + "180 54 0.74 0 0 \n", + "181 39 0.82 0 0 \n", + "182 22 0.82 0 0 \n", + "183 127 0.90 0 0 \n", + "184 106 1.03 0 0 \n", + "\n", + " last_date_anomaly anomaly_since available_bikes \\\n", + "0 2021-04-07 11:10:00+02:00 2021-04-07 09:00:00+02:00 19 \n", + "1 2021-04-07 11:10:00+02:00 2021-04-07 10:10:00+02:00 30 \n", + "2 NaT NaT 22 \n", + "5 NaT NaT 29 \n", + "6 NaT NaT 14 \n", + ".. ... ... ... \n", + "180 NaT NaT 34 \n", + "181 NaT NaT 33 \n", + "182 NaT NaT 1 \n", + "183 NaT NaT 25 \n", + "184 NaT NaT 29 \n", + "\n", + " lat lon NOM \n", + "0 44.837794 -0.581662 Square André Lhote \n", + "1 44.849783 -0.570244 CAPC \n", + "2 44.826560 -0.564554 Barbey \n", + "5 44.911972 -0.724650 Eglise St Aubin \n", + "6 44.904736 -0.668962 Le Taillan Mairie \n", + ".. ... ... ... \n", + "180 44.826421 -0.557323 Rue St Vincent de Paul \n", + "181 44.844227 -0.574345 Quinconces \n", + "182 44.838262 -0.576482 Hôtel de Ville \n", + "183 44.826297 -0.557072 Gare St Jean \n", + "184 44.830636 -0.573213 Place de la Victoire \n", + "\n", + "[174 rows x 10 columns]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "station_control" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T09:05:20.339662Z", + "start_time": "2021-04-08T09:05:20.317768Z" + } + }, + "outputs": [], + "source": [ + "# Preprocess avant graphique\n", + "station_control['etat'] = 'normal'\n", + "\n", + "# En anoamlie (HS prediction)\n", + "station_control.loc[station_control['is_anomaly'] == 1, 'etat'] = 'anomaly'\n", + "\n", + "# Inactive\n", + "station_control.loc[station_control['is_inactive'] == 1, 'etat'] = 'inactive'\n", + "\n", + "# Transform date to string\n", + "station_control['anomaly_since_str'] = station_control['anomaly_since'].dt.strftime(date_format='%Y-%m-%d %H:%M')\n", + "station_control['anomaly_since_str'] = station_control['anomaly_since_str'].fillna('-')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T09:05:20.747379Z", + "start_time": "2021-04-08T09:05:20.718587Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
station_idmean_activityis_anomalyis_inactivelast_date_anomalyanomaly_sinceavailable_bikeslatlonNOMetatanomaly_since_str
060.40102021-04-07 11:10:00+02:002021-04-07 09:00:00+02:002444.837794-0.581662Square André Lhoteanomaly2021-04-07 09:00
1590.42102021-04-07 11:10:00+02:002021-04-07 10:10:00+02:002044.849783-0.570244CAPCanomaly2021-04-07 10:10
21380.3601NaTNaT3544.826560-0.564554Barbeyinactive-
51600.0000NaTNaT1944.911972-0.724650Eglise St Aubinnormal-
61610.0100NaTNaT044.904736-0.668962Le Taillan Mairienormal-
.......................................
180540.7400NaTNaT1444.826421-0.557323Rue St Vincent de Paulnormal-
181390.8200NaTNaT2244.844227-0.574345Quinconcesnormal-
182220.8200NaTNaT3944.838262-0.576482Hôtel de Villenormal-
1831270.9000NaTNaT544.826297-0.557072Gare St Jeannormal-
1841061.0300NaTNaT2744.830636-0.573213Place de la Victoirenormal-
\n", + "

174 rows × 12 columns

\n", + "
" + ], + "text/plain": [ + " station_id mean_activity is_anomaly is_inactive \\\n", + "0 6 0.40 1 0 \n", + "1 59 0.42 1 0 \n", + "2 138 0.36 0 1 \n", + "5 160 0.00 0 0 \n", + "6 161 0.01 0 0 \n", + ".. ... ... ... ... \n", + "180 54 0.74 0 0 \n", + "181 39 0.82 0 0 \n", + "182 22 0.82 0 0 \n", + "183 127 0.90 0 0 \n", + "184 106 1.03 0 0 \n", + "\n", + " last_date_anomaly anomaly_since available_bikes \\\n", + "0 2021-04-07 11:10:00+02:00 2021-04-07 09:00:00+02:00 24 \n", + "1 2021-04-07 11:10:00+02:00 2021-04-07 10:10:00+02:00 20 \n", + "2 NaT NaT 35 \n", + "5 NaT NaT 19 \n", + "6 NaT NaT 0 \n", + ".. ... ... ... \n", + "180 NaT NaT 14 \n", + "181 NaT NaT 22 \n", + "182 NaT NaT 39 \n", + "183 NaT NaT 5 \n", + "184 NaT NaT 27 \n", + "\n", + " lat lon NOM etat anomaly_since_str \n", + "0 44.837794 -0.581662 Square André Lhote anomaly 2021-04-07 09:00 \n", + "1 44.849783 -0.570244 CAPC anomaly 2021-04-07 10:10 \n", + "2 44.826560 -0.564554 Barbey inactive - \n", + "5 44.911972 -0.724650 Eglise St Aubin normal - \n", + "6 44.904736 -0.668962 Le Taillan Mairie normal - \n", + ".. ... ... ... ... ... \n", + "180 44.826421 -0.557323 Rue St Vincent de Paul normal - \n", + "181 44.844227 -0.574345 Quinconces normal - \n", + "182 44.838262 -0.576482 Hôtel de Ville normal - \n", + "183 44.826297 -0.557072 Gare St Jean normal - \n", + "184 44.830636 -0.573213 Place de la Victoire normal - \n", + "\n", + "[174 rows x 12 columns]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "station_control" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plotly" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T08:43:22.792414Z", + "start_time": "2021-04-08T08:43:22.761316Z" + } + }, + "outputs": [], + "source": [ + "texts = []\n", + "for idx, station in station_control.iterrows():\n", + " text = str(station['NOM']) \\\n", + " + \"
\" + \"station N° : \" + str(station['station_id']) \\\n", + " + \"
\" + \"Nombre de vélo dispo : \" + str(station['available_bikes']) \\\n", + " + \"
\" + \"Activité suspecte depuis : \" + str(station['anomaly_since_str'])\n", + " texts.append(text)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T08:43:42.455145Z", + "start_time": "2021-04-08T08:43:42.351489Z" + } + }, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "etat=anomaly
lat=%{lat}
lon=%{lon}", + "lat": [ + 44.8377941, + 44.8497825 + ], + "legendgroup": "anomaly", + "lon": [ + -0.5816623, + -0.5702437 + ], + "marker": { + "color": "#636efa" + }, + "mode": "markers", + "name": "anomaly", + "showlegend": true, + "subplot": "mapbox", + "type": "scattermapbox" + }, + { + "hovertemplate": "etat=inactive
lat=%{lat}
lon=%{lon}", + "lat": [ + 44.8265598 + ], + "legendgroup": "inactive", + "lon": [ + -0.5645539 + ], + "marker": { + "color": "#EF553B" + }, + "mode": "markers", + "name": "inactive", + "showlegend": true, + "subplot": "mapbox", + "type": "scattermapbox" + }, + { + "hovertemplate": "etat=normal
lat=%{lat}
lon=%{lon}", + "lat": [ + 44.911972, + 44.9047355, + 44.8953026, + 44.8843052, + 44.909013, + 44.7958766, + 44.8492876, + 44.8541785, + 44.8874989, + 44.8736914, + 44.7930876, + 44.7984052, + 44.8442398, + 44.8565934, + 44.8362805, + 44.883958, + 44.9173004, + 44.8788377, + 44.7929626, + 44.8509659, + 44.7874757, + 44.7821503, + 44.7735264, + 44.8585929, + 44.8858939, + 44.7862005, + 44.8814488, + 44.845589, + 44.8318945, + 44.792322, + 44.8978469, + 44.8324153, + 44.7981103, + 44.8723721, + 44.7938887, + 44.892871, + 44.8773814, + 44.8153456, + 44.7871445, + 44.830278, + 44.8889178, + 44.8818036, + 44.8416131, + 44.7998729, + 44.8580632, + 44.8013759, + 44.8394322, + 44.8395959, + 44.8077045, + 44.8784824, + 44.8625593, + 44.793132, + 44.8790453, + 44.8044589, + 44.7968805, + 44.8464146, + 44.8642758, + 44.8077684, + 44.8526095, + 44.8511475, + 44.8265045, + 44.8599885, + 44.8632874, + 44.7915011, + 44.8130803, + 44.8588988, + 44.8279737, + 44.8517457, + 44.8325053, + 44.854169, + 44.8383834, + 44.7920334, + 44.8500962, + 44.8267007, + 44.8310036, + 44.8003845, + 44.8584878, + 44.8282573, + 44.8738859, + 44.8150262, + 44.8188706, + 44.8265358, + 44.8429974, + 44.8481944, + 44.8278935, + 44.848398, + 44.8227929, + 44.7966723, + 44.825783, + 44.8437743, + 44.8589077, + 44.8675164, + 44.8468975, + 44.8230651, + 44.8275103, + 44.8299181, + 44.8532619, + 44.8462539, + 44.8538162, + 44.8658199, + 44.8262833, + 44.822181, + 44.8626016, + 44.8452123, + 44.8441478, + 44.8338711, + 44.8669415, + 44.8068109, + 44.8317573, + 44.8561372, + 44.8411383, + 44.8326183, + 44.814502, + 44.8059145, + 44.8378395, + 44.842977, + 44.8348282, + 44.8416628, + 44.8471835, + 44.862612, + 44.8330332, + 44.8408779, + 44.8331199, + 44.8313122, + 44.8332348, + 44.8412219, + 44.8247146, + 44.8494652, + 44.820317, + 44.8500457, + 44.8431439, + 44.8123769, + 44.8240548, + 44.8392607, + 44.8318262, + 44.8446454, + 44.8347829, + 44.8388687, + 44.8298603, + 44.8359397, + 44.8220935, + 44.8422055, + 44.8515504, + 44.8546178, + 44.8484148, + 44.8343893, + 44.853209, + 44.8578681, + 44.8326329, + 44.8351755, + 44.8429267, + 44.8600704, + 44.8618162, + 44.8380293, + 44.8517074, + 44.8371083, + 44.8360588, + 44.855602, + 44.8299539, + 44.8377883, + 44.8429496, + 44.8403032, + 44.8414957, + 44.8403384, + 44.8490836, + 44.8377885, + 44.8264212, + 44.8442269, + 44.8382617, + 44.826297, + 44.8306361 + ], + "legendgroup": "normal", + "lon": [ + -0.7246501, + -0.6689618, + -0.7146676, + -0.6909947, + -0.6306502, + -0.6673258, + -0.4966899, + -0.5128187, + -0.5176289, + -0.6775347, + -0.6576449, + -0.6629757, + -0.6588671, + -0.6597112, + -0.6871282, + -0.6499211, + -0.623816, + -0.5178249, + -0.6463612, + -0.6447535, + -0.655176, + -0.5661566, + -0.6143178, + -0.6685358, + -0.5414654, + -0.6387356, + -0.6133743, + -0.5105045, + -0.6547759, + -0.5817438, + -0.5825468, + -0.6459366, + -0.5515963, + -0.5906954, + -0.6350506, + -0.5662214, + -0.5443327, + -0.6344371, + -0.5661623, + -0.5269656, + -0.5677901, + -0.5652057, + -0.6465204, + -0.5700493, + -0.6233263, + -0.5971532, + -0.6292522, + -0.5564476, + -0.5482081, + -0.5851242, + -0.5832471, + -0.6054744, + -0.5706139, + -0.6326682, + -0.6018689, + -0.5801979, + -0.5242001, + -0.5600546, + -0.5992294, + -0.6086092, + -0.6257739, + -0.5887606, + -0.5999496, + -0.6131256, + -0.5641958, + -0.5810805, + -0.5934903, + -0.6143832, + -0.6104667, + -0.5865861, + -0.6168934, + -0.5915297, + -0.5855819, + -0.54983, + -0.5873421, + -0.6098564, + -0.5696593, + -0.5623689, + -0.5740119, + -0.5509087, + -0.5999382, + -0.6018422, + -0.5503284, + -0.5919697, + -0.5860458, + -0.5982369, + -0.5529707, + -0.6170405, + -0.5897602, + -0.5575143, + -0.5658427, + -0.5480908, + -0.5821903, + -0.6006856, + -0.5758908, + -0.5814479, + -0.5917218, + -0.5649509, + -0.588682, + -0.5612341, + -0.5724844, + -0.5630395, + -0.5757641, + -0.5920629, + -0.5816331, + -0.5627102, + -0.5760778, + -0.5924539, + -0.5986834, + -0.5336374, + -0.5622355, + -0.5709743, + -0.5706739, + -0.6023231, + -0.5902795, + -0.5557321, + -0.5801851, + -0.5996952, + -0.5713111, + -0.567184, + -0.5928927, + -0.5910414, + -0.5769525, + -0.5613928, + -0.582833, + -0.5756676, + -0.5781469, + -0.5452532, + -0.5718546, + -0.5820039, + -0.5772404, + -0.5910309, + -0.5702434, + -0.5720342, + -0.5596604, + -0.5774479, + -0.5646641, + -0.574807, + -0.6035099, + -0.5821149, + -0.5817819, + -0.5848222, + -0.571631, + -0.5743468, + -0.5757416, + -0.5881235, + -0.5672651, + -0.5580802, + -0.5671119, + -0.5720497, + -0.5738986, + -0.5544678, + -0.5514922, + -0.584365, + -0.5742719, + -0.5727796, + -0.5754273, + -0.5631938, + -0.5681171, + -0.5703384, + -0.5703728, + -0.5691361, + -0.5808037, + -0.5595538, + -0.5625376, + -0.5671556, + -0.5573234, + -0.5743445, + -0.5764818, + -0.5570718, + -0.5732131 + ], + "marker": { + "color": "#00cc96" + }, + "mode": "markers", + "name": "normal", + "showlegend": true, + "subplot": "mapbox", + "type": "scattermapbox" + } + ], + "layout": { + "legend": { + "title": { + "text": "etat" + }, + "tracegroupgap": 0 + }, + "mapbox": { + "accesstoken": "pk.eyJ1IjoiYmFib3UiLCJhIjoiY2swZ3J5cndxMDl1ajNkbnFtOXh5NHRxOCJ9.UxT93M7i57pYMH3hhzXbgQ", + "center": { + "lat": 44.84005554252873, + "lon": -0.587245791954023 + }, + "domain": { + "x": [ + 0, + 1 + ], + "y": [ + 0, + 1 + ] + }, + "zoom": 13 + }, + "margin": { + "t": 60 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + } + } + }, + "text/html": [ + "
\n", + " \n", + " \n", + "
\n", + " \n", + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plotly express\n", + "\n", + "px.set_mapbox_access_token(MAPBOX_TOKEN)\n", + "fig = px.scatter_mapbox(station_control,\n", + " lat=\"lat\",\n", + " lon=\"lon\",\n", + " color='etat',\n", + " #hoverinfo=texts,\n", + " hover_data=[],\n", + " #labels={'station_id': 'station N°)',\n", + " # 'available_bikes': 'Nombre de vélo dispo',\n", + " # 'anomaly_since': 'Suspect depuis'},\n", + " zoom=13)\n", + "fig.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T08:44:04.294156Z", + "start_time": "2021-04-08T08:44:04.261912Z" + } + }, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hoverinfo": "text", + "lat": [ + 44.8377941, + 44.8497825, + 44.8265598, + 44.911972, + 44.9047355, + 44.8953026, + 44.8843052, + 44.909013, + 44.7958766, + 44.8492876, + 44.8541785, + 44.8874989, + 44.8736914, + 44.7930876, + 44.7984052, + 44.8442398, + 44.8565934, + 44.8362805, + 44.883958, + 44.9173004, + 44.8788377, + 44.7929626, + 44.8509659, + 44.7874757, + 44.7821503, + 44.7735264, + 44.8585929, + 44.8858939, + 44.7862005, + 44.8814488, + 44.845589, + 44.8318945, + 44.792322, + 44.8978469, + 44.8324153, + 44.7981103, + 44.8723721, + 44.7938887, + 44.892871, + 44.8773814, + 44.8153456, + 44.7871445, + 44.830278, + 44.8889178, + 44.8818036, + 44.8416131, + 44.7998729, + 44.8580632, + 44.8013759, + 44.8394322, + 44.8395959, + 44.8077045, + 44.8784824, + 44.8625593, + 44.793132, + 44.8790453, + 44.8044589, + 44.7968805, + 44.8464146, + 44.8642758, + 44.8077684, + 44.8526095, + 44.8511475, + 44.8265045, + 44.8599885, + 44.8632874, + 44.7915011, + 44.8130803, + 44.8588988, + 44.8279737, + 44.8517457, + 44.8325053, + 44.854169, + 44.8383834, + 44.7920334, + 44.8500962, + 44.8267007, + 44.8310036, + 44.8003845, + 44.8584878, + 44.8282573, + 44.8738859, + 44.8150262, + 44.8188706, + 44.8265358, + 44.8429974, + 44.8481944, + 44.8278935, + 44.848398, + 44.8227929, + 44.7966723, + 44.825783, + 44.8437743, + 44.8589077, + 44.8675164, + 44.8468975, + 44.8230651, + 44.8275103, + 44.8299181, + 44.8532619, + 44.8462539, + 44.8538162, + 44.8658199, + 44.8262833, + 44.822181, + 44.8626016, + 44.8452123, + 44.8441478, + 44.8338711, + 44.8669415, + 44.8068109, + 44.8317573, + 44.8561372, + 44.8411383, + 44.8326183, + 44.814502, + 44.8059145, + 44.8378395, + 44.842977, + 44.8348282, + 44.8416628, + 44.8471835, + 44.862612, + 44.8330332, + 44.8408779, + 44.8331199, + 44.8313122, + 44.8332348, + 44.8412219, + 44.8247146, + 44.8494652, + 44.820317, + 44.8500457, + 44.8431439, + 44.8123769, + 44.8240548, + 44.8392607, + 44.8318262, + 44.8446454, + 44.8347829, + 44.8388687, + 44.8298603, + 44.8359397, + 44.8220935, + 44.8422055, + 44.8515504, + 44.8546178, + 44.8484148, + 44.8343893, + 44.853209, + 44.8578681, + 44.8326329, + 44.8351755, + 44.8429267, + 44.8600704, + 44.8618162, + 44.8380293, + 44.8517074, + 44.8371083, + 44.8360588, + 44.855602, + 44.8299539, + 44.8377883, + 44.8429496, + 44.8403032, + 44.8414957, + 44.8403384, + 44.8490836, + 44.8377885, + 44.8264212, + 44.8442269, + 44.8382617, + 44.826297, + 44.8306361 + ], + "lon": [ + -0.5816623, + -0.5702437, + -0.5645539, + -0.7246501, + -0.6689618, + -0.7146676, + -0.6909947, + -0.6306502, + -0.6673258, + -0.4966899, + -0.5128187, + -0.5176289, + -0.6775347, + -0.6576449, + -0.6629757, + -0.6588671, + -0.6597112, + -0.6871282, + -0.6499211, + -0.623816, + -0.5178249, + -0.6463612, + -0.6447535, + -0.655176, + -0.5661566, + -0.6143178, + -0.6685358, + -0.5414654, + -0.6387356, + -0.6133743, + -0.5105045, + -0.6547759, + -0.5817438, + -0.5825468, + -0.6459366, + -0.5515963, + -0.5906954, + -0.6350506, + -0.5662214, + -0.5443327, + -0.6344371, + -0.5661623, + -0.5269656, + -0.5677901, + -0.5652057, + -0.6465204, + -0.5700493, + -0.6233263, + -0.5971532, + -0.6292522, + -0.5564476, + -0.5482081, + -0.5851242, + -0.5832471, + -0.6054744, + -0.5706139, + -0.6326682, + -0.6018689, + -0.5801979, + -0.5242001, + -0.5600546, + -0.5992294, + -0.6086092, + -0.6257739, + -0.5887606, + -0.5999496, + -0.6131256, + -0.5641958, + -0.5810805, + -0.5934903, + -0.6143832, + -0.6104667, + -0.5865861, + -0.6168934, + -0.5915297, + -0.5855819, + -0.54983, + -0.5873421, + -0.6098564, + -0.5696593, + -0.5623689, + -0.5740119, + -0.5509087, + -0.5999382, + -0.6018422, + -0.5503284, + -0.5919697, + -0.5860458, + -0.5982369, + -0.5529707, + -0.6170405, + -0.5897602, + -0.5575143, + -0.5658427, + -0.5480908, + -0.5821903, + -0.6006856, + -0.5758908, + -0.5814479, + -0.5917218, + -0.5649509, + -0.588682, + -0.5612341, + -0.5724844, + -0.5630395, + -0.5757641, + -0.5920629, + -0.5816331, + -0.5627102, + -0.5760778, + -0.5924539, + -0.5986834, + -0.5336374, + -0.5622355, + -0.5709743, + -0.5706739, + -0.6023231, + -0.5902795, + -0.5557321, + -0.5801851, + -0.5996952, + -0.5713111, + -0.567184, + -0.5928927, + -0.5910414, + -0.5769525, + -0.5613928, + -0.582833, + -0.5756676, + -0.5781469, + -0.5452532, + -0.5718546, + -0.5820039, + -0.5772404, + -0.5910309, + -0.5702434, + -0.5720342, + -0.5596604, + -0.5774479, + -0.5646641, + -0.574807, + -0.6035099, + -0.5821149, + -0.5817819, + -0.5848222, + -0.571631, + -0.5743468, + -0.5757416, + -0.5881235, + -0.5672651, + -0.5580802, + -0.5671119, + -0.5720497, + -0.5738986, + -0.5544678, + -0.5514922, + -0.584365, + -0.5742719, + -0.5727796, + -0.5754273, + -0.5631938, + -0.5681171, + -0.5703384, + -0.5703728, + -0.5691361, + -0.5808037, + -0.5595538, + -0.5625376, + -0.5671556, + -0.5573234, + -0.5743445, + -0.5764818, + -0.5570718, + -0.5732131 + ], + "marker": { + "color": "red", + "size": 7 + }, + "mode": "markers", + "text": [ + "Square André Lhote
station N° : 6
Nombre de vélo dispo : 16
Activité suspecte depuis : 2021-04-07 09:00", + "CAPC
station N° : 59
Nombre de vélo dispo : 15
Activité suspecte depuis : 2021-04-07 10:10", + "Barbey
station N° : 138
Nombre de vélo dispo : 36
Activité suspecte depuis : -", + "Eglise St Aubin
station N° : 160
Nombre de vélo dispo : 23
Activité suspecte depuis : -", + "Le Taillan Mairie
station N° : 161
Nombre de vélo dispo : 20
Activité suspecte depuis : -", + "St Médard République
station N° : 92
Nombre de vélo dispo : 3
Activité suspecte depuis : -", + "Centre commercial St Médard
station N° : 167
Nombre de vélo dispo : 18
Activité suspecte depuis : -", + "Mairie de Blanquefort
station N° : 168
Nombre de vélo dispo : 23
Activité suspecte depuis : -", + "Morin Cazalet
station N° : 81
Nombre de vélo dispo : 34
Activité suspecte depuis : -", + "Artigues Feydeau
station N° : 150
Nombre de vélo dispo : 34
Activité suspecte depuis : -", + "Jean Zay
station N° : 72
Nombre de vélo dispo : 28
Activité suspecte depuis : -", + "La Gardette
station N° : 71
Nombre de vélo dispo : 2
Activité suspecte depuis : -", + "Mairie du Haillan
station N° : 91
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "Gare Pessac Alouette
station N° : 80
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "France Alouette
station N° : 165
Nombre de vélo dispo : 22
Activité suspecte depuis : -", + "Hôtel de ville Mérignac
station N° : 156
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "Les Pins
station N° : 157
Nombre de vélo dispo : 33
Activité suspecte depuis : -", + "Kennedy Parc Hôtelier
station N° : 87
Nombre de vélo dispo : 35
Activité suspecte depuis : -", + "Eysines Centre (retirée le 23/03/2017 en raison des travaux tram D)
station N° : 93
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Gare de Blanquefort
station N° : 94
Nombre de vélo dispo : 18
Activité suspecte depuis : -", + "Lauriers
station N° : 149
Nombre de vélo dispo : 27
Activité suspecte depuis : -", + "Châtaigneraie
station N° : 82
Nombre de vélo dispo : 7
Activité suspecte depuis : -", + "Capeyron
station N° : 88
Nombre de vélo dispo : 6
Activité suspecte depuis : -", + "Hôpital Haut Lévêque
station N° : 164
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "Pont de la Maye (retirée le 19 novembre 2015 en raison des travaux d'extension du tram C)
station N° : 76
Nombre de vélo dispo : 18
Activité suspecte depuis : -", + "Place Bernard Roumegoux
station N° : 77
Nombre de vélo dispo : 39
Activité suspecte depuis : -", + "Le Haillan Rostand
station N° : 158
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "Berges de la Garonne
station N° : 148
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Pessac Bersol
station N° : 79
Nombre de vélo dispo : 39
Activité suspecte depuis : -", + "Bruges Hôtel de Ville
station N° : 95
Nombre de vélo dispo : 8
Activité suspecte depuis : -", + "Dravemont
station N° : 151
Nombre de vélo dispo : 20
Activité suspecte depuis : -", + "Merignac Soleil
station N° : 86
Nombre de vélo dispo : 27
Activité suspecte depuis : -", + "Parc Sourreil
station N° : 153
Nombre de vélo dispo : 5
Activité suspecte depuis : -", + "Camping International
station N° : 159
Nombre de vélo dispo : 23
Activité suspecte depuis : -", + "Quatre Chemins
station N° : 85
Nombre de vélo dispo : 9
Activité suspecte depuis : -", + "Gare de Bègles
station N° : 162
Nombre de vélo dispo : 23
Activité suspecte depuis : -", + "Bruges La Vache
station N° : 169
Nombre de vélo dispo : 7
Activité suspecte depuis : -", + "Bougnard
station N° : 78
Nombre de vélo dispo : 20
Activité suspecte depuis : -", + "Parc des Expositions
station N° : 147
Nombre de vélo dispo : 8
Activité suspecte depuis : -", + "Claveau
station N° : 97
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Le Burck
station N° : 84
Nombre de vélo dispo : 8
Activité suspecte depuis : -", + "Lycée Václav Havel
station N° : 163
Nombre de vélo dispo : 29
Activité suspecte depuis : -", + "François Mitterrand
station N° : 63
Nombre de vélo dispo : 28
Activité suspecte depuis : -", + "Palais des Congrès
station N° : 146
Nombre de vélo dispo : 13
Activité suspecte depuis : -", + "Centre commercial du Lac
station N° : 166
Nombre de vélo dispo : 9
Activité suspecte depuis : -", + "Mérignac Centre
station N° : 89
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Hôpital Robert Picqué
station N° : 152
Nombre de vélo dispo : 36
Activité suspecte depuis : -", + "Pins Francs
station N° : 143
Nombre de vélo dispo : 2
Activité suspecte depuis : -", + "CREPS
station N° : 115
Nombre de vélo dispo : 38
Activité suspecte depuis : -", + "Bourranville
station N° : 142
Nombre de vélo dispo : 3
Activité suspecte depuis : -", + "La Benauge
station N° : 64
Nombre de vélo dispo : 26
Activité suspecte depuis : -", + "Place du 14 juillet
station N° : 74
Nombre de vélo dispo : 1
Activité suspecte depuis : -", + "Jean Moulin
station N° : 144
Nombre de vélo dispo : 8
Activité suspecte depuis : -", + "Place Ampère
station N° : 51
Nombre de vélo dispo : 21
Activité suspecte depuis : -", + "Compostelle
station N° : 114
Nombre de vélo dispo : 9
Activité suspecte depuis : -", + "Berges du Lac
station N° : 145
Nombre de vélo dispo : 39
Activité suspecte depuis : -", + "Pessac Centre
station N° : 83
Nombre de vélo dispo : 23
Activité suspecte depuis : -", + "Ecole de Management
station N° : 113
Nombre de vélo dispo : 21
Activité suspecte depuis : -", + "Place Charles Gruet (indisponible depuis le 8 mars 2017 pour une durée indéterminée)
station N° : 38
Nombre de vélo dispo : 4
Activité suspecte depuis : -", + "Buttinière
station N° : 70
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "Bègles Poste
station N° : 75
Nombre de vélo dispo : 11
Activité suspecte depuis : -", + "Parc Bordelais
station N° : 32
Nombre de vélo dispo : 31
Activité suspecte depuis : -", + "Grand Lebrun
station N° : 12
Nombre de vélo dispo : 35
Activité suspecte depuis : -", + "Fontaine d'Arlac
station N° : 90
Nombre de vélo dispo : 1
Activité suspecte depuis : -", + "Mandron Godard
station N° : 50
Nombre de vélo dispo : 20
Activité suspecte depuis : -", + "Le Bouscat Mairie
station N° : 49
Nombre de vélo dispo : 2
Activité suspecte depuis : -", + "Village 6 IUT
station N° : 155
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "Barrière de Bègles
station N° : 129
Nombre de vélo dispo : 39
Activité suspecte depuis : -", + "Place de l'Europe
station N° : 52
Nombre de vélo dispo : 33
Activité suspecte depuis : -", + "Xaintrailles
station N° : 26
Nombre de vélo dispo : 2
Activité suspecte depuis : -", + "Caudéran
station N° : 31
Nombre de vélo dispo : 8
Activité suspecte depuis : -", + "St Augustin
station N° : 29
Nombre de vélo dispo : 37
Activité suspecte depuis : -", + "Parc Rivière
station N° : 53
Nombre de vélo dispo : 26
Activité suspecte depuis : -", + "Place Mondésir
station N° : 30
Nombre de vélo dispo : 7
Activité suspecte depuis : -", + "Thouars
station N° : 154
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "Place Marie Brizard (supprimée le 11 mars 2016 en raison des travaux tram D)
station N° : 35
Nombre de vélo dispo : 8
Activité suspecte depuis : -", + "Quai de Paludate
station N° : 126
Nombre de vélo dispo : 0
Activité suspecte depuis : -", + "François de Sourdis
station N° : 25
Nombre de vélo dispo : 10
Activité suspecte depuis : -", + "Doyen Brus
station N° : 117
Nombre de vélo dispo : 37
Activité suspecte depuis : -", + "St Louis Médoc
station N° : 122
Nombre de vélo dispo : 10
Activité suspecte depuis : -", + "Place André Meunier (fermée le 16/11/2016. Réouverture prévue en mai 2018)
station N° : 137
Nombre de vélo dispo : 36
Activité suspecte depuis : -", + "Les Aubiers
station N° : 96
Nombre de vélo dispo : 31
Activité suspecte depuis : -", + "Terres Neuves
station N° : 73
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "La Médoquine
station N° : 141
Nombre de vélo dispo : 37
Activité suspecte depuis : -", + "Bordeaux II
station N° : 27
Nombre de vélo dispo : 35
Activité suspecte depuis : -", + "Cours Le Rouzic
station N° : 69
Nombre de vélo dispo : 13
Activité suspecte depuis : -", + "Dubreuil Turenne
station N° : 14
Nombre de vélo dispo : 29
Activité suspecte depuis : -", + "Magendie
station N° : 47
Nombre de vélo dispo : 11
Activité suspecte depuis : -", + "Barriere St Medard
station N° : 13
Nombre de vélo dispo : 13
Activité suspecte depuis : -", + "Belcier
station N° : 46
Nombre de vélo dispo : 21
Activité suspecte depuis : -", + "Montaigne Montesquieu
station N° : 116
Nombre de vélo dispo : 1
Activité suspecte depuis : -", + "Barrière de Pessac
station N° : 48
Nombre de vélo dispo : 32
Activité suspecte depuis : -", + "Allée de Serr Abadie
station N° : 67
Nombre de vélo dispo : 39
Activité suspecte depuis : -", + "Place St Martial
station N° : 121
Nombre de vélo dispo : 1
Activité suspecte depuis : -", + "Rue Achard
station N° : 173
Nombre de vélo dispo : 12
Activité suspecte depuis : -", + "Palais Gallien
station N° : 17
Nombre de vélo dispo : 39
Activité suspecte depuis : -", + "Charles Perrens
station N° : 140
Nombre de vélo dispo : 26
Activité suspecte depuis : -", + "St Nicolas
station N° : 107
Nombre de vélo dispo : 31
Activité suspecte depuis : -", + "Place Amédée Larrieu
station N° : 171
Nombre de vélo dispo : 14
Activité suspecte depuis : -", + "Barrière du Médoc
station N° : 33
Nombre de vélo dispo : 11
Activité suspecte depuis : -", + "Parc aux Angeliques
station N° : 61
Nombre de vélo dispo : 14
Activité suspecte depuis : -", + "Tivoli
station N° : 34
Nombre de vélo dispo : 22
Activité suspecte depuis : -", + "Lucien Faure
station N° : 170
Nombre de vélo dispo : 31
Activité suspecte depuis : -", + "Cours de la Somme
station N° : 132
Nombre de vélo dispo : 29
Activité suspecte depuis : -", + "Sacré Coeur
station N° : 128
Nombre de vélo dispo : 6
Activité suspecte depuis : -", + "Grand Parc
station N° : 119
Nombre de vélo dispo : 4
Activité suspecte depuis : -", + "Rue de la Croix Blanche
station N° : 15
Nombre de vélo dispo : 15
Activité suspecte depuis : -", + "Huguerie
station N° : 18
Nombre de vélo dispo : 13
Activité suspecte depuis : -", + "Parc des Sports
station N° : 124
Nombre de vélo dispo : 20
Activité suspecte depuis : -", + "Le Bouscat Ravezies
station N° : 118
Nombre de vélo dispo : 31
Activité suspecte depuis : -", + "Peixotto
station N° : 111
Nombre de vélo dispo : 39
Activité suspecte depuis : -", + "Stade Chaban Delmas
station N° : 10
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "Cenon Gare
station N° : 62
Nombre de vélo dispo : 36
Activité suspecte depuis : -", + "Gare d'Orléans
station N° : 66
Nombre de vélo dispo : 22
Activité suspecte depuis : -", + "Rue du Mirail
station N° : 105
Nombre de vélo dispo : 29
Activité suspecte depuis : -", + "Barrière de Toulouse
station N° : 130
Nombre de vélo dispo : 23
Activité suspecte depuis : -", + "Arts et Métiers
station N° : 112
Nombre de vélo dispo : 37
Activité suspecte depuis : -", + "St Bruno
station N° : 2
Nombre de vélo dispo : 1
Activité suspecte depuis : -", + "Thiers Jardin Botanique
station N° : 68
Nombre de vélo dispo : 8
Activité suspecte depuis : -", + "République
station N° : 23
Nombre de vélo dispo : 34
Activité suspecte depuis : -", + "Cité Administrative
station N° : 11
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "Allées de Chartres
station N° : 60
Nombre de vélo dispo : 11
Activité suspecte depuis : -", + "Saint Louis Haussmann
station N° : 120
Nombre de vélo dispo : 7
Activité suspecte depuis : -", + "Gaviniès
station N° : 9
Nombre de vélo dispo : 15
Activité suspecte depuis : -", + "Place Tartas
station N° : 3
Nombre de vélo dispo : 8
Activité suspecte depuis : -", + "Place Ste Eulalie
station N° : 45
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Eglise Ste Croix
station N° : 136
Nombre de vélo dispo : 12
Activité suspecte depuis : -", + "Libération
station N° : 24
Nombre de vélo dispo : 12
Activité suspecte depuis : -", + "Puy Paulin
station N° : 21
Nombre de vélo dispo : 21
Activité suspecte depuis : -", + "Bergonié
station N° : 108
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "Galin
station N° : 16
Nombre de vélo dispo : 31
Activité suspecte depuis : -", + "Nansouty
station N° : 131
Nombre de vélo dispo : 23
Activité suspecte depuis : -", + "Place Longchamps
station N° : 36
Nombre de vélo dispo : 26
Activité suspecte depuis : -", + "Grands Hommes
station N° : 20
Nombre de vélo dispo : 22
Activité suspecte depuis : -", + "Forum
station N° : 110
Nombre de vélo dispo : 4
Activité suspecte depuis : -", + "Lycée Brémontier
station N° : 139
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "Camille Jullian
station N° : 42
Nombre de vélo dispo : 28
Activité suspecte depuis : -", + "Conservatoire
station N° : 125
Nombre de vélo dispo : 7
Activité suspecte depuis : -", + "Place Tourny
station N° : 19
Nombre de vélo dispo : 32
Activité suspecte depuis : -", + "Place St Michel
station N° : 135
Nombre de vélo dispo : 13
Activité suspecte depuis : -", + "Place St Projet
station N° : 41
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "Hôpital Pellegrin
station N° : 28
Nombre de vélo dispo : 22
Activité suspecte depuis : -", + "Palais de Justice
station N° : 7
Nombre de vélo dispo : 34
Activité suspecte depuis : -", + "Barrière St Genès
station N° : 109
Nombre de vélo dispo : 17
Activité suspecte depuis : -", + "St Seurin
station N° : 4
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "Eglise St Louis
station N° : 57
Nombre de vélo dispo : 28
Activité suspecte depuis : -", + "Camille Godard
station N° : 55
Nombre de vélo dispo : 33
Activité suspecte depuis : -", + "Jardin Public
station N° : 37
Nombre de vélo dispo : 36
Activité suspecte depuis : -", + "Patinoire
station N° : 8
Nombre de vélo dispo : 23
Activité suspecte depuis : -", + "Chartrons
station N° : 58
Nombre de vélo dispo : 35
Activité suspecte depuis : -", + "Les Hangars
station N° : 99
Nombre de vélo dispo : 13
Activité suspecte depuis : -", + "Place du Maucaillou
station N° : 134
Nombre de vélo dispo : 0
Activité suspecte depuis : -", + "Grosse Cloche (fermée depuis le 26/09/2016. Réouverture prévue septembre 2017)
station N° : 104
Nombre de vélo dispo : 35
Activité suspecte depuis : -", + "Grand Théâtre
station N° : 40
Nombre de vélo dispo : 17
Activité suspecte depuis : -", + "Bassins à flot
station N° : 98
Nombre de vélo dispo : 32
Activité suspecte depuis : -", + "La Cité du Vin
station N° : 172
Nombre de vélo dispo : 17
Activité suspecte depuis : -", + "Mériadeck
station N° : 1
Nombre de vélo dispo : 14
Activité suspecte depuis : -", + "Place Paul Doumer
station N° : 56
Nombre de vélo dispo : 28
Activité suspecte depuis : -", + "St Paul
station N° : 43
Nombre de vélo dispo : 33
Activité suspecte depuis : -", + "Musée d'Aquitaine
station N° : 44
Nombre de vélo dispo : 27
Activité suspecte depuis : -", + "Cours du Médoc
station N° : 100
Nombre de vélo dispo : 12
Activité suspecte depuis : -", + "Capucins
station N° : 133
Nombre de vélo dispo : 38
Activité suspecte depuis : -", + "Place du Palais
station N° : 103
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Place Jean Jaurès
station N° : 101
Nombre de vélo dispo : 22
Activité suspecte depuis : -", + "Place de la Bourse
station N° : 102
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Place Gambetta
station N° : 5
Nombre de vélo dispo : 12
Activité suspecte depuis : -", + "Stalingrad
station N° : 65
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "Darwin
station N° : 174
Nombre de vélo dispo : 32
Activité suspecte depuis : -", + "Porte de Bourgogne
station N° : 123
Nombre de vélo dispo : 25
Activité suspecte depuis : -", + "Rue St Vincent de Paul
station N° : 54
Nombre de vélo dispo : 18
Activité suspecte depuis : -", + "Quinconces
station N° : 39
Nombre de vélo dispo : 12
Activité suspecte depuis : -", + "Hôtel de Ville
station N° : 22
Nombre de vélo dispo : 8
Activité suspecte depuis : -", + "Gare St Jean
station N° : 127
Nombre de vélo dispo : 8
Activité suspecte depuis : -", + "Place de la Victoire
station N° : 106
Nombre de vélo dispo : 22
Activité suspecte depuis : -" + ], + "type": "scattermapbox" + } + ], + "layout": { + "mapbox": { + "accesstoken": "pk.eyJ1IjoiYmFib3UiLCJhIjoiY2swZ3J5cndxMDl1ajNkbnFtOXh5NHRxOCJ9.UxT93M7i57pYMH3hhzXbgQ", + "center": { + "lat": 44.837794, + "lon": -0.581662 + }, + "style": "light", + "zoom": 12 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + } + } + }, + "text/html": [ + "
\n", + " \n", + " \n", + "
\n", + " \n", + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plotly figure (sans état)\n", + "fig = go.Figure(go.Scattermapbox(lat=station_control['lat'],\n", + " lon=station_control['lon'],\n", + " mode='markers',\n", + " text=texts,\n", + " hoverinfo=\"text\",\n", + " marker_size=7, \n", + " marker_color='red'))\n", + "fig.update_layout(mapbox = dict(center= dict(lat=44.837794, lon=-0.581662), \n", + " accesstoken= MAPBOX_TOKEN,\n", + " zoom=12,\n", + " style=\"light\"\n", + " ))" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T12:31:34.706719Z", + "start_time": "2021-04-08T12:31:34.652487Z" + } + }, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hoverinfo": "text", + "hovertext": [ + "Square André Lhote
station N° : 6
Nombre de vélo dispo : 6
Activité suspecte depuis : 2021-04-07 09:00", + "CAPC
station N° : 59
Nombre de vélo dispo : 15
Activité suspecte depuis : 2021-04-07 10:10" + ], + "lat": [ + 44.8377941, + 44.8497825 + ], + "lon": [ + -0.5816623, + -0.5702437 + ], + "marker": { + "color": "#EB4D50", + "size": 8 + }, + "mode": "markers", + "name": "anomaly", + "type": "scattermapbox" + }, + { + "hoverinfo": "text", + "hovertext": [ + "Barbey
station N° : 138
Nombre de vélo dispo : 3
Activité suspecte depuis : -" + ], + "lat": [ + 44.8265598 + ], + "lon": [ + -0.5645539 + ], + "marker": { + "color": "#5E9BE6", + "size": 8 + }, + "mode": "markers", + "name": "inactive", + "type": "scattermapbox" + }, + { + "hoverinfo": "text", + "hovertext": [ + "Eglise St Aubin
station N° : 160
Nombre de vélo dispo : 21
Activité suspecte depuis : -", + "Le Taillan Mairie
station N° : 161
Nombre de vélo dispo : 11
Activité suspecte depuis : -", + "St Médard République
station N° : 92
Nombre de vélo dispo : 28
Activité suspecte depuis : -", + "Centre commercial St Médard
station N° : 167
Nombre de vélo dispo : 32
Activité suspecte depuis : -", + "Mairie de Blanquefort
station N° : 168
Nombre de vélo dispo : 31
Activité suspecte depuis : -", + "Morin Cazalet
station N° : 81
Nombre de vélo dispo : 39
Activité suspecte depuis : -", + "Artigues Feydeau
station N° : 150
Nombre de vélo dispo : 6
Activité suspecte depuis : -", + "Jean Zay
station N° : 72
Nombre de vélo dispo : 39
Activité suspecte depuis : -", + "La Gardette
station N° : 71
Nombre de vélo dispo : 39
Activité suspecte depuis : -", + "Mairie du Haillan
station N° : 91
Nombre de vélo dispo : 18
Activité suspecte depuis : -", + "Gare Pessac Alouette
station N° : 80
Nombre de vélo dispo : 6
Activité suspecte depuis : -", + "France Alouette
station N° : 165
Nombre de vélo dispo : 27
Activité suspecte depuis : -", + "Hôtel de ville Mérignac
station N° : 156
Nombre de vélo dispo : 23
Activité suspecte depuis : -", + "Les Pins
station N° : 157
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "Kennedy Parc Hôtelier
station N° : 87
Nombre de vélo dispo : 37
Activité suspecte depuis : -", + "Eysines Centre (retirée le 23/03/2017 en raison des travaux tram D)
station N° : 93
Nombre de vélo dispo : 21
Activité suspecte depuis : -", + "Gare de Blanquefort
station N° : 94
Nombre de vélo dispo : 34
Activité suspecte depuis : -", + "Lauriers
station N° : 149
Nombre de vélo dispo : 31
Activité suspecte depuis : -", + "Châtaigneraie
station N° : 82
Nombre de vélo dispo : 26
Activité suspecte depuis : -", + "Capeyron
station N° : 88
Nombre de vélo dispo : 10
Activité suspecte depuis : -", + "Hôpital Haut Lévêque
station N° : 164
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "Pont de la Maye (retirée le 19 novembre 2015 en raison des travaux d'extension du tram C)
station N° : 76
Nombre de vélo dispo : 27
Activité suspecte depuis : -", + "Place Bernard Roumegoux
station N° : 77
Nombre de vélo dispo : 33
Activité suspecte depuis : -", + "Le Haillan Rostand
station N° : 158
Nombre de vélo dispo : 8
Activité suspecte depuis : -", + "Berges de la Garonne
station N° : 148
Nombre de vélo dispo : 7
Activité suspecte depuis : -", + "Pessac Bersol
station N° : 79
Nombre de vélo dispo : 0
Activité suspecte depuis : -", + "Bruges Hôtel de Ville
station N° : 95
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "Dravemont
station N° : 151
Nombre de vélo dispo : 39
Activité suspecte depuis : -", + "Merignac Soleil
station N° : 86
Nombre de vélo dispo : 37
Activité suspecte depuis : -", + "Parc Sourreil
station N° : 153
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "Camping International
station N° : 159
Nombre de vélo dispo : 15
Activité suspecte depuis : -", + "Quatre Chemins
station N° : 85
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "Gare de Bègles
station N° : 162
Nombre de vélo dispo : 13
Activité suspecte depuis : -", + "Bruges La Vache
station N° : 169
Nombre de vélo dispo : 23
Activité suspecte depuis : -", + "Bougnard
station N° : 78
Nombre de vélo dispo : 26
Activité suspecte depuis : -", + "Parc des Expositions
station N° : 147
Nombre de vélo dispo : 36
Activité suspecte depuis : -", + "Claveau
station N° : 97
Nombre de vélo dispo : 22
Activité suspecte depuis : -", + "Le Burck
station N° : 84
Nombre de vélo dispo : 22
Activité suspecte depuis : -", + "Lycée Václav Havel
station N° : 163
Nombre de vélo dispo : 36
Activité suspecte depuis : -", + "François Mitterrand
station N° : 63
Nombre de vélo dispo : 23
Activité suspecte depuis : -", + "Palais des Congrès
station N° : 146
Nombre de vélo dispo : 21
Activité suspecte depuis : -", + "Centre commercial du Lac
station N° : 166
Nombre de vélo dispo : 13
Activité suspecte depuis : -", + "Mérignac Centre
station N° : 89
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "Hôpital Robert Picqué
station N° : 152
Nombre de vélo dispo : 13
Activité suspecte depuis : -", + "Pins Francs
station N° : 143
Nombre de vélo dispo : 7
Activité suspecte depuis : -", + "CREPS
station N° : 115
Nombre de vélo dispo : 32
Activité suspecte depuis : -", + "Bourranville
station N° : 142
Nombre de vélo dispo : 5
Activité suspecte depuis : -", + "La Benauge
station N° : 64
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Place du 14 juillet
station N° : 74
Nombre de vélo dispo : 15
Activité suspecte depuis : -", + "Jean Moulin
station N° : 144
Nombre de vélo dispo : 32
Activité suspecte depuis : -", + "Place Ampère
station N° : 51
Nombre de vélo dispo : 1
Activité suspecte depuis : -", + "Compostelle
station N° : 114
Nombre de vélo dispo : 15
Activité suspecte depuis : -", + "Berges du Lac
station N° : 145
Nombre de vélo dispo : 12
Activité suspecte depuis : -", + "Pessac Centre
station N° : 83
Nombre de vélo dispo : 34
Activité suspecte depuis : -", + "Ecole de Management
station N° : 113
Nombre de vélo dispo : 26
Activité suspecte depuis : -", + "Place Charles Gruet (indisponible depuis le 8 mars 2017 pour une durée indéterminée)
station N° : 38
Nombre de vélo dispo : 14
Activité suspecte depuis : -", + "Buttinière
station N° : 70
Nombre de vélo dispo : 21
Activité suspecte depuis : -", + "Bègles Poste
station N° : 75
Nombre de vélo dispo : 29
Activité suspecte depuis : -", + "Parc Bordelais
station N° : 32
Nombre de vélo dispo : 18
Activité suspecte depuis : -", + "Grand Lebrun
station N° : 12
Nombre de vélo dispo : 12
Activité suspecte depuis : -", + "Fontaine d'Arlac
station N° : 90
Nombre de vélo dispo : 7
Activité suspecte depuis : -", + "Mandron Godard
station N° : 50
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "Le Bouscat Mairie
station N° : 49
Nombre de vélo dispo : 28
Activité suspecte depuis : -", + "Village 6 IUT
station N° : 155
Nombre de vélo dispo : 12
Activité suspecte depuis : -", + "Barrière de Bègles
station N° : 129
Nombre de vélo dispo : 32
Activité suspecte depuis : -", + "Place de l'Europe
station N° : 52
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "Xaintrailles
station N° : 26
Nombre de vélo dispo : 36
Activité suspecte depuis : -", + "Caudéran
station N° : 31
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "St Augustin
station N° : 29
Nombre de vélo dispo : 25
Activité suspecte depuis : -", + "Parc Rivière
station N° : 53
Nombre de vélo dispo : 3
Activité suspecte depuis : -", + "Place Mondésir
station N° : 30
Nombre de vélo dispo : 26
Activité suspecte depuis : -", + "Thouars
station N° : 154
Nombre de vélo dispo : 1
Activité suspecte depuis : -", + "Place Marie Brizard (supprimée le 11 mars 2016 en raison des travaux tram D)
station N° : 35
Nombre de vélo dispo : 14
Activité suspecte depuis : -", + "Quai de Paludate
station N° : 126
Nombre de vélo dispo : 21
Activité suspecte depuis : -", + "François de Sourdis
station N° : 25
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "Doyen Brus
station N° : 117
Nombre de vélo dispo : 34
Activité suspecte depuis : -", + "St Louis Médoc
station N° : 122
Nombre de vélo dispo : 27
Activité suspecte depuis : -", + "Place André Meunier (fermée le 16/11/2016. Réouverture prévue en mai 2018)
station N° : 137
Nombre de vélo dispo : 29
Activité suspecte depuis : -", + "Les Aubiers
station N° : 96
Nombre de vélo dispo : 33
Activité suspecte depuis : -", + "Terres Neuves
station N° : 73
Nombre de vélo dispo : 34
Activité suspecte depuis : -", + "La Médoquine
station N° : 141
Nombre de vélo dispo : 8
Activité suspecte depuis : -", + "Bordeaux II
station N° : 27
Nombre de vélo dispo : 33
Activité suspecte depuis : -", + "Cours Le Rouzic
station N° : 69
Nombre de vélo dispo : 36
Activité suspecte depuis : -", + "Dubreuil Turenne
station N° : 14
Nombre de vélo dispo : 14
Activité suspecte depuis : -", + "Magendie
station N° : 47
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Barriere St Medard
station N° : 13
Nombre de vélo dispo : 33
Activité suspecte depuis : -", + "Belcier
station N° : 46
Nombre de vélo dispo : 13
Activité suspecte depuis : -", + "Montaigne Montesquieu
station N° : 116
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "Barrière de Pessac
station N° : 48
Nombre de vélo dispo : 1
Activité suspecte depuis : -", + "Allée de Serr Abadie
station N° : 67
Nombre de vélo dispo : 5
Activité suspecte depuis : -", + "Place St Martial
station N° : 121
Nombre de vélo dispo : 17
Activité suspecte depuis : -", + "Rue Achard
station N° : 173
Nombre de vélo dispo : 7
Activité suspecte depuis : -", + "Palais Gallien
station N° : 17
Nombre de vélo dispo : 22
Activité suspecte depuis : -", + "Charles Perrens
station N° : 140
Nombre de vélo dispo : 15
Activité suspecte depuis : -", + "St Nicolas
station N° : 107
Nombre de vélo dispo : 35
Activité suspecte depuis : -", + "Place Amédée Larrieu
station N° : 171
Nombre de vélo dispo : 34
Activité suspecte depuis : -", + "Barrière du Médoc
station N° : 33
Nombre de vélo dispo : 35
Activité suspecte depuis : -", + "Parc aux Angeliques
station N° : 61
Nombre de vélo dispo : 27
Activité suspecte depuis : -", + "Tivoli
station N° : 34
Nombre de vélo dispo : 27
Activité suspecte depuis : -", + "Lucien Faure
station N° : 170
Nombre de vélo dispo : 26
Activité suspecte depuis : -", + "Cours de la Somme
station N° : 132
Nombre de vélo dispo : 0
Activité suspecte depuis : -", + "Sacré Coeur
station N° : 128
Nombre de vélo dispo : 11
Activité suspecte depuis : -", + "Grand Parc
station N° : 119
Nombre de vélo dispo : 9
Activité suspecte depuis : -", + "Rue de la Croix Blanche
station N° : 15
Nombre de vélo dispo : 6
Activité suspecte depuis : -", + "Huguerie
station N° : 18
Nombre de vélo dispo : 29
Activité suspecte depuis : -", + "Parc des Sports
station N° : 124
Nombre de vélo dispo : 0
Activité suspecte depuis : -", + "Le Bouscat Ravezies
station N° : 118
Nombre de vélo dispo : 38
Activité suspecte depuis : -", + "Peixotto
station N° : 111
Nombre de vélo dispo : 18
Activité suspecte depuis : -", + "Stade Chaban Delmas
station N° : 10
Nombre de vélo dispo : 5
Activité suspecte depuis : -", + "Cenon Gare
station N° : 62
Nombre de vélo dispo : 15
Activité suspecte depuis : -", + "Gare d'Orléans
station N° : 66
Nombre de vélo dispo : 6
Activité suspecte depuis : -", + "Rue du Mirail
station N° : 105
Nombre de vélo dispo : 15
Activité suspecte depuis : -", + "Barrière de Toulouse
station N° : 130
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Arts et Métiers
station N° : 112
Nombre de vélo dispo : 8
Activité suspecte depuis : -", + "St Bruno
station N° : 2
Nombre de vélo dispo : 36
Activité suspecte depuis : -", + "Thiers Jardin Botanique
station N° : 68
Nombre de vélo dispo : 37
Activité suspecte depuis : -", + "République
station N° : 23
Nombre de vélo dispo : 18
Activité suspecte depuis : -", + "Cité Administrative
station N° : 11
Nombre de vélo dispo : 3
Activité suspecte depuis : -", + "Allées de Chartres
station N° : 60
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Saint Louis Haussmann
station N° : 120
Nombre de vélo dispo : 32
Activité suspecte depuis : -", + "Gaviniès
station N° : 9
Nombre de vélo dispo : 35
Activité suspecte depuis : -", + "Place Tartas
station N° : 3
Nombre de vélo dispo : 27
Activité suspecte depuis : -", + "Place Ste Eulalie
station N° : 45
Nombre de vélo dispo : 33
Activité suspecte depuis : -", + "Eglise Ste Croix
station N° : 136
Nombre de vélo dispo : 10
Activité suspecte depuis : -", + "Libération
station N° : 24
Nombre de vélo dispo : 13
Activité suspecte depuis : -", + "Puy Paulin
station N° : 21
Nombre de vélo dispo : 10
Activité suspecte depuis : -", + "Bergonié
station N° : 108
Nombre de vélo dispo : 0
Activité suspecte depuis : -", + "Galin
station N° : 16
Nombre de vélo dispo : 36
Activité suspecte depuis : -", + "Nansouty
station N° : 131
Nombre de vélo dispo : 18
Activité suspecte depuis : -", + "Place Longchamps
station N° : 36
Nombre de vélo dispo : 11
Activité suspecte depuis : -", + "Grands Hommes
station N° : 20
Nombre de vélo dispo : 2
Activité suspecte depuis : -", + "Forum
station N° : 110
Nombre de vélo dispo : 25
Activité suspecte depuis : -", + "Lycée Brémontier
station N° : 139
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Camille Jullian
station N° : 42
Nombre de vélo dispo : 36
Activité suspecte depuis : -", + "Conservatoire
station N° : 125
Nombre de vélo dispo : 10
Activité suspecte depuis : -", + "Place Tourny
station N° : 19
Nombre de vélo dispo : 15
Activité suspecte depuis : -", + "Place St Michel
station N° : 135
Nombre de vélo dispo : 9
Activité suspecte depuis : -", + "Place St Projet
station N° : 41
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "Hôpital Pellegrin
station N° : 28
Nombre de vélo dispo : 22
Activité suspecte depuis : -", + "Palais de Justice
station N° : 7
Nombre de vélo dispo : 31
Activité suspecte depuis : -", + "Barrière St Genès
station N° : 109
Nombre de vélo dispo : 29
Activité suspecte depuis : -", + "St Seurin
station N° : 4
Nombre de vélo dispo : 8
Activité suspecte depuis : -", + "Eglise St Louis
station N° : 57
Nombre de vélo dispo : 0
Activité suspecte depuis : -", + "Camille Godard
station N° : 55
Nombre de vélo dispo : 15
Activité suspecte depuis : -", + "Jardin Public
station N° : 37
Nombre de vélo dispo : 9
Activité suspecte depuis : -", + "Patinoire
station N° : 8
Nombre de vélo dispo : 4
Activité suspecte depuis : -", + "Chartrons
station N° : 58
Nombre de vélo dispo : 14
Activité suspecte depuis : -", + "Les Hangars
station N° : 99
Nombre de vélo dispo : 1
Activité suspecte depuis : -", + "Place du Maucaillou
station N° : 134
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "Grosse Cloche (fermée depuis le 26/09/2016. Réouverture prévue septembre 2017)
station N° : 104
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "Grand Théâtre
station N° : 40
Nombre de vélo dispo : 3
Activité suspecte depuis : -", + "Bassins à flot
station N° : 98
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "La Cité du Vin
station N° : 172
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "Mériadeck
station N° : 1
Nombre de vélo dispo : 5
Activité suspecte depuis : -", + "Place Paul Doumer
station N° : 56
Nombre de vélo dispo : 20
Activité suspecte depuis : -", + "St Paul
station N° : 43
Nombre de vélo dispo : 37
Activité suspecte depuis : -", + "Musée d'Aquitaine
station N° : 44
Nombre de vélo dispo : 6
Activité suspecte depuis : -", + "Cours du Médoc
station N° : 100
Nombre de vélo dispo : 10
Activité suspecte depuis : -", + "Capucins
station N° : 133
Nombre de vélo dispo : 14
Activité suspecte depuis : -", + "Place du Palais
station N° : 103
Nombre de vélo dispo : 39
Activité suspecte depuis : -", + "Place Jean Jaurès
station N° : 101
Nombre de vélo dispo : 9
Activité suspecte depuis : -", + "Place de la Bourse
station N° : 102
Nombre de vélo dispo : 35
Activité suspecte depuis : -", + "Place Gambetta
station N° : 5
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "Stalingrad
station N° : 65
Nombre de vélo dispo : 26
Activité suspecte depuis : -", + "Darwin
station N° : 174
Nombre de vélo dispo : 4
Activité suspecte depuis : -", + "Porte de Bourgogne
station N° : 123
Nombre de vélo dispo : 21
Activité suspecte depuis : -", + "Rue St Vincent de Paul
station N° : 54
Nombre de vélo dispo : 35
Activité suspecte depuis : -", + "Quinconces
station N° : 39
Nombre de vélo dispo : 14
Activité suspecte depuis : -", + "Hôtel de Ville
station N° : 22
Nombre de vélo dispo : 33
Activité suspecte depuis : -", + "Gare St Jean
station N° : 127
Nombre de vélo dispo : 0
Activité suspecte depuis : -", + "Place de la Victoire
station N° : 106
Nombre de vélo dispo : 24
Activité suspecte depuis : -" + ], + "lat": [ + 44.911972, + 44.9047355, + 44.8953026, + 44.8843052, + 44.909013, + 44.7958766, + 44.8492876, + 44.8541785, + 44.8874989, + 44.8736914, + 44.7930876, + 44.7984052, + 44.8442398, + 44.8565934, + 44.8362805, + 44.883958, + 44.9173004, + 44.8788377, + 44.7929626, + 44.8509659, + 44.7874757, + 44.7821503, + 44.7735264, + 44.8585929, + 44.8858939, + 44.7862005, + 44.8814488, + 44.845589, + 44.8318945, + 44.792322, + 44.8978469, + 44.8324153, + 44.7981103, + 44.8723721, + 44.7938887, + 44.892871, + 44.8773814, + 44.8153456, + 44.7871445, + 44.830278, + 44.8889178, + 44.8818036, + 44.8416131, + 44.7998729, + 44.8580632, + 44.8013759, + 44.8394322, + 44.8395959, + 44.8077045, + 44.8784824, + 44.8625593, + 44.793132, + 44.8790453, + 44.8044589, + 44.7968805, + 44.8464146, + 44.8642758, + 44.8077684, + 44.8526095, + 44.8511475, + 44.8265045, + 44.8599885, + 44.8632874, + 44.7915011, + 44.8130803, + 44.8588988, + 44.8279737, + 44.8517457, + 44.8325053, + 44.854169, + 44.8383834, + 44.7920334, + 44.8500962, + 44.8267007, + 44.8310036, + 44.8003845, + 44.8584878, + 44.8282573, + 44.8738859, + 44.8150262, + 44.8188706, + 44.8265358, + 44.8429974, + 44.8481944, + 44.8278935, + 44.848398, + 44.8227929, + 44.7966723, + 44.825783, + 44.8437743, + 44.8589077, + 44.8675164, + 44.8468975, + 44.8230651, + 44.8275103, + 44.8299181, + 44.8532619, + 44.8462539, + 44.8538162, + 44.8658199, + 44.8262833, + 44.822181, + 44.8626016, + 44.8452123, + 44.8441478, + 44.8338711, + 44.8669415, + 44.8068109, + 44.8317573, + 44.8561372, + 44.8411383, + 44.8326183, + 44.814502, + 44.8059145, + 44.8378395, + 44.842977, + 44.8348282, + 44.8416628, + 44.8471835, + 44.862612, + 44.8330332, + 44.8408779, + 44.8331199, + 44.8313122, + 44.8332348, + 44.8412219, + 44.8247146, + 44.8494652, + 44.820317, + 44.8500457, + 44.8431439, + 44.8123769, + 44.8240548, + 44.8392607, + 44.8318262, + 44.8446454, + 44.8347829, + 44.8388687, + 44.8298603, + 44.8359397, + 44.8220935, + 44.8422055, + 44.8515504, + 44.8546178, + 44.8484148, + 44.8343893, + 44.853209, + 44.8578681, + 44.8326329, + 44.8351755, + 44.8429267, + 44.8600704, + 44.8618162, + 44.8380293, + 44.8517074, + 44.8371083, + 44.8360588, + 44.855602, + 44.8299539, + 44.8377883, + 44.8429496, + 44.8403032, + 44.8414957, + 44.8403384, + 44.8490836, + 44.8377885, + 44.8264212, + 44.8442269, + 44.8382617, + 44.826297, + 44.8306361 + ], + "lon": [ + -0.7246501, + -0.6689618, + -0.7146676, + -0.6909947, + -0.6306502, + -0.6673258, + -0.4966899, + -0.5128187, + -0.5176289, + -0.6775347, + -0.6576449, + -0.6629757, + -0.6588671, + -0.6597112, + -0.6871282, + -0.6499211, + -0.623816, + -0.5178249, + -0.6463612, + -0.6447535, + -0.655176, + -0.5661566, + -0.6143178, + -0.6685358, + -0.5414654, + -0.6387356, + -0.6133743, + -0.5105045, + -0.6547759, + -0.5817438, + -0.5825468, + -0.6459366, + -0.5515963, + -0.5906954, + -0.6350506, + -0.5662214, + -0.5443327, + -0.6344371, + -0.5661623, + -0.5269656, + -0.5677901, + -0.5652057, + -0.6465204, + -0.5700493, + -0.6233263, + -0.5971532, + -0.6292522, + -0.5564476, + -0.5482081, + -0.5851242, + -0.5832471, + -0.6054744, + -0.5706139, + -0.6326682, + -0.6018689, + -0.5801979, + -0.5242001, + -0.5600546, + -0.5992294, + -0.6086092, + -0.6257739, + -0.5887606, + -0.5999496, + -0.6131256, + -0.5641958, + -0.5810805, + -0.5934903, + -0.6143832, + -0.6104667, + -0.5865861, + -0.6168934, + -0.5915297, + -0.5855819, + -0.54983, + -0.5873421, + -0.6098564, + -0.5696593, + -0.5623689, + -0.5740119, + -0.5509087, + -0.5999382, + -0.6018422, + -0.5503284, + -0.5919697, + -0.5860458, + -0.5982369, + -0.5529707, + -0.6170405, + -0.5897602, + -0.5575143, + -0.5658427, + -0.5480908, + -0.5821903, + -0.6006856, + -0.5758908, + -0.5814479, + -0.5917218, + -0.5649509, + -0.588682, + -0.5612341, + -0.5724844, + -0.5630395, + -0.5757641, + -0.5920629, + -0.5816331, + -0.5627102, + -0.5760778, + -0.5924539, + -0.5986834, + -0.5336374, + -0.5622355, + -0.5709743, + -0.5706739, + -0.6023231, + -0.5902795, + -0.5557321, + -0.5801851, + -0.5996952, + -0.5713111, + -0.567184, + -0.5928927, + -0.5910414, + -0.5769525, + -0.5613928, + -0.582833, + -0.5756676, + -0.5781469, + -0.5452532, + -0.5718546, + -0.5820039, + -0.5772404, + -0.5910309, + -0.5702434, + -0.5720342, + -0.5596604, + -0.5774479, + -0.5646641, + -0.574807, + -0.6035099, + -0.5821149, + -0.5817819, + -0.5848222, + -0.571631, + -0.5743468, + -0.5757416, + -0.5881235, + -0.5672651, + -0.5580802, + -0.5671119, + -0.5720497, + -0.5738986, + -0.5544678, + -0.5514922, + -0.584365, + -0.5742719, + -0.5727796, + -0.5754273, + -0.5631938, + -0.5681171, + -0.5703384, + -0.5703728, + -0.5691361, + -0.5808037, + -0.5595538, + -0.5625376, + -0.5671556, + -0.5573234, + -0.5743445, + -0.5764818, + -0.5570718, + -0.5732131 + ], + "marker": { + "color": "#6DDE75", + "size": 8 + }, + "mode": "markers", + "name": "normal", + "type": "scattermapbox" + } + ], + "layout": { + "legend": { + "orientation": "h", + "x": 0.5, + "xanchor": "center", + "y": 1.1, + "yanchor": "top" + }, + "mapbox": { + "accesstoken": "pk.eyJ1IjoiYmFib3UiLCJhIjoiY2swZ3J5cndxMDl1ajNkbnFtOXh5NHRxOCJ9.UxT93M7i57pYMH3hhzXbgQ", + "center": { + "lat": 44.837794, + "lon": -0.581662 + }, + "style": "light", + "zoom": 15 + }, + "showlegend": true, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + } + } + }, + "text/html": [ + "
\n", + " \n", + " \n", + "
\n", + " \n", + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "color_etat = {'anomaly': '#EB4D50',\n", + " 'inactive': '#5E9BE6',\n", + " 'normal': '#6DDE75'}\n", + "\n", + "wtf_compteur = 0\n", + "for etat in station_control['etat'].unique():\n", + "#for etat in station_control[station_control['etat'] == 'anomaly']['etat'].unique():\n", + " # Filter\n", + " temp = station_control[station_control['etat'] == etat]\n", + " \n", + " # Building text\n", + " texts = []\n", + " for idx, station in temp.iterrows():\n", + " text = str(station['NOM']) \\\n", + " + \"
\" + \"station N° : \" + str(station['station_id']) \\\n", + " + \"
\" + \"Nombre de vélo dispo : \" + str(station['available_bikes']) \\\n", + " + \"
\" + \"Activité suspecte depuis : \" + str(station['anomaly_since_str'])\n", + " texts.append(text)\n", + " \n", + " if wtf_compteur == 0:\n", + " fig = go.Figure(go.Scattermapbox(lat=temp['lat'],\n", + " lon=temp['lon'],\n", + " mode='markers',\n", + " #text=texts,\n", + " hoverinfo='text',\n", + " hovertext=texts,\n", + " marker_size=8, \n", + " marker_color=color_etat[etat],\n", + " name=etat))\n", + " else:\n", + " fig.add_trace(go.Scattermapbox(lat=temp['lat'],\n", + " lon=temp['lon'],\n", + " mode='markers',\n", + " #text=texts,\n", + " hoverinfo='text',\n", + " hovertext=texts,\n", + " marker_size=8, \n", + " marker_color=color_etat[etat],\n", + " name=etat))\n", + " \n", + " wtf_compteur = 1\n", + " \n", + "fig.update_layout(mapbox=dict(center= dict(lat=44.837794, lon=-0.581662), \n", + " accesstoken= MAPBOX_TOKEN,\n", + " zoom=15,\n", + " style=\"light\"),\n", + " showlegend=True,\n", + " legend=dict(orientation=\"h\",\n", + " yanchor=\"top\",\n", + " xanchor=\"center\",\n", + " y=1.1,\n", + " x=0.5\n", + " )\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 233, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-07T18:49:26.379716Z", + "start_time": "2021-04-07T18:49:26.347753Z" + } + }, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "lat": [ + 52.370216, + 53.2191696, + 52.160114, + 50.851368, + 51.8125626 + ], + "lon": [ + 4.895168, + 6.5666699, + 4.49701, + 5.690973, + 5.8372264 + ], + "marker": { + "color": "red", + "size": 12 + }, + "mode": "markers", + "text": [ + "Amsterdam", + "Groningen", + "Leiden", + "Maastricht", + "Nijmegen" + ], + "textposition": "top center", + "type": "scattermapbox" + } + ], + "layout": { + "height": 700, + "mapbox": { + "accesstoken": "pk.eyJ1IjoiYmFib3UiLCJhIjoiY2swZ3J5cndxMDl1ajNkbnFtOXh5NHRxOCJ9.UxT93M7i57pYMH3hhzXbgQ", + "center": { + "lat": 52.370216, + "lon": 4.895168 + }, + "style": "light", + "zoom": 6 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Netherlands", + "x": 0.5 + }, + "width": 750 + } + }, + "text/html": [ + "
\n", + " \n", + " \n", + "
\n", + " \n", + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "lats = [52.370216, 53.2191696, 52.160114, 50.851368, 51.8125626]\n", + "lons = [4.895168, 6.5666699, 4.497010, 5.690973, 5.8372264 ]\n", + "text= ['Amsterdam', 'Groningen', 'Leiden', 'Maastricht', 'Nijmegen']\n", + "fig = go.Figure(go.Scattermapbox(lat=lats,\n", + " lon=lons,\n", + " mode='markers',\n", + " text=text, \n", + " textposition='top center',\n", + " marker_size=12, marker_color='red'))\n", + "fig.update_layout(title_text ='Netherlands', title_x =0.5, width=750, height=700,\n", + " mapbox = dict(center= dict(lat=52.370216, lon=4.895168), \n", + " accesstoken= MAPBOX_TOKEN,\n", + " zoom=6,\n", + " style=\"light\"\n", + " \n", + " ))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Kepler" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T09:04:56.039727Z", + "start_time": "2021-04-08T09:04:55.070586Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: keplergl in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (0.2.2)\n", + "Requirement already satisfied: ipywidgets<8,>=7.0.0 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from keplergl) (7.6.3)\n", + "Requirement already satisfied: traittypes>=0.2.1 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from keplergl) (0.2.1)\n", + "Requirement already satisfied: pandas>=0.23.0 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from keplergl) (1.1.1)\n", + "Requirement already satisfied: Shapely>=1.6.4.post2 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from keplergl) (1.7.1)\n", + "Requirement already satisfied: geopandas>=0.5.0 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from keplergl) (0.9.0)\n", + "Requirement already satisfied: nbformat>=4.2.0 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from ipywidgets<8,>=7.0.0->keplergl) (5.0.8)\n", + "Requirement already satisfied: ipykernel>=4.5.1 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from ipywidgets<8,>=7.0.0->keplergl) (5.3.4)\n", + "Requirement already satisfied: widgetsnbextension~=3.5.0 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from ipywidgets<8,>=7.0.0->keplergl) (3.5.1)\n", + "Requirement already satisfied: jupyterlab-widgets>=1.0.0; python_version >= \"3.6\" in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from ipywidgets<8,>=7.0.0->keplergl) (1.0.0)\n", + "Requirement already satisfied: traitlets>=4.3.1 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from ipywidgets<8,>=7.0.0->keplergl) (5.0.5)\n", + "Requirement already satisfied: ipython>=4.0.0; python_version >= \"3.3\" in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from ipywidgets<8,>=7.0.0->keplergl) (7.18.1)\n", + "Requirement already satisfied: pytz>=2017.2 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from pandas>=0.23.0->keplergl) (2020.1)\n", + "Requirement already satisfied: numpy>=1.15.4 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from pandas>=0.23.0->keplergl) (1.19.1)\n", + "Requirement already satisfied: python-dateutil>=2.7.3 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from pandas>=0.23.0->keplergl) (2.8.1)\n", + "Requirement already satisfied: pyproj>=2.2.0 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from geopandas>=0.5.0->keplergl) (3.0.1)\n", + "Requirement already satisfied: fiona>=1.8 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from geopandas>=0.5.0->keplergl) (1.8.19)\n", + "Requirement already satisfied: ipython-genutils in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets<8,>=7.0.0->keplergl) (0.2.0)\n", + "Requirement already satisfied: jupyter-core in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets<8,>=7.0.0->keplergl) (4.6.3)\n", + "Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from nbformat>=4.2.0->ipywidgets<8,>=7.0.0->keplergl) (3.2.0)\n", + "Requirement already satisfied: jupyter-client in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets<8,>=7.0.0->keplergl) (6.1.7)\n", + "Requirement already satisfied: tornado>=4.2 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from ipykernel>=4.5.1->ipywidgets<8,>=7.0.0->keplergl) (6.0.4)\n", + "Requirement already satisfied: notebook>=4.4.1 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from widgetsnbextension~=3.5.0->ipywidgets<8,>=7.0.0->keplergl) (6.1.1)\n", + "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets<8,>=7.0.0->keplergl) (3.0.8)\n", + "Requirement already satisfied: decorator in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets<8,>=7.0.0->keplergl) (4.4.2)\n", + "Requirement already satisfied: pexpect>4.3; sys_platform != \"win32\" in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets<8,>=7.0.0->keplergl) (4.8.0)\n", + "Requirement already satisfied: pickleshare in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets<8,>=7.0.0->keplergl) (0.7.5)\n", + "Requirement already satisfied: setuptools>=18.5 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets<8,>=7.0.0->keplergl) (50.3.2)\n", + "Requirement already satisfied: pygments in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets<8,>=7.0.0->keplergl) (2.7.1)\n", + "Requirement already satisfied: jedi>=0.10 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets<8,>=7.0.0->keplergl) (0.17.2)\n", + "Requirement already satisfied: backcall in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets<8,>=7.0.0->keplergl) (0.2.0)\n", + "Requirement already satisfied: six>=1.5 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from python-dateutil>=2.7.3->pandas>=0.23.0->keplergl) (1.15.0)\n", + "Requirement already satisfied: certifi in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from pyproj>=2.2.0->geopandas>=0.5.0->keplergl) (2020.6.20)\n", + "Requirement already satisfied: attrs>=17 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from fiona>=1.8->geopandas>=0.5.0->keplergl) (20.2.0)\n", + "Requirement already satisfied: click<8,>=4.0 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from fiona>=1.8->geopandas>=0.5.0->keplergl) (7.1.2)\n", + "Requirement already satisfied: cligj>=0.5 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from fiona>=1.8->geopandas>=0.5.0->keplergl) (0.7.1)\n", + "Requirement already satisfied: click-plugins>=1.0 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from fiona>=1.8->geopandas>=0.5.0->keplergl) (1.1.1)\n", + "Requirement already satisfied: munch in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from fiona>=1.8->geopandas>=0.5.0->keplergl) (2.5.0)\n", + "Requirement already satisfied: pyrsistent>=0.14.0 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets<8,>=7.0.0->keplergl) (0.16.0)\n", + "Requirement already satisfied: pyzmq>=13 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from jupyter-client->ipykernel>=4.5.1->ipywidgets<8,>=7.0.0->keplergl) (19.0.2)\n", + "Requirement already satisfied: terminado>=0.8.3 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7.0.0->keplergl) (0.8.3)\n", + "Requirement already satisfied: prometheus-client in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7.0.0->keplergl) (0.8.0)\n", + "Requirement already satisfied: nbconvert in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7.0.0->keplergl) (6.0.7)\n", + "Requirement already satisfied: Send2Trash in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7.0.0->keplergl) (1.5.0)\n", + "Requirement already satisfied: jinja2 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7.0.0->keplergl) (2.11.2)\n", + "Requirement already satisfied: argon2-cffi in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7.0.0->keplergl) (20.1.0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: wcwidth in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets<8,>=7.0.0->keplergl) (0.2.5)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from pexpect>4.3; sys_platform != \"win32\"->ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets<8,>=7.0.0->keplergl) (0.6.0)\n", + "Requirement already satisfied: parso<0.8.0,>=0.7.0 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from jedi>=0.10->ipython>=4.0.0; python_version >= \"3.3\"->ipywidgets<8,>=7.0.0->keplergl) (0.7.1)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7.0.0->keplergl) (1.4.2)\n", + "Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7.0.0->keplergl) (0.5.1)\n", + "Requirement already satisfied: entrypoints>=0.2.2 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7.0.0->keplergl) (0.3)\n", + "Requirement already satisfied: testpath in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7.0.0->keplergl) (0.4.4)\n", + "Requirement already satisfied: bleach in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7.0.0->keplergl) (3.2.1)\n", + "Requirement already satisfied: defusedxml in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7.0.0->keplergl) (0.6.0)\n", + "Requirement already satisfied: mistune<2,>=0.8.1 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7.0.0->keplergl) (0.8.4)\n", + "Requirement already satisfied: jupyterlab-pygments in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7.0.0->keplergl) (0.1.2)\n", + "Requirement already satisfied: MarkupSafe>=0.23 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7.0.0->keplergl) (1.1.1)\n", + "Requirement already satisfied: cffi>=1.0.0 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7.0.0->keplergl) (1.14.3)\n", + "Requirement already satisfied: async-generator in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from nbclient<0.6.0,>=0.5.0->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7.0.0->keplergl) (1.10)\n", + "Requirement already satisfied: nest-asyncio in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from nbclient<0.6.0,>=0.5.0->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7.0.0->keplergl) (1.4.1)\n", + "Requirement already satisfied: packaging in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7.0.0->keplergl) (20.4)\n", + "Requirement already satisfied: webencodings in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7.0.0->keplergl) (0.5.1)\n", + "Requirement already satisfied: pycparser in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from cffi>=1.0.0->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7.0.0->keplergl) (2.20)\n", + "Requirement already satisfied: pyparsing>=2.0.2 in /home/gillesa/anaconda3/envs/vcub_keeper/lib/python3.8/site-packages (from packaging->bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets<8,>=7.0.0->keplergl) (2.4.7)\n" + ] + } + ], + "source": [ + "# Installation de Kepler\n", + "!pip install keplergl\n", + "\n", + "# To Do in terminal : https://github.com/keplergl/kepler.gl/tree/master/bindings/kepler.gl-jupyter#installation\n", + "#jupyter nbextension install --py --sys-prefix keplergl # can be skipped for notebook 5.3 and above\n", + "#upyter nbextension enable --py --sys-prefix keplergl # can be skipped for notebook 5.3 and above" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T09:08:52.042434Z", + "start_time": "2021-04-08T09:08:52.024341Z" + } + }, + "outputs": [], + "source": [ + "from keplergl import KeplerGl" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Preprocessing data kepler" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T09:11:24.128930Z", + "start_time": "2021-04-08T09:11:24.110261Z" + } + }, + "outputs": [], + "source": [ + "station_control_kepler = station_control.drop(['last_date_anomaly', 'anomaly_since'], axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T12:23:43.741075Z", + "start_time": "2021-04-08T12:23:43.716617Z" + } + }, + "outputs": [], + "source": [ + "config_global = {\n", + " \"version\": \"v1\",\n", + " \"config\": {\n", + " \"visState\": {\n", + " \"filters\": [],\n", + " \"layers\": [\n", + " {\n", + " \"id\": \"fmdzqhw\",\n", + " \"type\": \"point\",\n", + " \"config\": {\n", + " \"dataId\": \"data_1\",\n", + " \"label\": \"Station Vcub\",\n", + " \"color\": [\n", + " 18,\n", + " 147,\n", + " 154\n", + " ],\n", + " \"columns\": {\n", + " \"lat\": \"lat\",\n", + " \"lng\": \"lon\",\n", + " \"altitude\": None\n", + " },\n", + " \"isVisible\": True,\n", + " \"visConfig\": {\n", + " \"radius\": 12,\n", + " \"fixedRadius\": False,\n", + " \"opacity\": 0.8,\n", + " \"outline\": False,\n", + " \"thickness\": 2,\n", + " \"strokeColor\": None,\n", + " \"colorRange\": {\n", + " \"name\": \"Custom Palette\",\n", + " \"type\": \"custom\",\n", + " \"category\": \"Custom\",\n", + " \"colors\": [\n", + " \"#EB4D50\",\n", + " \"#5E9BE6\",\n", + " \"#6DDE75\"\n", + " ]\n", + " },\n", + " \"strokeColorRange\": {\n", + " \"name\": \"Global Warming\",\n", + " \"type\": \"sequential\",\n", + " \"category\": \"Uber\",\n", + " \"colors\": [\n", + " \"#5A1846\",\n", + " \"#900C3F\",\n", + " \"#C70039\",\n", + " \"#E3611C\",\n", + " \"#F1920E\",\n", + " \"#FFC300\"\n", + " ]\n", + " },\n", + " \"radiusRange\": [\n", + " 0,\n", + " 50\n", + " ],\n", + " \"filled\": True\n", + " },\n", + " \"hidden\": False,\n", + " \"textLabel\": [\n", + " {\n", + " \"field\": None,\n", + " \"color\": [\n", + " 255,\n", + " 255,\n", + " 255\n", + " ],\n", + " \"size\": 18,\n", + " \"offset\": [\n", + " 0,\n", + " 0\n", + " ],\n", + " \"anchor\": \"start\",\n", + " \"alignment\": \"center\"\n", + " }\n", + " ]\n", + " },\n", + " \"visualChannels\": {\n", + " \"colorField\": {\n", + " \"name\": \"etat\",\n", + " \"type\": \"string\"\n", + " },\n", + " \"colorScale\": \"ordinal\",\n", + " \"strokeColorField\": None,\n", + " \"strokeColorScale\": \"quantile\",\n", + " \"sizeField\": None,\n", + " \"sizeScale\": \"linear\"\n", + " }\n", + " }\n", + " ],\n", + " \"interactionConfig\": {\n", + " \"tooltip\": {\n", + " \"fieldsToShow\": {\n", + " \"data_1\": [\n", + " {\n", + " \"name\": \"station_id\",\n", + " \"format\": None\n", + " },\n", + " {\n", + " \"name\": \"NOM\",\n", + " \"format\": None\n", + " },\n", + " {\n", + " \"name\": \"etat\",\n", + " \"format\": None\n", + " },\n", + " {\n", + " \"name\": \"available_bikes\",\n", + " \"format\": None\n", + " },\n", + " {\n", + " \"name\": \"anomaly_since_str\",\n", + " \"format\": None\n", + " }\n", + " ]\n", + " },\n", + " \"compareMode\": True,\n", + " \"compareType\": \"absolute\",\n", + " \"enabled\": True\n", + " },\n", + " \"brush\": {\n", + " \"size\": 0.5,\n", + " \"enabled\": False\n", + " },\n", + " \"geocoder\": {\n", + " \"enabled\": False\n", + " },\n", + " \"coordinate\": {\n", + " \"enabled\": False\n", + " }\n", + " },\n", + " \"layerBlending\": \"normal\",\n", + " \"splitMaps\": [],\n", + " \"animationConfig\": {\n", + " \"currentTime\": None,\n", + " \"speed\": 1\n", + " }\n", + " },\n", + " \"mapState\": {\n", + " \"bearing\": 0,\n", + " \"dragRotate\": False,\n", + " \"latitude\": 44.85169239146265,\n", + " \"longitude\": -0.5868239240658858,\n", + " \"pitch\": 0,\n", + " \"zoom\": 11.452871077625481,\n", + " \"isSplit\": False\n", + " },\n", + " \"mapStyle\": {\n", + " \"styleType\": \"muted\",\n", + " \"topLayerGroups\": {\n", + " \"water\": False\n", + " },\n", + " \"visibleLayerGroups\": {\n", + " \"label\": True,\n", + " \"road\": True,\n", + " \"border\": False,\n", + " \"building\": True,\n", + " \"water\": True,\n", + " \"land\": True,\n", + " \"3d building\": False\n", + " },\n", + " \"threeDBuildingColor\": [\n", + " 137,\n", + " 137,\n", + " 137\n", + " ],\n", + " \"mapStyles\": {}\n", + " }\n", + " }\n", + "}\n", + "\n", + "\n", + "\n", + "\n", + "# VERSION GLOBAL\n", + "# \"mapState\": {\n", + "# \"bearing\": 0,\n", + "# \"dragRotate\": False,\n", + "# \"latitude\": 44.85169239146265,\n", + "# \"longitude\": -0.5868239240658858,\n", + "# \"pitch\": 0,\n", + "# \"zoom\": 11.452871077625481,\n", + "# \"isSplit\": False\n", + "# }," + ] + }, + { + "cell_type": "markdown", + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T12:47:57.171854Z", + "start_time": "2021-04-08T12:47:57.152321Z" + } + }, + "source": [ + "### Graphique" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T12:23:48.978030Z", + "start_time": "2021-04-08T12:23:48.944815Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "User Guide: https://docs.kepler.gl/docs/keplergl-jupyter\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5344eb4e02b0470d9df36f11b0802e17", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "KeplerGl(config={'version': 'v1', 'config': {'visState': {'filters': [], 'layers': [{'id': 'fmdzqhw', 'type': …" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Load kepler.gl with map data and config\n", + "map_kepler = KeplerGl(height=400, data={\"data_1\": station_control_kepler}, config=config_global)\n", + "map_kepler" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T12:23:50.119147Z", + "start_time": "2021-04-08T12:23:50.088682Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Map saved to keplergl_map_global.html!\n" + ] + } + ], + "source": [ + "map_kepler.save_to_html(file_name='keplergl_map_global.html')" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T12:23:51.551954Z", + "start_time": "2021-04-08T12:23:51.531118Z" + } + }, + "outputs": [], + "source": [ + "# To select a station\n", + "station_id_to_plot = 6\n", + "\n", + "# Get lat / lon\n", + "station_id_to_plot_lat = \\\n", + " station_control_kepler[station_control_kepler['station_id'] == station_id_to_plot]['lat'].values[0]\n", + "station_id_to_plot_lon = \\\n", + " station_control_kepler[station_control_kepler['station_id'] == station_id_to_plot]['lon'].values[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T12:23:52.723397Z", + "start_time": "2021-04-08T12:23:52.703740Z" + } + }, + "outputs": [], + "source": [ + "# Custom view for station plot\n", + "config_station = config_global\n", + "config_station['config']['mapState']['latitude'] = station_id_to_plot_lat\n", + "config_station['config']['mapState']['longitude'] = station_id_to_plot_lon\n", + "config_station['config']['mapState']['zoom'] = 15.3\n", + "config_station['config']['mapState']['bearing'] = 24\n", + "config_station['config']['mapState']['dragRotate'] = True\n", + "config_station['config']['mapState']['pitch'] = 54\n", + "config_global['config']['mapStyle']['visibleLayerGroups']['3d building'] = True # Building 3D" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T12:23:53.736491Z", + "start_time": "2021-04-08T12:23:53.704176Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "User Guide: https://docs.kepler.gl/docs/keplergl-jupyter\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3be066f08d284d28b928a6a18c887119", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "KeplerGl(config={'version': 'v1', 'config': {'visState': {'filters': [], 'layers': [{'id': 'fmdzqhw', 'type': …" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Load kepler.gl with map data and config for One Station\n", + "map_kepler = KeplerGl(height=400, data={\"data_1\": station_control_kepler}, config=config_station)\n", + "map_kepler" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T12:23:54.835395Z", + "start_time": "2021-04-08T12:23:54.806804Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Map saved to keplergl_map_station.html!\n" + ] + } + ], + "source": [ + "map_kepler.save_to_html(file_name='keplergl_map_station.html')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Note :** Je n'arrive pas à voir les graphiques directement dans le Notebook (WIP)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Industrialisation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Simulation de données" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T14:11:16.868424Z", + "start_time": "2021-04-08T14:11:16.640251Z" + } + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import io\n", + "\n", + "from vcub_keeper.reader.reader import read_stations_attributes\n", + "from vcub_keeper.config import ROOT_DATA_REF\n", + "\n", + "# Simulation de données\n", + "\n", + "simulated_data=\"\"\"station_id,mean_activity,is_anomaly,is_inactive,last_date_anomaly,anomaly_since\n", + "6,0.4,1,0,2021-04-07 11:10:00+02:00,2021-04-07 09:00:00+02:00\n", + "59,0.42,1,0,2021-04-07 11:10:00+02:00,2021-04-07 10:10:00+02:00\n", + "138,0.36,0,1,,\n", + "181,0.0,0,0,,\n", + "181,0.0,0,0,,\n", + "160,0.0,0,0,,\n", + "161,0.01,0,0,,\n", + "180,0.01,0,0,,\n", + "92,0.01,0,0,,\n", + "167,0.01,0,0,,\n", + "168,0.01,0,0,,\n", + "183,0.01,0,0,,\n", + "81,0.02,0,0,,\n", + "150,0.02,0,0,,\n", + "72,0.02,0,0,,\n", + "71,0.02,0,0,,\n", + "91,0.02,0,0,,\n", + "80,0.02,0,0,,\n", + "165,0.02,0,0,,\n", + "156,0.02,0,0,,\n", + "157,0.03,0,0,,\n", + "87,0.03,0,0,,\n", + "182,0.03,0,0,,\n", + "93,0.03,0,0,,\n", + "94,0.03,0,0,,\n", + "149,0.04,0,0,,\n", + "82,0.04,0,0,,\n", + "88,0.05,0,0,,\n", + "164,0.05,0,0,,\n", + "76,0.05,0,0,,\n", + "77,0.05,0,0,,\n", + "158,0.05,0,0,,\n", + "148,0.05,0,0,,\n", + "79,0.05,0,0,,\n", + "95,0.05,0,0,,\n", + "151,0.05,0,0,,\n", + "86,0.06,0,0,,\n", + "153,0.06,0,0,,\n", + "159,0.06,0,0,,\n", + "85,0.06,0,0,,\n", + "162,0.06,0,0,,\n", + "169,0.07,0,0,,\n", + "177,0.07,0,0,,\n", + "78,0.07,0,0,,\n", + "147,0.07,0,0,,\n", + "97,0.07,0,0,,\n", + "84,0.08,0,0,,\n", + "163,0.08,0,0,,\n", + "63,0.09,0,0,,\n", + "146,0.09,0,0,,\n", + "166,0.1,0,0,,\n", + "89,0.1,0,0,,\n", + "152,0.1,0,0,,\n", + "143,0.1,0,0,,\n", + "115,0.1,0,0,,\n", + "142,0.11,0,0,,\n", + "64,0.11,0,0,,\n", + "74,0.12,0,0,,\n", + "144,0.12,0,0,,\n", + "51,0.12,0,0,,\n", + "114,0.13,0,0,,\n", + "145,0.13,0,0,,\n", + "83,0.13,0,0,,\n", + "113,0.13,0,0,,\n", + "251,0.13,0,0,,\n", + "38,0.13,0,0,,\n", + "70,0.14,0,0,,\n", + "75,0.14,0,0,,\n", + "175,0.14,0,0,,\n", + "178,0.16,0,0,,\n", + "32,0.16,0,0,,\n", + "12,0.17,0,0,,\n", + "90,0.17,0,0,,\n", + "50,0.17,0,0,,\n", + "49,0.18,0,0,,\n", + "155,0.18,0,0,,\n", + "129,0.18,0,0,,\n", + "52,0.18,0,0,,\n", + "26,0.18,0,0,,\n", + "31,0.18,0,0,,\n", + "29,0.19,0,0,,\n", + "53,0.2,0,0,,\n", + "30,0.2,0,0,,\n", + "154,0.2,0,0,,\n", + "35,0.2,0,0,,\n", + "126,0.2,0,0,,\n", + "176,0.21,0,0,,\n", + "25,0.21,0,0,,\n", + "117,0.21,0,0,,\n", + "122,0.21,0,0,,\n", + "137,0.21,0,0,,\n", + "96,0.22,0,0,,\n", + "73,0.23,0,0,,\n", + "141,0.23,0,0,,\n", + "27,0.23,0,0,,\n", + "69,0.23,0,0,,\n", + "14,0.23,0,0,,\n", + "179,0.23,0,0,,\n", + "47,0.24,0,0,,\n", + "13,0.24,0,0,,\n", + "46,0.24,0,0,,\n", + "116,0.24,0,0,,\n", + "48,0.24,0,0,,\n", + "67,0.25,0,0,,\n", + "121,0.25,0,0,,\n", + "173,0.25,0,0,,\n", + "17,0.26,0,0,,\n", + "140,0.27,0,0,,\n", + "107,0.27,0,0,,\n", + "171,0.27,0,0,,\n", + "33,0.27,0,0,,\n", + "61,0.27,0,0,,\n", + "34,0.27,0,0,,\n", + "170,0.28,0,0,,\n", + "132,0.28,0,0,,\n", + "128,0.28,0,0,,\n", + "119,0.28,0,0,,\n", + "15,0.29,0,0,,\n", + "18,0.29,0,0,,\n", + "124,0.3,0,0,,\n", + "118,0.3,0,0,,\n", + "111,0.31,0,0,,\n", + "10,0.31,0,0,,\n", + "62,0.32,0,0,,\n", + "66,0.32,0,0,,\n", + "105,0.32,0,0,,\n", + "130,0.32,0,0,,\n", + "112,0.32,0,0,,\n", + "2,0.32,0,0,,\n", + "68,0.32,0,0,,\n", + "23,0.34,0,0,,\n", + "11,0.34,0,0,,\n", + "60,0.34,0,0,,\n", + "120,0.34,0,0,,\n", + "9,0.34,0,0,,\n", + "3,0.35,0,0,,\n", + "45,0.35,0,0,,\n", + "136,0.36,0,0,,\n", + "24,0.36,0,0,,\n", + "21,0.36,0,0,,\n", + "108,0.37,0,0,,\n", + "16,0.37,0,0,,\n", + "131,0.37,0,0,,\n", + "36,0.38,0,0,,\n", + "20,0.39,0,0,,\n", + "110,0.39,0,0,,\n", + "139,0.39,0,0,,\n", + "42,0.4,0,0,,\n", + "125,0.4,0,0,,\n", + "19,0.41,0,0,,\n", + "135,0.41,0,0,,\n", + "41,0.43,0,0,,\n", + "28,0.44,0,0,,\n", + "7,0.44,0,0,,\n", + "109,0.44,0,0,,\n", + "4,0.44,0,0,,\n", + "57,0.44,0,0,,\n", + "55,0.44,0,0,,\n", + "37,0.45,0,0,,\n", + "8,0.46,0,0,,\n", + "58,0.47,0,0,,\n", + "99,0.48,0,0,,\n", + "134,0.48,0,0,,\n", + "104,0.49,0,0,,\n", + "40,0.49,0,0,,\n", + "98,0.49,0,0,,\n", + "172,0.5,0,0,,\n", + "1,0.51,0,0,,\n", + "56,0.51,0,0,,\n", + "43,0.51,0,0,,\n", + "44,0.53,0,0,,\n", + "100,0.54,0,0,,\n", + "133,0.55,0,0,,\n", + "103,0.58,0,0,,\n", + "101,0.6,0,0,,\n", + "102,0.63,0,0,,\n", + "5,0.64,0,0,,\n", + "65,0.65,0,0,,\n", + "174,0.67,0,0,,\n", + "123,0.74,0,0,,\n", + "54,0.74,0,0,,\n", + "39,0.82,0,0,,\n", + "22,0.82,0,0,,\n", + "127,0.9,0,0,,\n", + "106,1.03,0,0,,\n", + "\"\"\"\n", + "\n", + "station_control = pd.read_csv( io.StringIO(simulated_data) , sep=\",\")\n", + "\n", + "# Idem as read_station_control_from_s3 from vcub_watcher functino\n", + "station_control['last_date_anomaly'] = \\\n", + " pd.to_datetime(station_control['last_date_anomaly'])\n", + "try:\n", + " station_control['last_date_anomaly'] = \\\n", + " station_control['last_date_anomaly'].dt.tz_localize('Europe/Paris')\n", + "except: # try to convert TZ\n", + " station_control['last_date_anomaly'] = \\\n", + " station_control['last_date_anomaly'].dt.tz_convert('Europe/Paris')\n", + "\n", + "#station_control['anomaly_since'] = \\\n", + "# pd.to_datetime(station_control['anomaly_since'], utc=True)\n", + "station_control['anomaly_since'] = \\\n", + " pd.to_datetime(station_control['anomaly_since'])\n", + "try:\n", + " station_control['anomaly_since'] = \\\n", + " station_control['anomaly_since'].dt.tz_localize('Europe/Paris')\n", + "except: # try to convert TZ\n", + " station_control['anomaly_since'] = \\\n", + " station_control['anomaly_since'].dt.tz_convert('Europe/Paris')\n", + " \n", + "# Simulate \"available_bikes\" - Nombre de vélo présent à la station\n", + "station_control['available_bikes'] = np.random.randint(0, 40, len(station_control))" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T14:11:17.245007Z", + "start_time": "2021-04-08T14:11:17.233617Z" + } + }, + "outputs": [], + "source": [ + "# Ajouter le lat/lon à station_control\n", + "# Lecture du fichier de réf des stations\n", + "stations = read_stations_attributes(path_directory=ROOT_DATA_REF)\n", + "stations = stations[['station_id', 'lat', 'lon', 'NOM']]\n", + "stations\n", + "\n", + "# Merge des données\n", + "station_control = station_control.merge(stations, on='station_id', how='left')\n", + "\n", + "# On ne prend que les stations avec lat / lon\n", + "station_control = station_control[~station_control.lat.isna()]" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T14:11:17.862053Z", + "start_time": "2021-04-08T14:11:17.842541Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
station_idmean_activityis_anomalyis_inactivelast_date_anomalyanomaly_sinceavailable_bikeslatlonNOM
060.40102021-04-07 11:10:00+02:002021-04-07 09:00:00+02:002544.837794-0.581662Square André Lhote
1590.42102021-04-07 11:10:00+02:002021-04-07 10:10:00+02:003244.849783-0.570244CAPC
21380.3601NaTNaT544.826560-0.564554Barbey
51600.0000NaTNaT3044.911972-0.724650Eglise St Aubin
61610.0100NaTNaT2744.904736-0.668962Le Taillan Mairie
\n", + "
" + ], + "text/plain": [ + " station_id mean_activity is_anomaly is_inactive \\\n", + "0 6 0.40 1 0 \n", + "1 59 0.42 1 0 \n", + "2 138 0.36 0 1 \n", + "5 160 0.00 0 0 \n", + "6 161 0.01 0 0 \n", + "\n", + " last_date_anomaly anomaly_since available_bikes \\\n", + "0 2021-04-07 11:10:00+02:00 2021-04-07 09:00:00+02:00 25 \n", + "1 2021-04-07 11:10:00+02:00 2021-04-07 10:10:00+02:00 32 \n", + "2 NaT NaT 5 \n", + "5 NaT NaT 30 \n", + "6 NaT NaT 27 \n", + "\n", + " lat lon NOM \n", + "0 44.837794 -0.581662 Square André Lhote \n", + "1 44.849783 -0.570244 CAPC \n", + "2 44.826560 -0.564554 Barbey \n", + "5 44.911972 -0.724650 Eglise St Aubin \n", + "6 44.904736 -0.668962 Le Taillan Mairie " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "station_control.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Avec plotly" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T12:55:54.953738Z", + "start_time": "2021-04-08T12:55:54.931870Z" + } + }, + "outputs": [], + "source": [ + "from vcub_keeper.config import MAPBOX_TOKEN" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T14:13:19.852817Z", + "start_time": "2021-04-08T14:13:19.827782Z" + } + }, + "outputs": [], + "source": [ + "def plot_map_station_with_plotly(station_control,\n", + " station_id=None,\n", + " offline_plot=False):\n", + " \"\"\"\n", + " Affiche une cartographie de l'agglomération de Bordeaux avec toutes les stations Vcub et leurs états\n", + " provenant des algorithmes (normal, inactive et anomaly).\n", + "\n", + " Si \"station_id\" est indiqué, alors la cartographie est focus sur la lat / lon de station (Numéro)\n", + "\n", + " Parameters\n", + " ----------\n", + " data : pd.DataFrame\n", + " En provenance de station_control.csv (vcub_watcher)\n", + " station_id : Int [opt]\n", + " Numéro de station que l'on souhaite voir (en focus) sur la cartographie.\n", + " offline_plot : bool [opt]\n", + " Pour retourner le graphique et l'utiliser dans une application\n", + "\n", + " Returns\n", + " -------\n", + " None\n", + "\n", + " Examples\n", + " --------\n", + "\n", + " plot_map_station_with_plotly(station_control=station_control, offline_plot=False)\n", + " \"\"\"\n", + " # Param plot with a given station_id\n", + " if station_id is not None:\n", + " # On centre le graphique sur la lat / lon de la station\n", + " center_lat = \\\n", + " station_control[station_control['station_id'] == station_id]['lat'].values[0]\n", + " center_lon = \\\n", + " station_control[station_control['station_id'] == station_id]['lon'].values[0]\n", + " zoom_plot = 15\n", + " else:\n", + " center_lat = 44.837794\n", + " center_lon = -0.581662\n", + " zoom_plot = 11\n", + "\n", + " # Preprocess avant graphique\n", + " station_control['etat'] = 'normal'\n", + "\n", + " # En anoamlie (HS prediction)\n", + " station_control.loc[station_control['is_anomaly'] == 1, 'etat'] = 'anomaly'\n", + "\n", + " # Inactive\n", + " station_control.loc[station_control['is_inactive'] == 1, 'etat'] = 'inactive'\n", + "\n", + " # Transform date to string\n", + " station_control['anomaly_since_str'] = \\\n", + " station_control['anomaly_since'].dt.strftime(date_format='%Y-%m-%d %H:%M')\n", + " station_control['anomaly_since_str'] = station_control['anomaly_since_str'].fillna('-')\n", + "\n", + " # Color for etat\n", + " color_etat = {'anomaly': '#EB4D50',\n", + " 'inactive': '#5E9BE6',\n", + " 'normal': '#6DDE75'}\n", + "\n", + " # To know when use add_trace after init fig\n", + " wtf_compteur = 0\n", + "\n", + " for etat in station_control['etat'].unique():\n", + " # Filter\n", + " temp = station_control[station_control['etat'] == etat]\n", + "\n", + " # Building text\n", + " texts = []\n", + " for idx, station in temp.iterrows():\n", + " text = str(station['NOM']) \\\n", + " + \"
\" + \"station N° : \" + str(station['station_id']) \\\n", + " + \"
\" + \"Nombre de vélo dispo : \" + str(station['available_bikes']) \\\n", + " + \"
\" + \"Activité suspecte depuis : \" + str(station['anomaly_since_str'])\n", + " texts.append(text)\n", + "\n", + " if wtf_compteur == 0:\n", + " fig = go.Figure(go.Scattermapbox(lat=temp['lat'],\n", + " lon=temp['lon'],\n", + " mode='markers',\n", + " hoverinfo='text',\n", + " hovertext=texts,\n", + " marker_size=9,\n", + " marker_color=color_etat[etat],\n", + " name=etat))\n", + " else:\n", + " fig.add_trace(go.Scattermapbox(lat=temp['lat'],\n", + " lon=temp['lon'],\n", + " mode='markers',\n", + " hoverinfo='text',\n", + " hovertext=texts,\n", + " marker_size=9,\n", + " marker_color=color_etat[etat],\n", + " name=etat))\n", + "\n", + " wtf_compteur = 1\n", + "\n", + " fig.update_layout(mapbox=dict(center=dict(lat=center_lat, lon=center_lon),\n", + " accesstoken=MAPBOX_TOKEN,\n", + " zoom=zoom_plot,\n", + " style=\"light\"),\n", + " showlegend=True,\n", + " legend=dict(orientation=\"h\",\n", + " yanchor=\"top\",\n", + " xanchor=\"center\",\n", + " y=1.1,\n", + " x=0.5\n", + " ))\n", + " if offline_plot is False:\n", + " iplot(fig)\n", + " else:\n", + " offline.plot(fig)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T14:12:55.710268Z", + "start_time": "2021-04-08T14:12:55.706477Z" + } + }, + "outputs": [], + "source": [ + "from vcub_keeper.visualisation import plot_map_station_with_plotly" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T14:13:21.783648Z", + "start_time": "2021-04-08T14:13:21.723725Z" + } + }, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "linkText": "Export to plot.ly", + "plotlyServerURL": "https://plot.ly", + "showLink": false + }, + "data": [ + { + "hoverinfo": "text", + "hovertext": [ + "Square André Lhote
station N° : 6
Nombre de vélo dispo : 25
Activité suspecte depuis : 2021-04-07 09:00", + "CAPC
station N° : 59
Nombre de vélo dispo : 32
Activité suspecte depuis : 2021-04-07 10:10" + ], + "lat": [ + 44.8377941, + 44.8497825 + ], + "lon": [ + -0.5816623, + -0.5702437 + ], + "marker": { + "color": "#EB4D50", + "size": 9 + }, + "mode": "markers", + "name": "anomaly", + "type": "scattermapbox" + }, + { + "hoverinfo": "text", + "hovertext": [ + "Barbey
station N° : 138
Nombre de vélo dispo : 5
Activité suspecte depuis : -" + ], + "lat": [ + 44.8265598 + ], + "lon": [ + -0.5645539 + ], + "marker": { + "color": "#5E9BE6", + "size": 9 + }, + "mode": "markers", + "name": "inactive", + "type": "scattermapbox" + }, + { + "hoverinfo": "text", + "hovertext": [ + "Eglise St Aubin
station N° : 160
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Le Taillan Mairie
station N° : 161
Nombre de vélo dispo : 27
Activité suspecte depuis : -", + "St Médard République
station N° : 92
Nombre de vélo dispo : 23
Activité suspecte depuis : -", + "Centre commercial St Médard
station N° : 167
Nombre de vélo dispo : 7
Activité suspecte depuis : -", + "Mairie de Blanquefort
station N° : 168
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "Morin Cazalet
station N° : 81
Nombre de vélo dispo : 1
Activité suspecte depuis : -", + "Artigues Feydeau
station N° : 150
Nombre de vélo dispo : 13
Activité suspecte depuis : -", + "Jean Zay
station N° : 72
Nombre de vélo dispo : 5
Activité suspecte depuis : -", + "La Gardette
station N° : 71
Nombre de vélo dispo : 15
Activité suspecte depuis : -", + "Mairie du Haillan
station N° : 91
Nombre de vélo dispo : 34
Activité suspecte depuis : -", + "Gare Pessac Alouette
station N° : 80
Nombre de vélo dispo : 26
Activité suspecte depuis : -", + "France Alouette
station N° : 165
Nombre de vélo dispo : 6
Activité suspecte depuis : -", + "Hôtel de ville Mérignac
station N° : 156
Nombre de vélo dispo : 32
Activité suspecte depuis : -", + "Les Pins
station N° : 157
Nombre de vélo dispo : 5
Activité suspecte depuis : -", + "Kennedy Parc Hôtelier
station N° : 87
Nombre de vélo dispo : 18
Activité suspecte depuis : -", + "Eysines Centre (retirée le 23/03/2017 en raison des travaux tram D)
station N° : 93
Nombre de vélo dispo : 18
Activité suspecte depuis : -", + "Gare de Blanquefort
station N° : 94
Nombre de vélo dispo : 2
Activité suspecte depuis : -", + "Lauriers
station N° : 149
Nombre de vélo dispo : 28
Activité suspecte depuis : -", + "Châtaigneraie
station N° : 82
Nombre de vélo dispo : 35
Activité suspecte depuis : -", + "Capeyron
station N° : 88
Nombre de vélo dispo : 25
Activité suspecte depuis : -", + "Hôpital Haut Lévêque
station N° : 164
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "Pont de la Maye (retirée le 19 novembre 2015 en raison des travaux d'extension du tram C)
station N° : 76
Nombre de vélo dispo : 21
Activité suspecte depuis : -", + "Place Bernard Roumegoux
station N° : 77
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Le Haillan Rostand
station N° : 158
Nombre de vélo dispo : 35
Activité suspecte depuis : -", + "Berges de la Garonne
station N° : 148
Nombre de vélo dispo : 2
Activité suspecte depuis : -", + "Pessac Bersol
station N° : 79
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "Bruges Hôtel de Ville
station N° : 95
Nombre de vélo dispo : 2
Activité suspecte depuis : -", + "Dravemont
station N° : 151
Nombre de vélo dispo : 35
Activité suspecte depuis : -", + "Merignac Soleil
station N° : 86
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Parc Sourreil
station N° : 153
Nombre de vélo dispo : 12
Activité suspecte depuis : -", + "Camping International
station N° : 159
Nombre de vélo dispo : 5
Activité suspecte depuis : -", + "Quatre Chemins
station N° : 85
Nombre de vélo dispo : 15
Activité suspecte depuis : -", + "Gare de Bègles
station N° : 162
Nombre de vélo dispo : 27
Activité suspecte depuis : -", + "Bruges La Vache
station N° : 169
Nombre de vélo dispo : 0
Activité suspecte depuis : -", + "Bougnard
station N° : 78
Nombre de vélo dispo : 37
Activité suspecte depuis : -", + "Parc des Expositions
station N° : 147
Nombre de vélo dispo : 33
Activité suspecte depuis : -", + "Claveau
station N° : 97
Nombre de vélo dispo : 1
Activité suspecte depuis : -", + "Le Burck
station N° : 84
Nombre de vélo dispo : 1
Activité suspecte depuis : -", + "Lycée Václav Havel
station N° : 163
Nombre de vélo dispo : 28
Activité suspecte depuis : -", + "François Mitterrand
station N° : 63
Nombre de vélo dispo : 34
Activité suspecte depuis : -", + "Palais des Congrès
station N° : 146
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "Centre commercial du Lac
station N° : 166
Nombre de vélo dispo : 39
Activité suspecte depuis : -", + "Mérignac Centre
station N° : 89
Nombre de vélo dispo : 22
Activité suspecte depuis : -", + "Hôpital Robert Picqué
station N° : 152
Nombre de vélo dispo : 38
Activité suspecte depuis : -", + "Pins Francs
station N° : 143
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "CREPS
station N° : 115
Nombre de vélo dispo : 36
Activité suspecte depuis : -", + "Bourranville
station N° : 142
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "La Benauge
station N° : 64
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "Place du 14 juillet
station N° : 74
Nombre de vélo dispo : 5
Activité suspecte depuis : -", + "Jean Moulin
station N° : 144
Nombre de vélo dispo : 6
Activité suspecte depuis : -", + "Place Ampère
station N° : 51
Nombre de vélo dispo : 32
Activité suspecte depuis : -", + "Compostelle
station N° : 114
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "Berges du Lac
station N° : 145
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Pessac Centre
station N° : 83
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "Ecole de Management
station N° : 113
Nombre de vélo dispo : 8
Activité suspecte depuis : -", + "Place Charles Gruet (indisponible depuis le 8 mars 2017 pour une durée indéterminée)
station N° : 38
Nombre de vélo dispo : 3
Activité suspecte depuis : -", + "Buttinière
station N° : 70
Nombre de vélo dispo : 27
Activité suspecte depuis : -", + "Bègles Poste
station N° : 75
Nombre de vélo dispo : 38
Activité suspecte depuis : -", + "Parc Bordelais
station N° : 32
Nombre de vélo dispo : 34
Activité suspecte depuis : -", + "Grand Lebrun
station N° : 12
Nombre de vélo dispo : 37
Activité suspecte depuis : -", + "Fontaine d'Arlac
station N° : 90
Nombre de vélo dispo : 36
Activité suspecte depuis : -", + "Mandron Godard
station N° : 50
Nombre de vélo dispo : 25
Activité suspecte depuis : -", + "Le Bouscat Mairie
station N° : 49
Nombre de vélo dispo : 14
Activité suspecte depuis : -", + "Village 6 IUT
station N° : 155
Nombre de vélo dispo : 27
Activité suspecte depuis : -", + "Barrière de Bègles
station N° : 129
Nombre de vélo dispo : 25
Activité suspecte depuis : -", + "Place de l'Europe
station N° : 52
Nombre de vélo dispo : 4
Activité suspecte depuis : -", + "Xaintrailles
station N° : 26
Nombre de vélo dispo : 1
Activité suspecte depuis : -", + "Caudéran
station N° : 31
Nombre de vélo dispo : 33
Activité suspecte depuis : -", + "St Augustin
station N° : 29
Nombre de vélo dispo : 14
Activité suspecte depuis : -", + "Parc Rivière
station N° : 53
Nombre de vélo dispo : 32
Activité suspecte depuis : -", + "Place Mondésir
station N° : 30
Nombre de vélo dispo : 7
Activité suspecte depuis : -", + "Thouars
station N° : 154
Nombre de vélo dispo : 3
Activité suspecte depuis : -", + "Place Marie Brizard (supprimée le 11 mars 2016 en raison des travaux tram D)
station N° : 35
Nombre de vélo dispo : 25
Activité suspecte depuis : -", + "Quai de Paludate
station N° : 126
Nombre de vélo dispo : 0
Activité suspecte depuis : -", + "François de Sourdis
station N° : 25
Nombre de vélo dispo : 4
Activité suspecte depuis : -", + "Doyen Brus
station N° : 117
Nombre de vélo dispo : 2
Activité suspecte depuis : -", + "St Louis Médoc
station N° : 122
Nombre de vélo dispo : 11
Activité suspecte depuis : -", + "Place André Meunier (fermée le 16/11/2016. Réouverture prévue en mai 2018)
station N° : 137
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "Les Aubiers
station N° : 96
Nombre de vélo dispo : 18
Activité suspecte depuis : -", + "Terres Neuves
station N° : 73
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "La Médoquine
station N° : 141
Nombre de vélo dispo : 27
Activité suspecte depuis : -", + "Bordeaux II
station N° : 27
Nombre de vélo dispo : 20
Activité suspecte depuis : -", + "Cours Le Rouzic
station N° : 69
Nombre de vélo dispo : 3
Activité suspecte depuis : -", + "Dubreuil Turenne
station N° : 14
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Magendie
station N° : 47
Nombre de vélo dispo : 18
Activité suspecte depuis : -", + "Barriere St Medard
station N° : 13
Nombre de vélo dispo : 23
Activité suspecte depuis : -", + "Belcier
station N° : 46
Nombre de vélo dispo : 9
Activité suspecte depuis : -", + "Montaigne Montesquieu
station N° : 116
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "Barrière de Pessac
station N° : 48
Nombre de vélo dispo : 25
Activité suspecte depuis : -", + "Allée de Serr Abadie
station N° : 67
Nombre de vélo dispo : 35
Activité suspecte depuis : -", + "Place St Martial
station N° : 121
Nombre de vélo dispo : 31
Activité suspecte depuis : -", + "Rue Achard
station N° : 173
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "Palais Gallien
station N° : 17
Nombre de vélo dispo : 32
Activité suspecte depuis : -", + "Charles Perrens
station N° : 140
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "St Nicolas
station N° : 107
Nombre de vélo dispo : 21
Activité suspecte depuis : -", + "Place Amédée Larrieu
station N° : 171
Nombre de vélo dispo : 13
Activité suspecte depuis : -", + "Barrière du Médoc
station N° : 33
Nombre de vélo dispo : 29
Activité suspecte depuis : -", + "Parc aux Angeliques
station N° : 61
Nombre de vélo dispo : 12
Activité suspecte depuis : -", + "Tivoli
station N° : 34
Nombre de vélo dispo : 36
Activité suspecte depuis : -", + "Lucien Faure
station N° : 170
Nombre de vélo dispo : 14
Activité suspecte depuis : -", + "Cours de la Somme
station N° : 132
Nombre de vélo dispo : 0
Activité suspecte depuis : -", + "Sacré Coeur
station N° : 128
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "Grand Parc
station N° : 119
Nombre de vélo dispo : 7
Activité suspecte depuis : -", + "Rue de la Croix Blanche
station N° : 15
Nombre de vélo dispo : 32
Activité suspecte depuis : -", + "Huguerie
station N° : 18
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Parc des Sports
station N° : 124
Nombre de vélo dispo : 7
Activité suspecte depuis : -", + "Le Bouscat Ravezies
station N° : 118
Nombre de vélo dispo : 32
Activité suspecte depuis : -", + "Peixotto
station N° : 111
Nombre de vélo dispo : 28
Activité suspecte depuis : -", + "Stade Chaban Delmas
station N° : 10
Nombre de vélo dispo : 23
Activité suspecte depuis : -", + "Cenon Gare
station N° : 62
Nombre de vélo dispo : 10
Activité suspecte depuis : -", + "Gare d'Orléans
station N° : 66
Nombre de vélo dispo : 21
Activité suspecte depuis : -", + "Rue du Mirail
station N° : 105
Nombre de vélo dispo : 36
Activité suspecte depuis : -", + "Barrière de Toulouse
station N° : 130
Nombre de vélo dispo : 4
Activité suspecte depuis : -", + "Arts et Métiers
station N° : 112
Nombre de vélo dispo : 14
Activité suspecte depuis : -", + "St Bruno
station N° : 2
Nombre de vélo dispo : 36
Activité suspecte depuis : -", + "Thiers Jardin Botanique
station N° : 68
Nombre de vélo dispo : 17
Activité suspecte depuis : -", + "République
station N° : 23
Nombre de vélo dispo : 10
Activité suspecte depuis : -", + "Cité Administrative
station N° : 11
Nombre de vélo dispo : 1
Activité suspecte depuis : -", + "Allées de Chartres
station N° : 60
Nombre de vélo dispo : 27
Activité suspecte depuis : -", + "Saint Louis Haussmann
station N° : 120
Nombre de vélo dispo : 37
Activité suspecte depuis : -", + "Gaviniès
station N° : 9
Nombre de vélo dispo : 9
Activité suspecte depuis : -", + "Place Tartas
station N° : 3
Nombre de vélo dispo : 37
Activité suspecte depuis : -", + "Place Ste Eulalie
station N° : 45
Nombre de vélo dispo : 6
Activité suspecte depuis : -", + "Eglise Ste Croix
station N° : 136
Nombre de vélo dispo : 39
Activité suspecte depuis : -", + "Libération
station N° : 24
Nombre de vélo dispo : 28
Activité suspecte depuis : -", + "Puy Paulin
station N° : 21
Nombre de vélo dispo : 33
Activité suspecte depuis : -", + "Bergonié
station N° : 108
Nombre de vélo dispo : 18
Activité suspecte depuis : -", + "Galin
station N° : 16
Nombre de vélo dispo : 21
Activité suspecte depuis : -", + "Nansouty
station N° : 131
Nombre de vélo dispo : 18
Activité suspecte depuis : -", + "Place Longchamps
station N° : 36
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "Grands Hommes
station N° : 20
Nombre de vélo dispo : 25
Activité suspecte depuis : -", + "Forum
station N° : 110
Nombre de vélo dispo : 37
Activité suspecte depuis : -", + "Lycée Brémontier
station N° : 139
Nombre de vélo dispo : 29
Activité suspecte depuis : -", + "Camille Jullian
station N° : 42
Nombre de vélo dispo : 6
Activité suspecte depuis : -", + "Conservatoire
station N° : 125
Nombre de vélo dispo : 7
Activité suspecte depuis : -", + "Place Tourny
station N° : 19
Nombre de vélo dispo : 35
Activité suspecte depuis : -", + "Place St Michel
station N° : 135
Nombre de vélo dispo : 2
Activité suspecte depuis : -", + "Place St Projet
station N° : 41
Nombre de vélo dispo : 4
Activité suspecte depuis : -", + "Hôpital Pellegrin
station N° : 28
Nombre de vélo dispo : 32
Activité suspecte depuis : -", + "Palais de Justice
station N° : 7
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Barrière St Genès
station N° : 109
Nombre de vélo dispo : 0
Activité suspecte depuis : -", + "St Seurin
station N° : 4
Nombre de vélo dispo : 25
Activité suspecte depuis : -", + "Eglise St Louis
station N° : 57
Nombre de vélo dispo : 12
Activité suspecte depuis : -", + "Camille Godard
station N° : 55
Nombre de vélo dispo : 0
Activité suspecte depuis : -", + "Jardin Public
station N° : 37
Nombre de vélo dispo : 4
Activité suspecte depuis : -", + "Patinoire
station N° : 8
Nombre de vélo dispo : 31
Activité suspecte depuis : -", + "Chartrons
station N° : 58
Nombre de vélo dispo : 38
Activité suspecte depuis : -", + "Les Hangars
station N° : 99
Nombre de vélo dispo : 5
Activité suspecte depuis : -", + "Place du Maucaillou
station N° : 134
Nombre de vélo dispo : 8
Activité suspecte depuis : -", + "Grosse Cloche (fermée depuis le 26/09/2016. Réouverture prévue septembre 2017)
station N° : 104
Nombre de vélo dispo : 38
Activité suspecte depuis : -", + "Grand Théâtre
station N° : 40
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "Bassins à flot
station N° : 98
Nombre de vélo dispo : 37
Activité suspecte depuis : -", + "La Cité du Vin
station N° : 172
Nombre de vélo dispo : 29
Activité suspecte depuis : -", + "Mériadeck
station N° : 1
Nombre de vélo dispo : 13
Activité suspecte depuis : -", + "Place Paul Doumer
station N° : 56
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "St Paul
station N° : 43
Nombre de vélo dispo : 13
Activité suspecte depuis : -", + "Musée d'Aquitaine
station N° : 44
Nombre de vélo dispo : 3
Activité suspecte depuis : -", + "Cours du Médoc
station N° : 100
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "Capucins
station N° : 133
Nombre de vélo dispo : 26
Activité suspecte depuis : -", + "Place du Palais
station N° : 103
Nombre de vélo dispo : 26
Activité suspecte depuis : -", + "Place Jean Jaurès
station N° : 101
Nombre de vélo dispo : 26
Activité suspecte depuis : -", + "Place de la Bourse
station N° : 102
Nombre de vélo dispo : 8
Activité suspecte depuis : -", + "Place Gambetta
station N° : 5
Nombre de vélo dispo : 13
Activité suspecte depuis : -", + "Stalingrad
station N° : 65
Nombre de vélo dispo : 28
Activité suspecte depuis : -", + "Darwin
station N° : 174
Nombre de vélo dispo : 9
Activité suspecte depuis : -", + "Porte de Bourgogne
station N° : 123
Nombre de vélo dispo : 1
Activité suspecte depuis : -", + "Rue St Vincent de Paul
station N° : 54
Nombre de vélo dispo : 7
Activité suspecte depuis : -", + "Quinconces
station N° : 39
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "Hôtel de Ville
station N° : 22
Nombre de vélo dispo : 35
Activité suspecte depuis : -", + "Gare St Jean
station N° : 127
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "Place de la Victoire
station N° : 106
Nombre de vélo dispo : 6
Activité suspecte depuis : -" + ], + "lat": [ + 44.911972, + 44.9047355, + 44.8953026, + 44.8843052, + 44.909013, + 44.7958766, + 44.8492876, + 44.8541785, + 44.8874989, + 44.8736914, + 44.7930876, + 44.7984052, + 44.8442398, + 44.8565934, + 44.8362805, + 44.883958, + 44.9173004, + 44.8788377, + 44.7929626, + 44.8509659, + 44.7874757, + 44.7821503, + 44.7735264, + 44.8585929, + 44.8858939, + 44.7862005, + 44.8814488, + 44.845589, + 44.8318945, + 44.792322, + 44.8978469, + 44.8324153, + 44.7981103, + 44.8723721, + 44.7938887, + 44.892871, + 44.8773814, + 44.8153456, + 44.7871445, + 44.830278, + 44.8889178, + 44.8818036, + 44.8416131, + 44.7998729, + 44.8580632, + 44.8013759, + 44.8394322, + 44.8395959, + 44.8077045, + 44.8784824, + 44.8625593, + 44.793132, + 44.8790453, + 44.8044589, + 44.7968805, + 44.8464146, + 44.8642758, + 44.8077684, + 44.8526095, + 44.8511475, + 44.8265045, + 44.8599885, + 44.8632874, + 44.7915011, + 44.8130803, + 44.8588988, + 44.8279737, + 44.8517457, + 44.8325053, + 44.854169, + 44.8383834, + 44.7920334, + 44.8500962, + 44.8267007, + 44.8310036, + 44.8003845, + 44.8584878, + 44.8282573, + 44.8738859, + 44.8150262, + 44.8188706, + 44.8265358, + 44.8429974, + 44.8481944, + 44.8278935, + 44.848398, + 44.8227929, + 44.7966723, + 44.825783, + 44.8437743, + 44.8589077, + 44.8675164, + 44.8468975, + 44.8230651, + 44.8275103, + 44.8299181, + 44.8532619, + 44.8462539, + 44.8538162, + 44.8658199, + 44.8262833, + 44.822181, + 44.8626016, + 44.8452123, + 44.8441478, + 44.8338711, + 44.8669415, + 44.8068109, + 44.8317573, + 44.8561372, + 44.8411383, + 44.8326183, + 44.814502, + 44.8059145, + 44.8378395, + 44.842977, + 44.8348282, + 44.8416628, + 44.8471835, + 44.862612, + 44.8330332, + 44.8408779, + 44.8331199, + 44.8313122, + 44.8332348, + 44.8412219, + 44.8247146, + 44.8494652, + 44.820317, + 44.8500457, + 44.8431439, + 44.8123769, + 44.8240548, + 44.8392607, + 44.8318262, + 44.8446454, + 44.8347829, + 44.8388687, + 44.8298603, + 44.8359397, + 44.8220935, + 44.8422055, + 44.8515504, + 44.8546178, + 44.8484148, + 44.8343893, + 44.853209, + 44.8578681, + 44.8326329, + 44.8351755, + 44.8429267, + 44.8600704, + 44.8618162, + 44.8380293, + 44.8517074, + 44.8371083, + 44.8360588, + 44.855602, + 44.8299539, + 44.8377883, + 44.8429496, + 44.8403032, + 44.8414957, + 44.8403384, + 44.8490836, + 44.8377885, + 44.8264212, + 44.8442269, + 44.8382617, + 44.826297, + 44.8306361 + ], + "lon": [ + -0.7246501, + -0.6689618, + -0.7146676, + -0.6909947, + -0.6306502, + -0.6673258, + -0.4966899, + -0.5128187, + -0.5176289, + -0.6775347, + -0.6576449, + -0.6629757, + -0.6588671, + -0.6597112, + -0.6871282, + -0.6499211, + -0.623816, + -0.5178249, + -0.6463612, + -0.6447535, + -0.655176, + -0.5661566, + -0.6143178, + -0.6685358, + -0.5414654, + -0.6387356, + -0.6133743, + -0.5105045, + -0.6547759, + -0.5817438, + -0.5825468, + -0.6459366, + -0.5515963, + -0.5906954, + -0.6350506, + -0.5662214, + -0.5443327, + -0.6344371, + -0.5661623, + -0.5269656, + -0.5677901, + -0.5652057, + -0.6465204, + -0.5700493, + -0.6233263, + -0.5971532, + -0.6292522, + -0.5564476, + -0.5482081, + -0.5851242, + -0.5832471, + -0.6054744, + -0.5706139, + -0.6326682, + -0.6018689, + -0.5801979, + -0.5242001, + -0.5600546, + -0.5992294, + -0.6086092, + -0.6257739, + -0.5887606, + -0.5999496, + -0.6131256, + -0.5641958, + -0.5810805, + -0.5934903, + -0.6143832, + -0.6104667, + -0.5865861, + -0.6168934, + -0.5915297, + -0.5855819, + -0.54983, + -0.5873421, + -0.6098564, + -0.5696593, + -0.5623689, + -0.5740119, + -0.5509087, + -0.5999382, + -0.6018422, + -0.5503284, + -0.5919697, + -0.5860458, + -0.5982369, + -0.5529707, + -0.6170405, + -0.5897602, + -0.5575143, + -0.5658427, + -0.5480908, + -0.5821903, + -0.6006856, + -0.5758908, + -0.5814479, + -0.5917218, + -0.5649509, + -0.588682, + -0.5612341, + -0.5724844, + -0.5630395, + -0.5757641, + -0.5920629, + -0.5816331, + -0.5627102, + -0.5760778, + -0.5924539, + -0.5986834, + -0.5336374, + -0.5622355, + -0.5709743, + -0.5706739, + -0.6023231, + -0.5902795, + -0.5557321, + -0.5801851, + -0.5996952, + -0.5713111, + -0.567184, + -0.5928927, + -0.5910414, + -0.5769525, + -0.5613928, + -0.582833, + -0.5756676, + -0.5781469, + -0.5452532, + -0.5718546, + -0.5820039, + -0.5772404, + -0.5910309, + -0.5702434, + -0.5720342, + -0.5596604, + -0.5774479, + -0.5646641, + -0.574807, + -0.6035099, + -0.5821149, + -0.5817819, + -0.5848222, + -0.571631, + -0.5743468, + -0.5757416, + -0.5881235, + -0.5672651, + -0.5580802, + -0.5671119, + -0.5720497, + -0.5738986, + -0.5544678, + -0.5514922, + -0.584365, + -0.5742719, + -0.5727796, + -0.5754273, + -0.5631938, + -0.5681171, + -0.5703384, + -0.5703728, + -0.5691361, + -0.5808037, + -0.5595538, + -0.5625376, + -0.5671556, + -0.5573234, + -0.5743445, + -0.5764818, + -0.5570718, + -0.5732131 + ], + "marker": { + "color": "#6DDE75", + "size": 9 + }, + "mode": "markers", + "name": "normal", + "type": "scattermapbox" + } + ], + "layout": { + "legend": { + "orientation": "h", + "x": 0.5, + "xanchor": "center", + "y": 1.1, + "yanchor": "top" + }, + "mapbox": { + "accesstoken": "pk.eyJ1IjoiYmFib3UiLCJhIjoiY2swZ3J5cndxMDl1ajNkbnFtOXh5NHRxOCJ9.UxT93M7i57pYMH3hhzXbgQ", + "center": { + "lat": 44.837794, + "lon": -0.581662 + }, + "style": "light", + "zoom": 11 + }, + "showlegend": true, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + } + } + }, + "text/html": [ + "
\n", + " \n", + " \n", + "
\n", + " \n", + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_map_station_with_plotly(station_control=station_control, offline_plot=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T14:13:24.057944Z", + "start_time": "2021-04-08T14:13:23.996013Z" + } + }, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "linkText": "Export to plot.ly", + "plotlyServerURL": "https://plot.ly", + "showLink": false + }, + "data": [ + { + "hoverinfo": "text", + "hovertext": [ + "Square André Lhote
station N° : 6
Nombre de vélo dispo : 25
Activité suspecte depuis : 2021-04-07 09:00", + "CAPC
station N° : 59
Nombre de vélo dispo : 32
Activité suspecte depuis : 2021-04-07 10:10" + ], + "lat": [ + 44.8377941, + 44.8497825 + ], + "lon": [ + -0.5816623, + -0.5702437 + ], + "marker": { + "color": "#EB4D50", + "size": 9 + }, + "mode": "markers", + "name": "anomaly", + "type": "scattermapbox" + }, + { + "hoverinfo": "text", + "hovertext": [ + "Barbey
station N° : 138
Nombre de vélo dispo : 5
Activité suspecte depuis : -" + ], + "lat": [ + 44.8265598 + ], + "lon": [ + -0.5645539 + ], + "marker": { + "color": "#5E9BE6", + "size": 9 + }, + "mode": "markers", + "name": "inactive", + "type": "scattermapbox" + }, + { + "hoverinfo": "text", + "hovertext": [ + "Eglise St Aubin
station N° : 160
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Le Taillan Mairie
station N° : 161
Nombre de vélo dispo : 27
Activité suspecte depuis : -", + "St Médard République
station N° : 92
Nombre de vélo dispo : 23
Activité suspecte depuis : -", + "Centre commercial St Médard
station N° : 167
Nombre de vélo dispo : 7
Activité suspecte depuis : -", + "Mairie de Blanquefort
station N° : 168
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "Morin Cazalet
station N° : 81
Nombre de vélo dispo : 1
Activité suspecte depuis : -", + "Artigues Feydeau
station N° : 150
Nombre de vélo dispo : 13
Activité suspecte depuis : -", + "Jean Zay
station N° : 72
Nombre de vélo dispo : 5
Activité suspecte depuis : -", + "La Gardette
station N° : 71
Nombre de vélo dispo : 15
Activité suspecte depuis : -", + "Mairie du Haillan
station N° : 91
Nombre de vélo dispo : 34
Activité suspecte depuis : -", + "Gare Pessac Alouette
station N° : 80
Nombre de vélo dispo : 26
Activité suspecte depuis : -", + "France Alouette
station N° : 165
Nombre de vélo dispo : 6
Activité suspecte depuis : -", + "Hôtel de ville Mérignac
station N° : 156
Nombre de vélo dispo : 32
Activité suspecte depuis : -", + "Les Pins
station N° : 157
Nombre de vélo dispo : 5
Activité suspecte depuis : -", + "Kennedy Parc Hôtelier
station N° : 87
Nombre de vélo dispo : 18
Activité suspecte depuis : -", + "Eysines Centre (retirée le 23/03/2017 en raison des travaux tram D)
station N° : 93
Nombre de vélo dispo : 18
Activité suspecte depuis : -", + "Gare de Blanquefort
station N° : 94
Nombre de vélo dispo : 2
Activité suspecte depuis : -", + "Lauriers
station N° : 149
Nombre de vélo dispo : 28
Activité suspecte depuis : -", + "Châtaigneraie
station N° : 82
Nombre de vélo dispo : 35
Activité suspecte depuis : -", + "Capeyron
station N° : 88
Nombre de vélo dispo : 25
Activité suspecte depuis : -", + "Hôpital Haut Lévêque
station N° : 164
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "Pont de la Maye (retirée le 19 novembre 2015 en raison des travaux d'extension du tram C)
station N° : 76
Nombre de vélo dispo : 21
Activité suspecte depuis : -", + "Place Bernard Roumegoux
station N° : 77
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Le Haillan Rostand
station N° : 158
Nombre de vélo dispo : 35
Activité suspecte depuis : -", + "Berges de la Garonne
station N° : 148
Nombre de vélo dispo : 2
Activité suspecte depuis : -", + "Pessac Bersol
station N° : 79
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "Bruges Hôtel de Ville
station N° : 95
Nombre de vélo dispo : 2
Activité suspecte depuis : -", + "Dravemont
station N° : 151
Nombre de vélo dispo : 35
Activité suspecte depuis : -", + "Merignac Soleil
station N° : 86
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Parc Sourreil
station N° : 153
Nombre de vélo dispo : 12
Activité suspecte depuis : -", + "Camping International
station N° : 159
Nombre de vélo dispo : 5
Activité suspecte depuis : -", + "Quatre Chemins
station N° : 85
Nombre de vélo dispo : 15
Activité suspecte depuis : -", + "Gare de Bègles
station N° : 162
Nombre de vélo dispo : 27
Activité suspecte depuis : -", + "Bruges La Vache
station N° : 169
Nombre de vélo dispo : 0
Activité suspecte depuis : -", + "Bougnard
station N° : 78
Nombre de vélo dispo : 37
Activité suspecte depuis : -", + "Parc des Expositions
station N° : 147
Nombre de vélo dispo : 33
Activité suspecte depuis : -", + "Claveau
station N° : 97
Nombre de vélo dispo : 1
Activité suspecte depuis : -", + "Le Burck
station N° : 84
Nombre de vélo dispo : 1
Activité suspecte depuis : -", + "Lycée Václav Havel
station N° : 163
Nombre de vélo dispo : 28
Activité suspecte depuis : -", + "François Mitterrand
station N° : 63
Nombre de vélo dispo : 34
Activité suspecte depuis : -", + "Palais des Congrès
station N° : 146
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "Centre commercial du Lac
station N° : 166
Nombre de vélo dispo : 39
Activité suspecte depuis : -", + "Mérignac Centre
station N° : 89
Nombre de vélo dispo : 22
Activité suspecte depuis : -", + "Hôpital Robert Picqué
station N° : 152
Nombre de vélo dispo : 38
Activité suspecte depuis : -", + "Pins Francs
station N° : 143
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "CREPS
station N° : 115
Nombre de vélo dispo : 36
Activité suspecte depuis : -", + "Bourranville
station N° : 142
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "La Benauge
station N° : 64
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "Place du 14 juillet
station N° : 74
Nombre de vélo dispo : 5
Activité suspecte depuis : -", + "Jean Moulin
station N° : 144
Nombre de vélo dispo : 6
Activité suspecte depuis : -", + "Place Ampère
station N° : 51
Nombre de vélo dispo : 32
Activité suspecte depuis : -", + "Compostelle
station N° : 114
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "Berges du Lac
station N° : 145
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Pessac Centre
station N° : 83
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "Ecole de Management
station N° : 113
Nombre de vélo dispo : 8
Activité suspecte depuis : -", + "Place Charles Gruet (indisponible depuis le 8 mars 2017 pour une durée indéterminée)
station N° : 38
Nombre de vélo dispo : 3
Activité suspecte depuis : -", + "Buttinière
station N° : 70
Nombre de vélo dispo : 27
Activité suspecte depuis : -", + "Bègles Poste
station N° : 75
Nombre de vélo dispo : 38
Activité suspecte depuis : -", + "Parc Bordelais
station N° : 32
Nombre de vélo dispo : 34
Activité suspecte depuis : -", + "Grand Lebrun
station N° : 12
Nombre de vélo dispo : 37
Activité suspecte depuis : -", + "Fontaine d'Arlac
station N° : 90
Nombre de vélo dispo : 36
Activité suspecte depuis : -", + "Mandron Godard
station N° : 50
Nombre de vélo dispo : 25
Activité suspecte depuis : -", + "Le Bouscat Mairie
station N° : 49
Nombre de vélo dispo : 14
Activité suspecte depuis : -", + "Village 6 IUT
station N° : 155
Nombre de vélo dispo : 27
Activité suspecte depuis : -", + "Barrière de Bègles
station N° : 129
Nombre de vélo dispo : 25
Activité suspecte depuis : -", + "Place de l'Europe
station N° : 52
Nombre de vélo dispo : 4
Activité suspecte depuis : -", + "Xaintrailles
station N° : 26
Nombre de vélo dispo : 1
Activité suspecte depuis : -", + "Caudéran
station N° : 31
Nombre de vélo dispo : 33
Activité suspecte depuis : -", + "St Augustin
station N° : 29
Nombre de vélo dispo : 14
Activité suspecte depuis : -", + "Parc Rivière
station N° : 53
Nombre de vélo dispo : 32
Activité suspecte depuis : -", + "Place Mondésir
station N° : 30
Nombre de vélo dispo : 7
Activité suspecte depuis : -", + "Thouars
station N° : 154
Nombre de vélo dispo : 3
Activité suspecte depuis : -", + "Place Marie Brizard (supprimée le 11 mars 2016 en raison des travaux tram D)
station N° : 35
Nombre de vélo dispo : 25
Activité suspecte depuis : -", + "Quai de Paludate
station N° : 126
Nombre de vélo dispo : 0
Activité suspecte depuis : -", + "François de Sourdis
station N° : 25
Nombre de vélo dispo : 4
Activité suspecte depuis : -", + "Doyen Brus
station N° : 117
Nombre de vélo dispo : 2
Activité suspecte depuis : -", + "St Louis Médoc
station N° : 122
Nombre de vélo dispo : 11
Activité suspecte depuis : -", + "Place André Meunier (fermée le 16/11/2016. Réouverture prévue en mai 2018)
station N° : 137
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "Les Aubiers
station N° : 96
Nombre de vélo dispo : 18
Activité suspecte depuis : -", + "Terres Neuves
station N° : 73
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "La Médoquine
station N° : 141
Nombre de vélo dispo : 27
Activité suspecte depuis : -", + "Bordeaux II
station N° : 27
Nombre de vélo dispo : 20
Activité suspecte depuis : -", + "Cours Le Rouzic
station N° : 69
Nombre de vélo dispo : 3
Activité suspecte depuis : -", + "Dubreuil Turenne
station N° : 14
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Magendie
station N° : 47
Nombre de vélo dispo : 18
Activité suspecte depuis : -", + "Barriere St Medard
station N° : 13
Nombre de vélo dispo : 23
Activité suspecte depuis : -", + "Belcier
station N° : 46
Nombre de vélo dispo : 9
Activité suspecte depuis : -", + "Montaigne Montesquieu
station N° : 116
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "Barrière de Pessac
station N° : 48
Nombre de vélo dispo : 25
Activité suspecte depuis : -", + "Allée de Serr Abadie
station N° : 67
Nombre de vélo dispo : 35
Activité suspecte depuis : -", + "Place St Martial
station N° : 121
Nombre de vélo dispo : 31
Activité suspecte depuis : -", + "Rue Achard
station N° : 173
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "Palais Gallien
station N° : 17
Nombre de vélo dispo : 32
Activité suspecte depuis : -", + "Charles Perrens
station N° : 140
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "St Nicolas
station N° : 107
Nombre de vélo dispo : 21
Activité suspecte depuis : -", + "Place Amédée Larrieu
station N° : 171
Nombre de vélo dispo : 13
Activité suspecte depuis : -", + "Barrière du Médoc
station N° : 33
Nombre de vélo dispo : 29
Activité suspecte depuis : -", + "Parc aux Angeliques
station N° : 61
Nombre de vélo dispo : 12
Activité suspecte depuis : -", + "Tivoli
station N° : 34
Nombre de vélo dispo : 36
Activité suspecte depuis : -", + "Lucien Faure
station N° : 170
Nombre de vélo dispo : 14
Activité suspecte depuis : -", + "Cours de la Somme
station N° : 132
Nombre de vélo dispo : 0
Activité suspecte depuis : -", + "Sacré Coeur
station N° : 128
Nombre de vélo dispo : 19
Activité suspecte depuis : -", + "Grand Parc
station N° : 119
Nombre de vélo dispo : 7
Activité suspecte depuis : -", + "Rue de la Croix Blanche
station N° : 15
Nombre de vélo dispo : 32
Activité suspecte depuis : -", + "Huguerie
station N° : 18
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Parc des Sports
station N° : 124
Nombre de vélo dispo : 7
Activité suspecte depuis : -", + "Le Bouscat Ravezies
station N° : 118
Nombre de vélo dispo : 32
Activité suspecte depuis : -", + "Peixotto
station N° : 111
Nombre de vélo dispo : 28
Activité suspecte depuis : -", + "Stade Chaban Delmas
station N° : 10
Nombre de vélo dispo : 23
Activité suspecte depuis : -", + "Cenon Gare
station N° : 62
Nombre de vélo dispo : 10
Activité suspecte depuis : -", + "Gare d'Orléans
station N° : 66
Nombre de vélo dispo : 21
Activité suspecte depuis : -", + "Rue du Mirail
station N° : 105
Nombre de vélo dispo : 36
Activité suspecte depuis : -", + "Barrière de Toulouse
station N° : 130
Nombre de vélo dispo : 4
Activité suspecte depuis : -", + "Arts et Métiers
station N° : 112
Nombre de vélo dispo : 14
Activité suspecte depuis : -", + "St Bruno
station N° : 2
Nombre de vélo dispo : 36
Activité suspecte depuis : -", + "Thiers Jardin Botanique
station N° : 68
Nombre de vélo dispo : 17
Activité suspecte depuis : -", + "République
station N° : 23
Nombre de vélo dispo : 10
Activité suspecte depuis : -", + "Cité Administrative
station N° : 11
Nombre de vélo dispo : 1
Activité suspecte depuis : -", + "Allées de Chartres
station N° : 60
Nombre de vélo dispo : 27
Activité suspecte depuis : -", + "Saint Louis Haussmann
station N° : 120
Nombre de vélo dispo : 37
Activité suspecte depuis : -", + "Gaviniès
station N° : 9
Nombre de vélo dispo : 9
Activité suspecte depuis : -", + "Place Tartas
station N° : 3
Nombre de vélo dispo : 37
Activité suspecte depuis : -", + "Place Ste Eulalie
station N° : 45
Nombre de vélo dispo : 6
Activité suspecte depuis : -", + "Eglise Ste Croix
station N° : 136
Nombre de vélo dispo : 39
Activité suspecte depuis : -", + "Libération
station N° : 24
Nombre de vélo dispo : 28
Activité suspecte depuis : -", + "Puy Paulin
station N° : 21
Nombre de vélo dispo : 33
Activité suspecte depuis : -", + "Bergonié
station N° : 108
Nombre de vélo dispo : 18
Activité suspecte depuis : -", + "Galin
station N° : 16
Nombre de vélo dispo : 21
Activité suspecte depuis : -", + "Nansouty
station N° : 131
Nombre de vélo dispo : 18
Activité suspecte depuis : -", + "Place Longchamps
station N° : 36
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "Grands Hommes
station N° : 20
Nombre de vélo dispo : 25
Activité suspecte depuis : -", + "Forum
station N° : 110
Nombre de vélo dispo : 37
Activité suspecte depuis : -", + "Lycée Brémontier
station N° : 139
Nombre de vélo dispo : 29
Activité suspecte depuis : -", + "Camille Jullian
station N° : 42
Nombre de vélo dispo : 6
Activité suspecte depuis : -", + "Conservatoire
station N° : 125
Nombre de vélo dispo : 7
Activité suspecte depuis : -", + "Place Tourny
station N° : 19
Nombre de vélo dispo : 35
Activité suspecte depuis : -", + "Place St Michel
station N° : 135
Nombre de vélo dispo : 2
Activité suspecte depuis : -", + "Place St Projet
station N° : 41
Nombre de vélo dispo : 4
Activité suspecte depuis : -", + "Hôpital Pellegrin
station N° : 28
Nombre de vélo dispo : 32
Activité suspecte depuis : -", + "Palais de Justice
station N° : 7
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "Barrière St Genès
station N° : 109
Nombre de vélo dispo : 0
Activité suspecte depuis : -", + "St Seurin
station N° : 4
Nombre de vélo dispo : 25
Activité suspecte depuis : -", + "Eglise St Louis
station N° : 57
Nombre de vélo dispo : 12
Activité suspecte depuis : -", + "Camille Godard
station N° : 55
Nombre de vélo dispo : 0
Activité suspecte depuis : -", + "Jardin Public
station N° : 37
Nombre de vélo dispo : 4
Activité suspecte depuis : -", + "Patinoire
station N° : 8
Nombre de vélo dispo : 31
Activité suspecte depuis : -", + "Chartrons
station N° : 58
Nombre de vélo dispo : 38
Activité suspecte depuis : -", + "Les Hangars
station N° : 99
Nombre de vélo dispo : 5
Activité suspecte depuis : -", + "Place du Maucaillou
station N° : 134
Nombre de vélo dispo : 8
Activité suspecte depuis : -", + "Grosse Cloche (fermée depuis le 26/09/2016. Réouverture prévue septembre 2017)
station N° : 104
Nombre de vélo dispo : 38
Activité suspecte depuis : -", + "Grand Théâtre
station N° : 40
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "Bassins à flot
station N° : 98
Nombre de vélo dispo : 37
Activité suspecte depuis : -", + "La Cité du Vin
station N° : 172
Nombre de vélo dispo : 29
Activité suspecte depuis : -", + "Mériadeck
station N° : 1
Nombre de vélo dispo : 13
Activité suspecte depuis : -", + "Place Paul Doumer
station N° : 56
Nombre de vélo dispo : 30
Activité suspecte depuis : -", + "St Paul
station N° : 43
Nombre de vélo dispo : 13
Activité suspecte depuis : -", + "Musée d'Aquitaine
station N° : 44
Nombre de vélo dispo : 3
Activité suspecte depuis : -", + "Cours du Médoc
station N° : 100
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "Capucins
station N° : 133
Nombre de vélo dispo : 26
Activité suspecte depuis : -", + "Place du Palais
station N° : 103
Nombre de vélo dispo : 26
Activité suspecte depuis : -", + "Place Jean Jaurès
station N° : 101
Nombre de vélo dispo : 26
Activité suspecte depuis : -", + "Place de la Bourse
station N° : 102
Nombre de vélo dispo : 8
Activité suspecte depuis : -", + "Place Gambetta
station N° : 5
Nombre de vélo dispo : 13
Activité suspecte depuis : -", + "Stalingrad
station N° : 65
Nombre de vélo dispo : 28
Activité suspecte depuis : -", + "Darwin
station N° : 174
Nombre de vélo dispo : 9
Activité suspecte depuis : -", + "Porte de Bourgogne
station N° : 123
Nombre de vélo dispo : 1
Activité suspecte depuis : -", + "Rue St Vincent de Paul
station N° : 54
Nombre de vélo dispo : 7
Activité suspecte depuis : -", + "Quinconces
station N° : 39
Nombre de vélo dispo : 24
Activité suspecte depuis : -", + "Hôtel de Ville
station N° : 22
Nombre de vélo dispo : 35
Activité suspecte depuis : -", + "Gare St Jean
station N° : 127
Nombre de vélo dispo : 16
Activité suspecte depuis : -", + "Place de la Victoire
station N° : 106
Nombre de vélo dispo : 6
Activité suspecte depuis : -" + ], + "lat": [ + 44.911972, + 44.9047355, + 44.8953026, + 44.8843052, + 44.909013, + 44.7958766, + 44.8492876, + 44.8541785, + 44.8874989, + 44.8736914, + 44.7930876, + 44.7984052, + 44.8442398, + 44.8565934, + 44.8362805, + 44.883958, + 44.9173004, + 44.8788377, + 44.7929626, + 44.8509659, + 44.7874757, + 44.7821503, + 44.7735264, + 44.8585929, + 44.8858939, + 44.7862005, + 44.8814488, + 44.845589, + 44.8318945, + 44.792322, + 44.8978469, + 44.8324153, + 44.7981103, + 44.8723721, + 44.7938887, + 44.892871, + 44.8773814, + 44.8153456, + 44.7871445, + 44.830278, + 44.8889178, + 44.8818036, + 44.8416131, + 44.7998729, + 44.8580632, + 44.8013759, + 44.8394322, + 44.8395959, + 44.8077045, + 44.8784824, + 44.8625593, + 44.793132, + 44.8790453, + 44.8044589, + 44.7968805, + 44.8464146, + 44.8642758, + 44.8077684, + 44.8526095, + 44.8511475, + 44.8265045, + 44.8599885, + 44.8632874, + 44.7915011, + 44.8130803, + 44.8588988, + 44.8279737, + 44.8517457, + 44.8325053, + 44.854169, + 44.8383834, + 44.7920334, + 44.8500962, + 44.8267007, + 44.8310036, + 44.8003845, + 44.8584878, + 44.8282573, + 44.8738859, + 44.8150262, + 44.8188706, + 44.8265358, + 44.8429974, + 44.8481944, + 44.8278935, + 44.848398, + 44.8227929, + 44.7966723, + 44.825783, + 44.8437743, + 44.8589077, + 44.8675164, + 44.8468975, + 44.8230651, + 44.8275103, + 44.8299181, + 44.8532619, + 44.8462539, + 44.8538162, + 44.8658199, + 44.8262833, + 44.822181, + 44.8626016, + 44.8452123, + 44.8441478, + 44.8338711, + 44.8669415, + 44.8068109, + 44.8317573, + 44.8561372, + 44.8411383, + 44.8326183, + 44.814502, + 44.8059145, + 44.8378395, + 44.842977, + 44.8348282, + 44.8416628, + 44.8471835, + 44.862612, + 44.8330332, + 44.8408779, + 44.8331199, + 44.8313122, + 44.8332348, + 44.8412219, + 44.8247146, + 44.8494652, + 44.820317, + 44.8500457, + 44.8431439, + 44.8123769, + 44.8240548, + 44.8392607, + 44.8318262, + 44.8446454, + 44.8347829, + 44.8388687, + 44.8298603, + 44.8359397, + 44.8220935, + 44.8422055, + 44.8515504, + 44.8546178, + 44.8484148, + 44.8343893, + 44.853209, + 44.8578681, + 44.8326329, + 44.8351755, + 44.8429267, + 44.8600704, + 44.8618162, + 44.8380293, + 44.8517074, + 44.8371083, + 44.8360588, + 44.855602, + 44.8299539, + 44.8377883, + 44.8429496, + 44.8403032, + 44.8414957, + 44.8403384, + 44.8490836, + 44.8377885, + 44.8264212, + 44.8442269, + 44.8382617, + 44.826297, + 44.8306361 + ], + "lon": [ + -0.7246501, + -0.6689618, + -0.7146676, + -0.6909947, + -0.6306502, + -0.6673258, + -0.4966899, + -0.5128187, + -0.5176289, + -0.6775347, + -0.6576449, + -0.6629757, + -0.6588671, + -0.6597112, + -0.6871282, + -0.6499211, + -0.623816, + -0.5178249, + -0.6463612, + -0.6447535, + -0.655176, + -0.5661566, + -0.6143178, + -0.6685358, + -0.5414654, + -0.6387356, + -0.6133743, + -0.5105045, + -0.6547759, + -0.5817438, + -0.5825468, + -0.6459366, + -0.5515963, + -0.5906954, + -0.6350506, + -0.5662214, + -0.5443327, + -0.6344371, + -0.5661623, + -0.5269656, + -0.5677901, + -0.5652057, + -0.6465204, + -0.5700493, + -0.6233263, + -0.5971532, + -0.6292522, + -0.5564476, + -0.5482081, + -0.5851242, + -0.5832471, + -0.6054744, + -0.5706139, + -0.6326682, + -0.6018689, + -0.5801979, + -0.5242001, + -0.5600546, + -0.5992294, + -0.6086092, + -0.6257739, + -0.5887606, + -0.5999496, + -0.6131256, + -0.5641958, + -0.5810805, + -0.5934903, + -0.6143832, + -0.6104667, + -0.5865861, + -0.6168934, + -0.5915297, + -0.5855819, + -0.54983, + -0.5873421, + -0.6098564, + -0.5696593, + -0.5623689, + -0.5740119, + -0.5509087, + -0.5999382, + -0.6018422, + -0.5503284, + -0.5919697, + -0.5860458, + -0.5982369, + -0.5529707, + -0.6170405, + -0.5897602, + -0.5575143, + -0.5658427, + -0.5480908, + -0.5821903, + -0.6006856, + -0.5758908, + -0.5814479, + -0.5917218, + -0.5649509, + -0.588682, + -0.5612341, + -0.5724844, + -0.5630395, + -0.5757641, + -0.5920629, + -0.5816331, + -0.5627102, + -0.5760778, + -0.5924539, + -0.5986834, + -0.5336374, + -0.5622355, + -0.5709743, + -0.5706739, + -0.6023231, + -0.5902795, + -0.5557321, + -0.5801851, + -0.5996952, + -0.5713111, + -0.567184, + -0.5928927, + -0.5910414, + -0.5769525, + -0.5613928, + -0.582833, + -0.5756676, + -0.5781469, + -0.5452532, + -0.5718546, + -0.5820039, + -0.5772404, + -0.5910309, + -0.5702434, + -0.5720342, + -0.5596604, + -0.5774479, + -0.5646641, + -0.574807, + -0.6035099, + -0.5821149, + -0.5817819, + -0.5848222, + -0.571631, + -0.5743468, + -0.5757416, + -0.5881235, + -0.5672651, + -0.5580802, + -0.5671119, + -0.5720497, + -0.5738986, + -0.5544678, + -0.5514922, + -0.584365, + -0.5742719, + -0.5727796, + -0.5754273, + -0.5631938, + -0.5681171, + -0.5703384, + -0.5703728, + -0.5691361, + -0.5808037, + -0.5595538, + -0.5625376, + -0.5671556, + -0.5573234, + -0.5743445, + -0.5764818, + -0.5570718, + -0.5732131 + ], + "marker": { + "color": "#6DDE75", + "size": 9 + }, + "mode": "markers", + "name": "normal", + "type": "scattermapbox" + } + ], + "layout": { + "legend": { + "orientation": "h", + "x": 0.5, + "xanchor": "center", + "y": 1.1, + "yanchor": "top" + }, + "mapbox": { + "accesstoken": "pk.eyJ1IjoiYmFib3UiLCJhIjoiY2swZ3J5cndxMDl1ajNkbnFtOXh5NHRxOCJ9.UxT93M7i57pYMH3hhzXbgQ", + "center": { + "lat": 44.8377941, + "lon": -0.5816623 + }, + "style": "light", + "zoom": 15 + }, + "showlegend": true, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + } + } + }, + "text/html": [ + "
\n", + " \n", + " \n", + "
\n", + " \n", + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_map_station_with_plotly(station_control=station_control, offline_plot=False, station_id=6)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Avec Kepler" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T12:41:50.729723Z", + "start_time": "2021-04-08T12:41:50.708179Z" + } + }, + "outputs": [], + "source": [ + "from keplergl import KeplerGl" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T14:04:30.177573Z", + "start_time": "2021-04-08T14:04:30.138470Z" + } + }, + "outputs": [], + "source": [ + "def plot_map_station_with_kepler(station_control, station_id=None):\n", + " \"\"\"\n", + " Affiche une cartographie de l'agglomération de Bordeaux avec toutes les stations Vcub et leurs états\n", + " provenant des algorithmes (normal, inactive et anomaly).\n", + "\n", + " Si \"station_id\" est indiqué, alors la cartographie est focus sur la lat / lon de station (Numéro)\n", + "\n", + " Export la cartographie sous le nom :\n", + " - \"keplergl_map_global.html\" si \"station_id\" n'est pas indiqué.\n", + " - \"keplergl_map_station.html\" si \"station_id\" est indiqué.\n", + "\n", + " Ouvrir ensuite le fichier sur le browser.\n", + "\n", + " Parameters\n", + " ----------\n", + " data : pd.DataFrame\n", + " En provenance de station_control.csv (vcub_watcher)\n", + " station_id : Int [opt]\n", + " Numéro de station que l'on souhaite voir (en focus) sur la cartographie.\n", + " Returns\n", + " -------\n", + " None\n", + "\n", + " Examples\n", + " --------\n", + "\n", + " plot_map_station_with_kepler(data=station_control, station_id=6)\n", + " \"\"\"\n", + "\n", + " # Global config plot\n", + " config_global = {\n", + " \"version\": \"v1\",\n", + " \"config\": {\n", + " \"visState\": {\n", + " \"filters\": [],\n", + " \"layers\": [\n", + " {\n", + " \"id\": \"fmdzqhw\",\n", + " \"type\": \"point\",\n", + " \"config\": {\n", + " \"dataId\": \"data_1\",\n", + " \"label\": \"Station Vcub\",\n", + " \"color\": [\n", + " 18,\n", + " 147,\n", + " 154\n", + " ],\n", + " \"columns\": {\n", + " \"lat\": \"lat\",\n", + " \"lng\": \"lon\",\n", + " \"altitude\": None\n", + " },\n", + " \"isVisible\": True,\n", + " \"visConfig\": {\n", + " \"radius\": 12,\n", + " \"fixedRadius\": False,\n", + " \"opacity\": 0.8,\n", + " \"outline\": False,\n", + " \"thickness\": 2,\n", + " \"strokeColor\": None,\n", + " \"colorRange\": {\n", + " \"name\": \"Custom Palette\",\n", + " \"type\": \"custom\",\n", + " \"category\": \"Custom\",\n", + " \"colors\": [\n", + " \"#EB4D50\",\n", + " \"#5E9BE6\",\n", + " \"#6DDE75\"\n", + " ]\n", + " },\n", + " \"strokeColorRange\": {\n", + " \"name\": \"Global Warming\",\n", + " \"type\": \"sequential\",\n", + " \"category\": \"Uber\",\n", + " \"colors\": [\n", + " \"#5A1846\",\n", + " \"#900C3F\",\n", + " \"#C70039\",\n", + " \"#E3611C\",\n", + " \"#F1920E\",\n", + " \"#FFC300\"\n", + " ]\n", + " },\n", + " \"radiusRange\": [\n", + " 0,\n", + " 50\n", + " ],\n", + " \"filled\": True\n", + " },\n", + " \"hidden\": False,\n", + " \"textLabel\": [\n", + " {\n", + " \"field\": None,\n", + " \"color\": [\n", + " 255,\n", + " 255,\n", + " 255\n", + " ],\n", + " \"size\": 18,\n", + " \"offset\": [\n", + " 0,\n", + " 0\n", + " ],\n", + " \"anchor\": \"start\",\n", + " \"alignment\": \"center\"\n", + " }\n", + " ]\n", + " },\n", + " \"visualChannels\": {\n", + " \"colorField\": {\n", + " \"name\": \"etat\",\n", + " \"type\": \"string\"\n", + " },\n", + " \"colorScale\": \"ordinal\",\n", + " \"strokeColorField\": None,\n", + " \"strokeColorScale\": \"quantile\",\n", + " \"sizeField\": None,\n", + " \"sizeScale\": \"linear\"\n", + " }\n", + " }\n", + " ],\n", + " \"interactionConfig\": {\n", + " \"tooltip\": {\n", + " \"fieldsToShow\": {\n", + " \"data_1\": [\n", + " {\n", + " \"name\": \"station_id\",\n", + " \"format\": None\n", + " },\n", + " {\n", + " \"name\": \"NOM\",\n", + " \"format\": None\n", + " },\n", + " {\n", + " \"name\": \"etat\",\n", + " \"format\": None\n", + " },\n", + " {\n", + " \"name\": \"available_bikes\",\n", + " \"format\": None\n", + " },\n", + " {\n", + " \"name\": \"anomaly_since_str\",\n", + " \"format\": None\n", + " }\n", + " ]\n", + " },\n", + " \"compareMode\": True,\n", + " \"compareType\": \"absolute\",\n", + " \"enabled\": True\n", + " },\n", + " \"brush\": {\n", + " \"size\": 0.5,\n", + " \"enabled\": False\n", + " },\n", + " \"geocoder\": {\n", + " \"enabled\": False\n", + " },\n", + " \"coordinate\": {\n", + " \"enabled\": False\n", + " }\n", + " },\n", + " \"layerBlending\": \"normal\",\n", + " \"splitMaps\": [],\n", + " \"animationConfig\": {\n", + " \"currentTime\": None,\n", + " \"speed\": 1\n", + " }\n", + " },\n", + " \"mapState\": {\n", + " \"bearing\": 0,\n", + " \"dragRotate\": False,\n", + " \"latitude\": 44.85169239146265,\n", + " \"longitude\": -0.5868239240658858,\n", + " \"pitch\": 0,\n", + " \"zoom\": 11.452871077625481,\n", + " \"isSplit\": False\n", + " },\n", + " \"mapStyle\": {\n", + " \"styleType\": \"muted\",\n", + " \"topLayerGroups\": {\n", + " \"water\": False\n", + " },\n", + " \"visibleLayerGroups\": {\n", + " \"label\": True,\n", + " \"road\": True,\n", + " \"border\": False,\n", + " \"building\": True,\n", + " \"water\": True,\n", + " \"land\": True,\n", + " \"3d building\": False\n", + " },\n", + " \"threeDBuildingColor\": [\n", + " 137,\n", + " 137,\n", + " 137\n", + " ],\n", + " \"mapStyles\": {}\n", + " }\n", + " }\n", + " }\n", + "\n", + " # Preprocess avant graphique\n", + " station_control['etat'] = 'normal'\n", + "\n", + " # En anoamlie (HS prediction)\n", + " station_control.loc[station_control['is_anomaly'] == 1, 'etat'] = 'anomaly'\n", + "\n", + " # Inactive\n", + " station_control.loc[station_control['is_inactive'] == 1, 'etat'] = 'inactive'\n", + "\n", + " # Transform date to string\n", + " station_control['anomaly_since_str'] = \\\n", + " station_control['anomaly_since'].dt.strftime(date_format='%Y-%m-%d %H:%M')\n", + " station_control['anomaly_since_str'] = station_control['anomaly_since_str'].fillna('-')\n", + "\n", + " # Drop date for Kepler\n", + " station_control_kepler = station_control.drop(['last_date_anomaly', 'anomaly_since'], axis=1)\n", + "\n", + " # Param plot with a given station_id\n", + " if station_id is not None:\n", + " # On centre le graphique sur la lat / lon de la station\n", + " center_lat = \\\n", + " station_control[station_control['station_id'] == station_id]['lat'].values[0]\n", + " center_lon = \\\n", + " station_control[station_control['station_id'] == station_id]['lon'].values[0]\n", + "\n", + " config_global['config']['mapState']['latitude'] = center_lat\n", + " config_global['config']['mapState']['longitude'] = center_lon\n", + " config_global['config']['mapState']['zoom'] = 15.3\n", + " config_global['config']['mapState']['bearing'] = 24\n", + " config_global['config']['mapState']['dragRotate'] = True\n", + " config_global['config']['mapState']['pitch'] = 54\n", + " # Building 3D\n", + " config_global['config']['mapStyle']['visibleLayerGroups']['3d building'] = True\n", + " file_name = 'keplergl_map_station.html'\n", + " else:\n", + " file_name = 'keplergl_map_global.html'\n", + "\n", + " # Load kepler.gl with map data and config\n", + " map_kepler = KeplerGl(height=400, data={\"data_1\": station_control_kepler}, config=config_global)\n", + "\n", + " # Export\n", + " map_kepler.save_to_html(file_name=file_name)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T14:11:24.757594Z", + "start_time": "2021-04-08T14:11:24.149454Z" + } + }, + "outputs": [], + "source": [ + "from vcub_keeper.visualisation import plot_map_station_with_kepler" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T14:11:25.976372Z", + "start_time": "2021-04-08T14:11:25.949382Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "User Guide: https://docs.kepler.gl/docs/keplergl-jupyter\n", + "Map saved to keplergl_map_global.html!\n" + ] + } + ], + "source": [ + "plot_map_station_with_kepler(station_control=station_control, station_id=None)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-08T14:11:26.939847Z", + "start_time": "2021-04-08T14:11:26.911239Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "User Guide: https://docs.kepler.gl/docs/keplergl-jupyter\n", + "Map saved to keplergl_map_station.html!\n" + ] + } + ], + "source": [ + "plot_map_station_with_kepler(station_control=station_control, station_id=6)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [conda env:vcub_keeper] *", + "language": "python", + "name": "conda-env-vcub_keeper-py" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": true, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": true + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/vcub_keeper/config.py b/vcub_keeper/config.py index fbc25b3..4f9c507 100644 --- a/vcub_keeper/config.py +++ b/vcub_keeper/config.py @@ -57,6 +57,8 @@ # Key api meteo API_METEO = os.getenv("API_METEO") +# Key api mapbox +MAPBOX_TOKEN = os.getenv("MAPBOX_TOKEN") # Station Vcub ID non user # https://github.com/armgilles/vcub_keeper/issues/29#issuecomment-703246491 diff --git a/vcub_keeper/visualisation.py b/vcub_keeper/visualisation.py index eeaba09..908979c 100644 --- a/vcub_keeper/visualisation.py +++ b/vcub_keeper/visualisation.py @@ -3,6 +3,7 @@ import seaborn as sns import plotly.graph_objs as go from plotly.offline import init_notebook_mode, iplot, offline +from keplergl import KeplerGl from vcub_keeper.reader.reader_utils import filter_periode from vcub_keeper.ml.cluster import predict_anomalies_station @@ -10,7 +11,7 @@ get_transactions_out, get_transactions_all, get_consecutive_no_transactions_out) -from vcub_keeper.config import NON_USE_STATION_ID +from vcub_keeper.config import NON_USE_STATION_ID, MAPBOX_TOKEN def plot_station_activity(data, station_id, @@ -285,7 +286,7 @@ def plot_station_anomalies(data, clf, station_id, )) data_pred = data_pred.drop(['no_anomalie', 'anomaly_grp'], axis=1) - + if display_title: title = "Détection d'anomalies sur la stations N° " + str(station_id) else: @@ -329,3 +330,362 @@ def plot_station_anomalies(data, clf, station_id, if return_data is True: return data_pred + + +def plot_map_station_with_plotly(station_control, + station_id=None, + offline_plot=False): + """ + Affiche une cartographie de l'agglomération de Bordeaux avec toutes les stations Vcub et leurs états + provenant des algorithmes (normal, inactive et anomaly). + + Si "station_id" est indiqué, alors la cartographie est focus sur la lat / lon de station (Numéro) + + Parameters + ---------- + data : pd.DataFrame + En provenance de station_control.csv (vcub_watcher) + station_id : Int [opt] + Numéro de station que l'on souhaite voir (en focus) sur la cartographie. + offline_plot : bool [opt] + Pour retourner le graphique et l'utiliser dans une application + + Returns + ------- + None + + Examples + -------- + + plot_map_station_with_plotly(station_control=station_control, offline_plot=False) + """ + # Param plot with a given station_id + if station_id is not None: + # On centre le graphique sur la lat / lon de la station + center_lat = \ + station_control[station_control['station_id'] == station_id]['lat'].values[0] + center_lon = \ + station_control[station_control['station_id'] == station_id]['lon'].values[0] + zoom_plot = 15 + else: + center_lat = 44.837794 + center_lon = -0.581662 + zoom_plot = 11 + + # Preprocess avant graphique + station_control['etat'] = 'normal' + + # En anoamlie (HS prediction) + station_control.loc[station_control['is_anomaly'] == 1, 'etat'] = 'anomaly' + + # Inactive + station_control.loc[station_control['is_inactive'] == 1, 'etat'] = 'inactive' + + # Transform date to string + station_control['anomaly_since_str'] = \ + station_control['anomaly_since'].dt.strftime(date_format='%Y-%m-%d %H:%M') + station_control['anomaly_since_str'] = station_control['anomaly_since_str'].fillna('-') + + # Color for etat + color_etat = {'anomaly': '#EB4D50', + 'inactive': '#5E9BE6', + 'normal': '#6DDE75'} + + # To know when use add_trace after init fig + wtf_compteur = 0 + + for etat in station_control['etat'].unique(): + # Filter + temp = station_control[station_control['etat'] == etat] + + # Building text + texts = [] + for idx, station in temp.iterrows(): + text = str(station['NOM']) \ + + "
" + "station N° : " + str(station['station_id']) \ + + "
" + "Nombre de vélo dispo : " + str(station['available_bikes']) \ + + "
" + "Activité suspecte depuis : " + str(station['anomaly_since_str']) + texts.append(text) + + if wtf_compteur == 0: + fig = go.Figure(go.Scattermapbox(lat=temp['lat'], + lon=temp['lon'], + mode='markers', + hoverinfo='text', + hovertext=texts, + marker_size=9, + marker_color=color_etat[etat], + name=etat)) + else: + fig.add_trace(go.Scattermapbox(lat=temp['lat'], + lon=temp['lon'], + mode='markers', + hoverinfo='text', + hovertext=texts, + marker_size=9, + marker_color=color_etat[etat], + name=etat)) + + wtf_compteur = 1 + + fig.update_layout(mapbox=dict(center=dict(lat=center_lat, lon=center_lon), + accesstoken=MAPBOX_TOKEN, + zoom=zoom_plot, + style="light"), + showlegend=True, + legend=dict(orientation="h", + yanchor="top", + xanchor="center", + y=1.1, + x=0.5 + )) + if offline_plot is False: + iplot(fig) + else: + offline.plot(fig) + + +def plot_map_station_with_kepler(station_control, station_id=None): + """ + Affiche une cartographie de l'agglomération de Bordeaux avec toutes les stations Vcub et leurs états + provenant des algorithmes (normal, inactive et anomaly). + + Si "station_id" est indiqué, alors la cartographie est focus sur la lat / lon de station (Numéro) + + Export la cartographie sous le nom : + - "keplergl_map_global.html" si "station_id" n'est pas indiqué. + - "keplergl_map_station.html" si "station_id" est indiqué. + + Ouvrir ensuite le fichier sur le browser. + + Parameters + ---------- + data : pd.DataFrame + En provenance de station_control.csv (vcub_watcher) + station_id : Int [opt] + Numéro de station que l'on souhaite voir (en focus) sur la cartographie. + Returns + ------- + None + + Examples + -------- + + plot_map_station_with_kepler(station_control=station_control, station_id=6) + """ + + # Global config plot + config_global = { + "version": "v1", + "config": { + "visState": { + "filters": [], + "layers": [ + { + "id": "fmdzqhw", + "type": "point", + "config": { + "dataId": "data_1", + "label": "Station Vcub", + "color": [ + 18, + 147, + 154 + ], + "columns": { + "lat": "lat", + "lng": "lon", + "altitude": None + }, + "isVisible": True, + "visConfig": { + "radius": 12, + "fixedRadius": False, + "opacity": 0.8, + "outline": False, + "thickness": 2, + "strokeColor": None, + "colorRange": { + "name": "Custom Palette", + "type": "custom", + "category": "Custom", + "colors": [ + "#EB4D50", + "#5E9BE6", + "#6DDE75" + ] + }, + "strokeColorRange": { + "name": "Global Warming", + "type": "sequential", + "category": "Uber", + "colors": [ + "#5A1846", + "#900C3F", + "#C70039", + "#E3611C", + "#F1920E", + "#FFC300" + ] + }, + "radiusRange": [ + 0, + 50 + ], + "filled": True + }, + "hidden": False, + "textLabel": [ + { + "field": None, + "color": [ + 255, + 255, + 255 + ], + "size": 18, + "offset": [ + 0, + 0 + ], + "anchor": "start", + "alignment": "center" + } + ] + }, + "visualChannels": { + "colorField": { + "name": "etat", + "type": "string" + }, + "colorScale": "ordinal", + "strokeColorField": None, + "strokeColorScale": "quantile", + "sizeField": None, + "sizeScale": "linear" + } + } + ], + "interactionConfig": { + "tooltip": { + "fieldsToShow": { + "data_1": [ + { + "name": "station_id", + "format": None + }, + { + "name": "NOM", + "format": None + }, + { + "name": "etat", + "format": None + }, + { + "name": "available_bikes", + "format": None + }, + { + "name": "anomaly_since_str", + "format": None + } + ] + }, + "compareMode": True, + "compareType": "absolute", + "enabled": True + }, + "brush": { + "size": 0.5, + "enabled": False + }, + "geocoder": { + "enabled": False + }, + "coordinate": { + "enabled": False + } + }, + "layerBlending": "normal", + "splitMaps": [], + "animationConfig": { + "currentTime": None, + "speed": 1 + } + }, + "mapState": { + "bearing": 0, + "dragRotate": False, + "latitude": 44.85169239146265, + "longitude": -0.5868239240658858, + "pitch": 0, + "zoom": 11.452871077625481, + "isSplit": False + }, + "mapStyle": { + "styleType": "muted", + "topLayerGroups": { + "water": False + }, + "visibleLayerGroups": { + "label": True, + "road": True, + "border": False, + "building": True, + "water": True, + "land": True, + "3d building": False + }, + "threeDBuildingColor": [ + 137, + 137, + 137 + ], + "mapStyles": {} + } + } + } + + # Preprocess avant graphique + station_control['etat'] = 'normal' + + # En anoamlie (HS prediction) + station_control.loc[station_control['is_anomaly'] == 1, 'etat'] = 'anomaly' + + # Inactive + station_control.loc[station_control['is_inactive'] == 1, 'etat'] = 'inactive' + + # Transform date to string + station_control['anomaly_since_str'] = \ + station_control['anomaly_since'].dt.strftime(date_format='%Y-%m-%d %H:%M') + station_control['anomaly_since_str'] = station_control['anomaly_since_str'].fillna('-') + + # Drop date for Kepler + station_control_kepler = station_control.drop(['last_date_anomaly', 'anomaly_since'], axis=1) + + # Param plot with a given station_id + if station_id is not None: + # On centre le graphique sur la lat / lon de la station + center_lat = \ + station_control[station_control['station_id'] == station_id]['lat'].values[0] + center_lon = \ + station_control[station_control['station_id'] == station_id]['lon'].values[0] + + config_global['config']['mapState']['latitude'] = center_lat + config_global['config']['mapState']['longitude'] = center_lon + config_global['config']['mapState']['zoom'] = 15.3 + config_global['config']['mapState']['bearing'] = 24 + config_global['config']['mapState']['dragRotate'] = True + config_global['config']['mapState']['pitch'] = 54 + # Building 3D + config_global['config']['mapStyle']['visibleLayerGroups']['3d building'] = True + file_name = 'keplergl_map_station.html' + else: + file_name = 'keplergl_map_global.html' + + # Load kepler.gl with map data and config + map_kepler = KeplerGl(height=400, data={"data_1": station_control_kepler}, config=config_global) + + # Export + map_kepler.save_to_html(file_name=file_name)