{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "![title](https://i.ytimg.com/vi/Cgu5y-6VWfo/maxresdefault.jpg)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# On va nous déménager: un cas d’intelligence de localisation pour compare locations entre Paris, Lyon et Marseille\n", "\n", "
Roque Leal
\n", "\n", "Déménager dans une autre ville est toujours excitant mais implique également de nombreuses décisions. L'une des plus grandes décisions est: où dois-je vivre?\n", "Le quartier dans lequel vous vivez peut avoir un impact considérable sur votre première impression de la nouvelle ville, sans oublier que c'est une décision que vous DEVEZ prendre avant de déménager!\n", "Certaines personnes vivaient dans des endroits très fréquentés et aimeraient changer de rythme lorsqu'elles bougent. D'autres voudraient la même énergie qu'ils vivaient dans leur vieille ville! Ce projet vise à comparer certains quartiers entre deux villes et à voir quelles zones sont similaires et lesquelles pourraient être complètement opposées.\n", "\n", "Après quelques recherches de quartier, nous comparerons le quartier à déménager dans Paris, Lyon oú Marselle.\n", "\n", "Les données que nous utiliserons seront des données de lieu de Foursquare. Les lieux que nous rassemblerons concerneront de nombreuses choses qu'une personne rechercherait lorsqu'elle vivrait, par exemple:\n", " - Épiceries\n", " - Abordabilité de ces lieux\n", " - Restaurants\n", " - Centres commerciaux\n", "...et plus!\n", " \n", "Voyons voir si nous pouvons les aider à décider." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Bibliothèques importées.\n" ] } ], "source": [ "import numpy as np\n", "import pandas as pd\n", "pd.set_option('display.max_columns', None)\n", "pd.set_option('display.max_rows', None)\n", "\n", "import json\n", "\n", "from geopy.geocoders import Nominatim # latitude/longitude converter\n", "\n", "import requests\n", "from pandas.io.json import json_normalize #json files to pandas dataframe\n", "\n", "import matplotlib.cm as cm\n", "import matplotlib.colors as colors\n", "\n", "import folium\n", "\n", "print('Bibliothèques importées.')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Configurer l'API´s" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Client ID: xxxxxx\n", "Client Secret: xxxxxx\n", "Version: xxxxxx\n" ] } ], "source": [ "CLIENT_ID = 'xxxxxx'\n", "CLIENT_SECRET = 'xxxxxx'\n", "VERSION = 'xxxxxx'\n", "\n", "print('Client ID: ' + CLIENT_ID)\n", "print('Client Secret: ' + CLIENT_SECRET)\n", "print('Version: '+ VERSION)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Méthodologie" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Adresse Principale: importez à Paris les données de l'API Foursquare et créez DataFrame" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "13 Rue de Poissy, 75005 Paris, Francia, coordinates: 48.8489808 2.3525466\n" ] } ], "source": [ "c_address = '13 Rue de Poissy, 75005 Paris, Francia'\n", "\n", "c_geolocator = Nominatim(user_agent='foursquare_agent')\n", "c_location = c_geolocator.geocode(c_address)\n", "c_latitude = c_location.latitude\n", "c_longitude = c_location.longitude\n", "print('13 Rue de Poissy, 75005 Paris, Francia, coordinates: ', c_latitude, c_longitude)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "xxxxxx\n" ] } ], "source": [ "radius = 500\n", "LIMIT = 100000\n", "\n", "c_url = 'xxxxxx'.format(\n", " CLIENT_ID,\n", " CLIENT_SECRET,\n", " c_latitude,\n", " c_longitude,\n", " VERSION,\n", " radius,\n", " LIMIT\n", " )\n", "\n", "print(c_url)" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [], "source": [ "results = requests.get(c_url).json()" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [], "source": [ "def get_category_type(row):\n", " try:\n", " category_list = row['categories']\n", " except:\n", " category_list = row['venue.categories']\n", " \n", " if len(category_list) == 0:\n", " return None\n", " else:\n", " return category_list[0]['name']" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [], "source": [ "venues = results['response']['groups'][0]['items']\n", "\n", "nearby_venues = json_normalize(venues) #flattens JSON\n", "\n", "filtered_columns = ['venue.name', 'venue.id', 'venue.categories', 'venue.location.lat', 'venue.location.lng']\n", "nearby_venues = nearby_venues.loc[:, filtered_columns]\n", "\n", "nearby_venues['venue.categories'] = nearby_venues.apply(get_category_type, axis = 1)" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "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", "
venue.namevenue.idvenue.categoriesvenue.location.latvenue.location.lng
0La Tour d'Argent4adcda11f964a520da3521e3French Restaurant48.8497912.354950
1Restaurant AT5342fcff498e1d32177cc21bJapanese Restaurant48.8496282.354654
2Au Moulin à Vent4d3898babb0d721ea09c55e3French Restaurant48.8485042.354937
3Grand Action4b8a75d1f964a520a96d32e3Indie Movie Theater48.8476142.352291
45ème Cru4b5474d4f964a520e9bb27e3Wine Bar48.8490662.354118
5Boulangerie La Parisienne4e58cf2bd164da2b275956ffBakery48.8499492.349760
6Bonvivant5530cc1f498ea6903c33a3daWine Bar48.8475512.351969
7Anahuacalli4adcda14f964a520fe3621e3Mexican Restaurant48.8499072.350409
8Diptyque4adcda21f964a520b93921e3Miscellaneous Shop48.8495892.351653
9Strada Café54842e01498ee191fa3c80e8Café48.8470382.351278
\n", "
" ], "text/plain": [ " venue.name venue.id venue.categories \\\n", "0 La Tour d'Argent 4adcda11f964a520da3521e3 French Restaurant \n", "1 Restaurant AT 5342fcff498e1d32177cc21b Japanese Restaurant \n", "2 Au Moulin à Vent 4d3898babb0d721ea09c55e3 French Restaurant \n", "3 Grand Action 4b8a75d1f964a520a96d32e3 Indie Movie Theater \n", "4 5ème Cru 4b5474d4f964a520e9bb27e3 Wine Bar \n", "5 Boulangerie La Parisienne 4e58cf2bd164da2b275956ff Bakery \n", "6 Bonvivant 5530cc1f498ea6903c33a3da Wine Bar \n", "7 Anahuacalli 4adcda14f964a520fe3621e3 Mexican Restaurant \n", "8 Diptyque 4adcda21f964a520b93921e3 Miscellaneous Shop \n", "9 Strada Café 54842e01498ee191fa3c80e8 Café \n", "\n", " venue.location.lat venue.location.lng \n", "0 48.849791 2.354950 \n", "1 48.849628 2.354654 \n", "2 48.848504 2.354937 \n", "3 48.847614 2.352291 \n", "4 48.849066 2.354118 \n", "5 48.849949 2.349760 \n", "6 48.847551 2.351969 \n", "7 48.849907 2.350409 \n", "8 48.849589 2.351653 \n", "9 48.847038 2.351278 " ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nearby_venues.head(10)" ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 94 entries, 0 to 93\n", "Data columns (total 5 columns):\n", "venue.name 94 non-null object\n", "venue.id 94 non-null object\n", "venue.categories 94 non-null object\n", "venue.location.lat 94 non-null float64\n", "venue.location.lng 94 non-null float64\n", "dtypes: float64(2), object(3)\n", "memory usage: 3.8+ KB\n" ] } ], "source": [ "nearby_venues.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "94 \"venues\" sont revenus dans les résultats du 13 rue de Poissy." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Juste en regardant quelques endroits sur la liste, nous pouvons voir qu'il y a pas mal de variations." ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [], "source": [ "nearby_venues.columns = [col.split('.')[-1] for col in nearby_venues.columns]" ] }, { "cell_type": "code", "execution_count": 101, "metadata": { "scrolled": true }, "outputs": [], "source": [ "nearby_venues_map = nearby_venues[0:51]" ] }, { "cell_type": "code", "execution_count": 146, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "execution_count": 146, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tileset = r'xxxxxx'\n", "attribution = (r'Map data © OpenStreetMap'\n", " ' contributors, Imagery © MapBox')\n", "\n", "wp_venues_map = folium.Map(location=[c_latitude, c_longitude], zoom_start=16, tiles=tileset, attr=attribution)\n", "\n", "#red marker added for main location\n", "folium.CircleMarker(\n", " [c_latitude,c_longitude],\n", " radius=10,\n", " color='red',\n", " popup='Adresse principale',\n", " fill=True,\n", " fill_color= 'red',\n", " fill_opacity = 0.6\n", ").add_to(wp_venues_map)\n", "\n", "#blue markers for search results\n", "for lat, lng, label in zip(nearby_venues_map.lat, nearby_venues_map.lng, nearby_venues_map.categories):\n", " folium.CircleMarker(\n", " [lat, lng],\n", " radius = 5,\n", " color='blue',\n", " popup=label,\n", " fill=True,\n", " fill_color='blue',\n", " fill_opacity=0.6\n", " ).add_to(wp_venues_map)\n", " \n", "wp_venues_map" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Découverte de l'adresseur principal: 13 Rue de Poissy, 75005 Paris" ] }, { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "name 94\n", "id 94\n", "categories 94\n", "lat 94\n", "lng 94\n", "dtype: int64" ] }, "execution_count": 105, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nearby_venues.count()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Il y a 94 venues dans un rayon de 500 mètres du centre de 13 Rue de Poissy, 75005 Paris." ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "44" ] }, "execution_count": 106, "metadata": {}, "output_type": "execute_result" } ], "source": [ "wp_unique = nearby_venues['categories'].unique()\n", "nearby_venues['categories'].nunique()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Il existe 44 types de lieux différents dans le quartier." ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "categories\n", "French Restaurant 22\n", "Café 5\n", "Bar 4\n", "Bistro 4\n", "Hotel 4\n", "Pub 4\n", "Bakery 3\n", "Japanese Restaurant 3\n", "Ice Cream Shop 3\n", "Coffee Shop 3\n", "Name: name, dtype: int64" ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "top_categories = nearby_venues.groupby('categories').count()['name'].sort_values(ascending=False).head(10)\n", "top_categories" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La catégorie avec le plus de lieux autour sont les French Restaurants, suivie par les Cafés." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 13 Rue de Poissy, tarifs et likes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Jetons un coup d'œil à 15 venues sites et à son prix et likes avoir pour une idée del quartier." ] }, { "cell_type": "code", "execution_count": 127, "metadata": {}, "outputs": [], "source": [ "def get_venue_info(dataframe_col):\n", " venue_info = []\n", " for venue_id in dataframe_col[0:15]:\n", " v_url = 'https://api.foursquare.com/v2/venues/{}?client_id={}&client_secret={}&v={}'.format(venue_id, CLIENT_ID, CLIENT_SECRET, VERSION)\n", " v_results = requests.get(v_url).json()\n", " try:\n", " venue_name = v_results['response']['venue']['name']\n", " except:\n", " venue_name = 'Not Available'\n", " try:\n", " venue_price = v_results['response']['venue']['price']\n", " except:\n", " venue_price = 'Not Available'\n", " try:\n", " venue_likes = v_results['response']['venue']['likes']['count']\n", " except:\n", " venue_likes = 'Not Available'\n", " venue_info.append([venue_name, venue_price, venue_likes])\n", " return venue_info" ] }, { "cell_type": "code", "execution_count": 132, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[\"La Tour d'Argent\", {'tier': 3, 'message': 'Expensive', 'currency': '€'}, 120], ['Restaurant AT', {'tier': 2, 'message': 'Moderate', 'currency': '€'}, 50], ['Au Moulin à Vent', {'tier': 3, 'message': 'Expensive', 'currency': '€'}, 16], ['Grand Action', 'Not Available', 41], ['5ème Cru', {'tier': 2, 'message': 'Moderate', 'currency': '€'}, 27], ['Boulangerie La Parisienne', {'tier': 1, 'message': 'Cheap', 'currency': '€'}, 125], ['Bonvivant', {'tier': 2, 'message': 'Moderate', 'currency': '€'}, 41], ['Anahuacalli', {'tier': 1, 'message': 'Cheap', 'currency': '€'}, 97], ['Diptyque', 'Not Available', 25], ['Strada Café', {'tier': 1, 'message': 'Cheap', 'currency': '€'}, 287], ['Aux Merveilleux de Fred', 'Not Available', 24], ['Collège des Bernardins', 'Not Available', 34], ['Bar à Iode', {'tier': 3, 'message': 'Expensive', 'currency': '€'}, 21], ['Le Buisson Ardent', {'tier': 3, 'message': 'Expensive', 'currency': '€'}, 36], [\"La Maison d'Isabelle\", {'tier': 1, 'message': 'Cheap', 'currency': '€'}, 29]]\n" ] } ], "source": [ "paris_venue_info = get_venue_info(nearby_venues['id'])\n", "print(wicker_venue_info)" ] }, { "cell_type": "code", "execution_count": 133, "metadata": {}, "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", "
nameprice_tierlikes
0La Tour d'Argent{'tier': 3, 'message': 'Expensive', 'currency'...120
1Restaurant AT{'tier': 2, 'message': 'Moderate', 'currency':...50
2Au Moulin à Vent{'tier': 3, 'message': 'Expensive', 'currency'...16
3Grand ActionNot Available41
45ème Cru{'tier': 2, 'message': 'Moderate', 'currency':...27
5Boulangerie La Parisienne{'tier': 1, 'message': 'Cheap', 'currency': '€'}125
6Bonvivant{'tier': 2, 'message': 'Moderate', 'currency':...41
7Anahuacalli{'tier': 1, 'message': 'Cheap', 'currency': '€'}97
8DiptyqueNot Available25
9Strada Café{'tier': 1, 'message': 'Cheap', 'currency': '€'}287
10Aux Merveilleux de FredNot Available24
11Collège des BernardinsNot Available34
12Bar à Iode{'tier': 3, 'message': 'Expensive', 'currency'...21
13Le Buisson Ardent{'tier': 3, 'message': 'Expensive', 'currency'...36
14La Maison d'Isabelle{'tier': 1, 'message': 'Cheap', 'currency': '€'}29
\n", "
" ], "text/plain": [ " name \\\n", "0 La Tour d'Argent \n", "1 Restaurant AT \n", "2 Au Moulin à Vent \n", "3 Grand Action \n", "4 5ème Cru \n", "5 Boulangerie La Parisienne \n", "6 Bonvivant \n", "7 Anahuacalli \n", "8 Diptyque \n", "9 Strada Café \n", "10 Aux Merveilleux de Fred \n", "11 Collège des Bernardins \n", "12 Bar à Iode \n", "13 Le Buisson Ardent \n", "14 La Maison d'Isabelle \n", "\n", " price_tier likes \n", "0 {'tier': 3, 'message': 'Expensive', 'currency'... 120 \n", "1 {'tier': 2, 'message': 'Moderate', 'currency':... 50 \n", "2 {'tier': 3, 'message': 'Expensive', 'currency'... 16 \n", "3 Not Available 41 \n", "4 {'tier': 2, 'message': 'Moderate', 'currency':... 27 \n", "5 {'tier': 1, 'message': 'Cheap', 'currency': '€'} 125 \n", "6 {'tier': 2, 'message': 'Moderate', 'currency':... 41 \n", "7 {'tier': 1, 'message': 'Cheap', 'currency': '€'} 97 \n", "8 Not Available 25 \n", "9 {'tier': 1, 'message': 'Cheap', 'currency': '€'} 287 \n", "10 Not Available 24 \n", "11 Not Available 34 \n", "12 {'tier': 3, 'message': 'Expensive', 'currency'... 21 \n", "13 {'tier': 3, 'message': 'Expensive', 'currency'... 36 \n", "14 {'tier': 1, 'message': 'Cheap', 'currency': '€'} 29 " ] }, "execution_count": 133, "metadata": {}, "output_type": "execute_result" } ], "source": [ "paris_df = pd.DataFrame(wicker_venue_info, columns=['name', 'price_tier', 'likes'])\n", "paris_df" ] }, { "cell_type": "code", "execution_count": 135, "metadata": {}, "outputs": [], "source": [ "def get_price_tier(df):\n", " price_tier = df['price_tier']\n", " \n", " if len(price_tier) == 0:\n", " return None\n", " elif price_tier == 'Not Available':\n", " return None\n", " else:\n", " return price_tier['message']" ] }, { "cell_type": "code", "execution_count": 136, "metadata": {}, "outputs": [], "source": [ "paris_df['price_tier'] = wicker_df.apply(get_price_tier, axis=1)" ] }, { "cell_type": "code", "execution_count": 137, "metadata": {}, "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", "
nameprice_tierlikes
9Strada CaféCheap287
5Boulangerie La ParisienneCheap125
0La Tour d'ArgentExpensive120
7AnahuacalliCheap97
1Restaurant ATModerate50
3Grand ActionNone41
6BonvivantModerate41
13Le Buisson ArdentExpensive36
11Collège des BernardinsNone34
14La Maison d'IsabelleCheap29
45ème CruModerate27
8DiptyqueNone25
10Aux Merveilleux de FredNone24
12Bar à IodeExpensive21
2Au Moulin à VentExpensive16
\n", "
" ], "text/plain": [ " name price_tier likes\n", "9 Strada Café Cheap 287\n", "5 Boulangerie La Parisienne Cheap 125\n", "0 La Tour d'Argent Expensive 120\n", "7 Anahuacalli Cheap 97\n", "1 Restaurant AT Moderate 50\n", "3 Grand Action None 41\n", "6 Bonvivant Moderate 41\n", "13 Le Buisson Ardent Expensive 36\n", "11 Collège des Bernardins None 34\n", "14 La Maison d'Isabelle Cheap 29\n", "4 5ème Cru Moderate 27\n", "8 Diptyque None 25\n", "10 Aux Merveilleux de Fred None 24\n", "12 Bar à Iode Expensive 21\n", "2 Au Moulin à Vent Expensive 16" ] }, "execution_count": 137, "metadata": {}, "output_type": "execute_result" } ], "source": [ "paris_df.sort_values('likes', ascending=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "De ces 15 \"venues\", il semblerait que le prix moyen d'un magasin autour du 13 rue de Poissy soit dans la fourchette modérée-bon marché. Sur les 15, quatre seulement sont considérés comme chers. Le nombre de «Likes» pour ces lieux n'est pas trop faible, ce qui suggère qu'ils ne sont pas mal notés non plus." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Importer les données de localisation de Lyon depuis l'API Foursquare" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "6 Rue Gasparin, 69002 Lyon, France: 45.7598522 4.8333555\n" ] } ], "source": [ "qa_address = '6 Rue Gasparin, 69002 Lyon, France'\n", "\n", "qa_geolocator = Nominatim(user_agent='foursquare_agent')\n", "qa_location = qa_geolocator.geocode(qa_address)\n", "qa_lat = qa_location.latitude\n", "qa_lng = qa_location.longitude\n", "\n", "print('6 Rue Gasparin, 69002 Lyon, France: ', qa_lat, qa_lng)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "xxxxxx\n" ] } ], "source": [ "qa_url = 'xxxxxx'.format(\n", " CLIENT_ID,\n", " CLIENT_SECRET,\n", " qa_lat,\n", " qa_lng,\n", " VERSION,\n", " radius,\n", " LIMIT\n", " )\n", "\n", "print(qa_url)" ] }, { "cell_type": "code", "execution_count": 141, "metadata": {}, "outputs": [], "source": [ "qa_results = requests.get(qa_url).json()" ] }, { "cell_type": "code", "execution_count": 142, "metadata": {}, "outputs": [], "source": [ "qa_venues = qa_results['response']['groups'][0]['items']\n", "\n", "qa_nearby_venues = json_normalize(qa_venues)\n", "\n", "qa_nearby_venues = qa_nearby_venues.loc[:, filtered_columns]" ] }, { "cell_type": "code", "execution_count": 143, "metadata": { "scrolled": true }, "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", "
nameidcategorieslatlng
0Place des Jacobins4b61baf8f964a520361f2ae3Plaza45.7604894.833636
1Place des Célestins4b61bb38f964a5203f1f2ae3Plaza45.7598044.831842
2Place de la République4cbfe494021ca1438bf15e0cPlaza45.7603474.835635
3Slake Coffee House5602838f498e9111e2522df3Café45.7609224.832910
4Marché Saint-Antoine4c304d6a66e40f470f65c38bFarmers Market45.7617564.831853
5Mozzato - Comptoir à Mozzarella526038cd11d2d0efdb9f407fItalian Restaurant45.7616974.832963
6Place Bellecour4b5e0a3df964a520817a29e3Plaza45.7575234.832397
7Théâtre des Célestins4b8a84caf964a520567032e3Theater45.7597694.831996
8L'Épicerie - Bistrot à Tartines4b6ef616f964a52068d32ce3Restaurant45.7619314.832668
9Pignol Patissier & Restaurant5066b98416482fabcf2082b4Dessert Shop45.7585894.832523
\n", "
" ], "text/plain": [ " name id \\\n", "0 Place des Jacobins 4b61baf8f964a520361f2ae3 \n", "1 Place des Célestins 4b61bb38f964a5203f1f2ae3 \n", "2 Place de la République 4cbfe494021ca1438bf15e0c \n", "3 Slake Coffee House 5602838f498e9111e2522df3 \n", "4 Marché Saint-Antoine 4c304d6a66e40f470f65c38b \n", "5 Mozzato - Comptoir à Mozzarella 526038cd11d2d0efdb9f407f \n", "6 Place Bellecour 4b5e0a3df964a520817a29e3 \n", "7 Théâtre des Célestins 4b8a84caf964a520567032e3 \n", "8 L'Épicerie - Bistrot à Tartines 4b6ef616f964a52068d32ce3 \n", "9 Pignol Patissier & Restaurant 5066b98416482fabcf2082b4 \n", "\n", " categories lat lng \n", "0 Plaza 45.760489 4.833636 \n", "1 Plaza 45.759804 4.831842 \n", "2 Plaza 45.760347 4.835635 \n", "3 Café 45.760922 4.832910 \n", "4 Farmers Market 45.761756 4.831853 \n", "5 Italian Restaurant 45.761697 4.832963 \n", "6 Plaza 45.757523 4.832397 \n", "7 Theater 45.759769 4.831996 \n", "8 Restaurant 45.761931 4.832668 \n", "9 Dessert Shop 45.758589 4.832523 " ] }, "execution_count": 143, "metadata": {}, "output_type": "execute_result" } ], "source": [ "qa_nearby_venues['venue.categories'] = qa_nearby_venues.apply(get_category_type, axis=1)\n", "qa_nearby_venues.columns = [col.split('.')[-1] for col in qa_nearby_venues.columns]\n", "\n", "qa_nearby_venues.head(10)" ] }, { "cell_type": "code", "execution_count": 144, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 65 entries, 0 to 64\n", "Data columns (total 5 columns):\n", "name 65 non-null object\n", "id 65 non-null object\n", "categories 65 non-null object\n", "lat 65 non-null float64\n", "lng 65 non-null float64\n", "dtypes: float64(2), object(3)\n", "memory usage: 2.6+ KB\n" ] } ], "source": [ "qa_nearby_venues.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "65 \"venues\" sont revenus dans les résultats du Rue Gasparin, 69002 Lyon." ] }, { "cell_type": "code", "execution_count": 204, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "execution_count": 204, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "qa_venues_map = folium.Map(location=[qa_lat, qa_lng], zoom_start=16, tiles=tileset, attr=attribution)\n", "\n", "\n", "folium.CircleMarker(\n", " [qa_lat,qa_lng],\n", " radius=10,\n", " color='red',\n", " popup='Rue Gasparin',\n", " fill=True,\n", " fill_color= 'red',\n", " fill_opacity = 0.6\n", ").add_to(qa_venues_map)\n", "\n", "\n", "for lat, lng, label in zip(qa_nearby_venues.lat, qa_nearby_venues.lng, qa_nearby_venues.categories):\n", " folium.CircleMarker(\n", " [lat, lng],\n", " radius = 5,\n", " color='blue',\n", " popup=label,\n", " fill=True,\n", " fill_color='blue',\n", " fill_opacity=0.6\n", " ).add_to(qa_venues_map)\n", " \n", "qa_venues_map" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Explorer le quartier" ] }, { "cell_type": "code", "execution_count": 149, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "37" ] }, "execution_count": 149, "metadata": {}, "output_type": "execute_result" } ], "source": [ "qa_unique = qa_nearby_venues['categories'].unique()\n", "qa_nearby_venues['categories'].nunique()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Rue Gasparin dispose de 39 types de \"venues\" différents." ] }, { "cell_type": "code", "execution_count": 150, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Emplacement en Lyon et Emplacement en Paris: \n", " ['Plaza', 'Café', 'Italian Restaurant', 'Hotel', 'Pub', 'French Restaurant', 'Bar', 'Coffee Shop', 'Seafood Restaurant', 'Ice Cream Shop', 'Historic Site', 'Cupcake Shop', 'Lebanese Restaurant', 'Bookstore', 'Museum', 'Japanese Restaurant', 'Taco Place']\n", "\n", "\n", "Emplacement en Lyon: \n", " ['Farmers Market', 'Theater', 'Restaurant', 'Dessert Shop', 'Bagel Shop', 'Sushi Restaurant', 'Clothing Store', 'Resort', 'Gastropub', 'Donut Shop', 'Burger Joint', 'Theme Park', 'Department Store', 'Road', 'Chocolate Shop', 'Church', 'Beer Bar', 'Comedy Club', 'American Restaurant', 'Tea Room']\n", "\n", "\n", "Emplacement en Paris: \n", " ['Indie Movie Theater', 'Wine Bar', 'Bakery', 'Mexican Restaurant', 'Miscellaneous Shop', 'Pastry Shop', 'Diner', 'Bistro', 'Cheese Shop', 'Trail', 'Pool', 'Basque Restaurant', 'Hobby Shop', 'Portuguese Restaurant', 'Ethiopian Restaurant', 'Liquor Store', 'Wine Shop', 'Tapas Restaurant', 'Park', 'Noodle House', 'Breakfast Spot', 'Creperie', 'Vegetarian / Vegan Restaurant', 'Vietnamese Restaurant', 'Spanish Restaurant', 'Syrian Restaurant', 'Middle Eastern Restaurant']\n" ] } ], "source": [ "qa_wp_same = []\n", "qa_has = []\n", "for x in qa_unique:\n", " if x in wp_unique:\n", " qa_wp_same.append(x)\n", " else:\n", " qa_has.append(x)\n", "print('Emplacement en Lyon et Emplacement en Paris: ', '\\n', qa_wp_same)\n", "print('\\n')\n", "print('Emplacement en Lyon: ', '\\n', qa_has)\n", "\n", "wp_has = []\n", "for x in wp_unique:\n", " if x in qa_unique:\n", " continue\n", " else:\n", " wp_has.append(x)\n", "print('\\n')\n", "print('Emplacement en Paris: ', '\\n', wp_has)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ci-dessus, nous pouvons voir qu'il y a beaucoup plus de types de \"venues\" différents dans le quartier en Paris que dans Lyon. Cela suggère qu'il y a plus de variété à Paris qu'à Lyon." ] }, { "cell_type": "code", "execution_count": 151, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "categories\n", "French Restaurant 7\n", "Plaza 6\n", "Café 5\n", "Hotel 4\n", "Italian Restaurant 3\n", "Clothing Store 2\n", "Bar 2\n", "Sushi Restaurant 2\n", "Burger Joint 2\n", "Resort 2\n", "Name: name, dtype: int64" ] }, "execution_count": 151, "metadata": {}, "output_type": "execute_result" } ], "source": [ "qa_nearby_venues.groupby('categories').count()['name'].sort_values(ascending=False).head(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Les catégories de \"venues\" sont énumérées la plus fréquente à la liste. Nous listons ici le top 10." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Rue Gasparin, 69002 Lyon, tarifs et likes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Jetons un coup d'œil à 15 venues sites et à son prix et likes avoir pour une idée del quartier." ] }, { "cell_type": "code", "execution_count": 152, "metadata": {}, "outputs": [], "source": [ "qa_venue_info = get_venue_info(qa_nearby_venues['id'])" ] }, { "cell_type": "code", "execution_count": 153, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[['Place des Jacobins', 'Not Available', 198],\n", " ['Place des Célestins', 'Not Available', 38],\n", " ['Place de la République', 'Not Available', 127],\n", " ['Slake Coffee House', {'tier': 1, 'message': 'Cheap', 'currency': '€'}, 148],\n", " ['Marché Saint-Antoine', 'Not Available', 77],\n", " ['Mozzato - Comptoir à Mozzarella',\n", " {'tier': 2, 'message': 'Moderate', 'currency': '€'},\n", " 64],\n", " ['Place Bellecour', 'Not Available', 516],\n", " ['Théâtre des Célestins', 'Not Available', 26],\n", " [\"L'Épicerie - Bistrot à Tartines\",\n", " {'tier': 2, 'message': 'Moderate', 'currency': '€'},\n", " 185],\n", " ['Pignol Patissier & Restaurant',\n", " {'tier': 1, 'message': 'Cheap', 'currency': '€'},\n", " 23],\n", " ['Mercure Lyon Centre Beaux-Arts', 'Not Available', 44],\n", " ['Best Bagels Company',\n", " {'tier': 2, 'message': 'Moderate', 'currency': '€'},\n", " 74],\n", " ['MOS - Maker of Stories',\n", " {'tier': 1, 'message': 'Cheap', 'currency': '€'},\n", " 6],\n", " ['Gangnam', {'tier': 2, 'message': 'Moderate', 'currency': '€'}, 10],\n", " ['La Voûte Chez Léa',\n", " {'tier': 3, 'message': 'Expensive', 'currency': '€'},\n", " 7]]" ] }, "execution_count": 153, "metadata": {}, "output_type": "execute_result" } ], "source": [ "qa_venue_info" ] }, { "cell_type": "code", "execution_count": 154, "metadata": {}, "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", "
nameprice_tierlikes
0Place des JacobinsNot Available198
1Place des CélestinsNot Available38
2Place de la RépubliqueNot Available127
3Slake Coffee House{'tier': 1, 'message': 'Cheap', 'currency': '€'}148
4Marché Saint-AntoineNot Available77
5Mozzato - Comptoir à Mozzarella{'tier': 2, 'message': 'Moderate', 'currency':...64
6Place BellecourNot Available516
7Théâtre des CélestinsNot Available26
8L'Épicerie - Bistrot à Tartines{'tier': 2, 'message': 'Moderate', 'currency':...185
9Pignol Patissier & Restaurant{'tier': 1, 'message': 'Cheap', 'currency': '€'}23
10Mercure Lyon Centre Beaux-ArtsNot Available44
11Best Bagels Company{'tier': 2, 'message': 'Moderate', 'currency':...74
12MOS - Maker of Stories{'tier': 1, 'message': 'Cheap', 'currency': '€'}6
13Gangnam{'tier': 2, 'message': 'Moderate', 'currency':...10
14La Voûte Chez Léa{'tier': 3, 'message': 'Expensive', 'currency'...7
\n", "
" ], "text/plain": [ " name \\\n", "0 Place des Jacobins \n", "1 Place des Célestins \n", "2 Place de la République \n", "3 Slake Coffee House \n", "4 Marché Saint-Antoine \n", "5 Mozzato - Comptoir à Mozzarella \n", "6 Place Bellecour \n", "7 Théâtre des Célestins \n", "8 L'Épicerie - Bistrot à Tartines \n", "9 Pignol Patissier & Restaurant \n", "10 Mercure Lyon Centre Beaux-Arts \n", "11 Best Bagels Company \n", "12 MOS - Maker of Stories \n", "13 Gangnam \n", "14 La Voûte Chez Léa \n", "\n", " price_tier likes \n", "0 Not Available 198 \n", "1 Not Available 38 \n", "2 Not Available 127 \n", "3 {'tier': 1, 'message': 'Cheap', 'currency': '€'} 148 \n", "4 Not Available 77 \n", "5 {'tier': 2, 'message': 'Moderate', 'currency':... 64 \n", "6 Not Available 516 \n", "7 Not Available 26 \n", "8 {'tier': 2, 'message': 'Moderate', 'currency':... 185 \n", "9 {'tier': 1, 'message': 'Cheap', 'currency': '€'} 23 \n", "10 Not Available 44 \n", "11 {'tier': 2, 'message': 'Moderate', 'currency':... 74 \n", "12 {'tier': 1, 'message': 'Cheap', 'currency': '€'} 6 \n", "13 {'tier': 2, 'message': 'Moderate', 'currency':... 10 \n", "14 {'tier': 3, 'message': 'Expensive', 'currency'... 7 " ] }, "execution_count": 154, "metadata": {}, "output_type": "execute_result" } ], "source": [ "qa_df = pd.DataFrame(qa_venue_info, columns=['name', 'price_tier', 'likes'])\n", "qa_df " ] }, { "cell_type": "code", "execution_count": 155, "metadata": {}, "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", "
nameprice_tierlikes
6Place BellecourNone516
0Place des JacobinsNone198
8L'Épicerie - Bistrot à TartinesModerate185
3Slake Coffee HouseCheap148
2Place de la RépubliqueNone127
4Marché Saint-AntoineNone77
11Best Bagels CompanyModerate74
5Mozzato - Comptoir à MozzarellaModerate64
10Mercure Lyon Centre Beaux-ArtsNone44
1Place des CélestinsNone38
7Théâtre des CélestinsNone26
9Pignol Patissier & RestaurantCheap23
13GangnamModerate10
14La Voûte Chez LéaExpensive7
12MOS - Maker of StoriesCheap6
\n", "
" ], "text/plain": [ " name price_tier likes\n", "6 Place Bellecour None 516\n", "0 Place des Jacobins None 198\n", "8 L'Épicerie - Bistrot à Tartines Moderate 185\n", "3 Slake Coffee House Cheap 148\n", "2 Place de la République None 127\n", "4 Marché Saint-Antoine None 77\n", "11 Best Bagels Company Moderate 74\n", "5 Mozzato - Comptoir à Mozzarella Moderate 64\n", "10 Mercure Lyon Centre Beaux-Arts None 44\n", "1 Place des Célestins None 38\n", "7 Théâtre des Célestins None 26\n", "9 Pignol Patissier & Restaurant Cheap 23\n", "13 Gangnam Moderate 10\n", "14 La Voûte Chez Léa Expensive 7\n", "12 MOS - Maker of Stories Cheap 6" ] }, "execution_count": 155, "metadata": {}, "output_type": "execute_result" } ], "source": [ "qa_df['price_tier'] = qa_df.apply(get_price_tier, axis=1)\n", "qa_df.sort_values('likes', ascending=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Il semble que ce quartier de Lyon soit plus attractif pour les touristes, cependant il a des locaux plus chers par rapport à Paris" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Importer les données de localisation de Marseille depuis l'API Foursquare" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2 Rue du Chevalier Roze 13002 Marseille, France: 43.2973801 5.3724761\n" ] } ], "source": [ "address = '2 Rue du Chevalier Roze 13002 Marseille, France'\n", "\n", "ch_geolocator = Nominatim(user_agent='foursquare_agent')\n", "ch_location = ch_geolocator.geocode(address)\n", "ch_lat = ch_location.latitude\n", "ch_lng = ch_location.longitude\n", "\n", "print('2 Rue du Chevalier Roze 13002 Marseille, France: ', ch_lat, ch_lng)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "xxxxxx\n" ] } ], "source": [ "ch_url = 'xxxxxx'.format(\n", " CLIENT_ID,\n", " CLIENT_SECRET,\n", " ch_lat,\n", " ch_lng,\n", " VERSION,\n", " radius,\n", " LIMIT\n", " )\n", "\n", "print(ch_url)" ] }, { "cell_type": "code", "execution_count": 192, "metadata": {}, "outputs": [], "source": [ "ch_results = requests.get(ch_url).json()" ] }, { "cell_type": "code", "execution_count": 193, "metadata": {}, "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", "
venue.namevenue.idvenue.categoriesvenue.location.latvenue.location.lng
0La Caravelle4b5b300ef964a520b1e928e3[{'id': '4bf58dd8d48988d116941735', 'name': 'B...43.2965355.372060
1Starbucks (Starbucks Coffee)4bea370a61aca593e7908300[{'id': '4bf58dd8d48988d1e0931735', 'name': 'C...43.2978475.372830
2InterContinental Marseille Hôtel-Dieu50d1943ae4b0fff6c391682b[{'id': '4bf58dd8d48988d1fa931735', 'name': 'H...43.2986615.369779
3Les Buvards4bc57ecfccbcef3b1399e6d2[{'id': '4bf58dd8d48988d123941735', 'name': 'W...43.2977835.371368
4Galeries Lafayette4bbdf9ce078095218635db91[{'id': '4bf58dd8d48988d1f6941735', 'name': 'D...43.2965445.374758
\n", "
" ], "text/plain": [ " venue.name venue.id \\\n", "0 La Caravelle 4b5b300ef964a520b1e928e3 \n", "1 Starbucks (Starbucks Coffee) 4bea370a61aca593e7908300 \n", "2 InterContinental Marseille Hôtel-Dieu 50d1943ae4b0fff6c391682b \n", "3 Les Buvards 4bc57ecfccbcef3b1399e6d2 \n", "4 Galeries Lafayette 4bbdf9ce078095218635db91 \n", "\n", " venue.categories venue.location.lat \\\n", "0 [{'id': '4bf58dd8d48988d116941735', 'name': 'B... 43.296535 \n", "1 [{'id': '4bf58dd8d48988d1e0931735', 'name': 'C... 43.297847 \n", "2 [{'id': '4bf58dd8d48988d1fa931735', 'name': 'H... 43.298661 \n", "3 [{'id': '4bf58dd8d48988d123941735', 'name': 'W... 43.297783 \n", "4 [{'id': '4bf58dd8d48988d1f6941735', 'name': 'D... 43.296544 \n", "\n", " venue.location.lng \n", "0 5.372060 \n", "1 5.372830 \n", "2 5.369779 \n", "3 5.371368 \n", "4 5.374758 " ] }, "execution_count": 193, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ch_venues = ch_results['response']['groups'][0]['items']\n", "\n", "ch_nearby_venues = json_normalize(ch_venues)\n", "\n", "ch_nearby_venues = ch_nearby_venues.loc[:,filtered_columns]\n", "\n", "ch_nearby_venues.head()" ] }, { "cell_type": "code", "execution_count": 194, "metadata": {}, "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", "
nameidcategorieslatlng
0La Caravelle4b5b300ef964a520b1e928e3Bar43.2965355.372060
1Starbucks (Starbucks Coffee)4bea370a61aca593e7908300Coffee Shop43.2978475.372830
2InterContinental Marseille Hôtel-Dieu50d1943ae4b0fff6c391682bHotel43.2986615.369779
3Les Buvards4bc57ecfccbcef3b1399e6d2Wine Bar43.2977835.371368
4Galeries Lafayette4bbdf9ce078095218635db91Department Store43.2965445.374758
5Terrasse de l'InterContinental Marseille Hôtel...51bc60145019f457c9e71423Roof Deck43.2984635.369761
6Capian Bar51ad0479498eafba19f59d33Cocktail Bar43.2983605.369721
7Spa de l'InterContinental Marseille Hôtel-Dieu51bc5f505019f457c9e67182Spa43.2985105.369782
8Hôtel la Résidence du Vieux-Port4bd0b48ba8b3a593b770645fHotel43.2964835.372727
9Vanille Noire53f87ce2498ecc0a79b29359Ice Cream Shop43.2971995.368588
\n", "
" ], "text/plain": [ " name \\\n", "0 La Caravelle \n", "1 Starbucks (Starbucks Coffee) \n", "2 InterContinental Marseille Hôtel-Dieu \n", "3 Les Buvards \n", "4 Galeries Lafayette \n", "5 Terrasse de l'InterContinental Marseille Hôtel... \n", "6 Capian Bar \n", "7 Spa de l'InterContinental Marseille Hôtel-Dieu \n", "8 Hôtel la Résidence du Vieux-Port \n", "9 Vanille Noire \n", "\n", " id categories lat lng \n", "0 4b5b300ef964a520b1e928e3 Bar 43.296535 5.372060 \n", "1 4bea370a61aca593e7908300 Coffee Shop 43.297847 5.372830 \n", "2 50d1943ae4b0fff6c391682b Hotel 43.298661 5.369779 \n", "3 4bc57ecfccbcef3b1399e6d2 Wine Bar 43.297783 5.371368 \n", "4 4bbdf9ce078095218635db91 Department Store 43.296544 5.374758 \n", "5 51bc60145019f457c9e71423 Roof Deck 43.298463 5.369761 \n", "6 51ad0479498eafba19f59d33 Cocktail Bar 43.298360 5.369721 \n", "7 51bc5f505019f457c9e67182 Spa 43.298510 5.369782 \n", "8 4bd0b48ba8b3a593b770645f Hotel 43.296483 5.372727 \n", "9 53f87ce2498ecc0a79b29359 Ice Cream Shop 43.297199 5.368588 " ] }, "execution_count": 194, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ch_nearby_venues['venue.categories'] = ch_nearby_venues.apply(get_category_type,axis = 1)\n", "ch_nearby_venues.columns = [col.split('.')[-1] for col in ch_nearby_venues.columns]\n", "ch_nearby_venues.head(10)" ] }, { "cell_type": "code", "execution_count": 195, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 83 entries, 0 to 82\n", "Data columns (total 5 columns):\n", "name 83 non-null object\n", "id 83 non-null object\n", "categories 83 non-null object\n", "lat 83 non-null float64\n", "lng 83 non-null float64\n", "dtypes: float64(2), object(3)\n", "memory usage: 3.3+ KB\n" ] } ], "source": [ "ch_nearby_venues.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "83 \"venues\" sont revenus dans les résultats du 2 Rue du Chevalier Roze 13002 Marseille." ] }, { "cell_type": "code", "execution_count": 196, "metadata": {}, "outputs": [], "source": [ "ch_nearby_venues_map = ch_nearby_venues[0:10]" ] }, { "cell_type": "code", "execution_count": 205, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "execution_count": 205, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ch_venues_map = folium.Map(location=[ch_lat, ch_lng], zoom_start=17, tiles=tileset, attr=attribution)\n", "\n", "#red marker added for main location\n", "folium.CircleMarker(\n", " [ch_lat,ch_lng],\n", " radius=10,\n", " color='red',\n", " popup='2 Rue du Chevalier Roze 13002 Marseille, France',\n", " fill=True,\n", " fill_color= 'red',\n", " fill_opacity = 0.6\n", ").add_to(ch_venues_map)\n", "\n", "#blue markers for search results\n", "for lat, lng, label in zip(ch_nearby_venues_map.lat, ch_nearby_venues_map.lng, ch_nearby_venues_map.categories):\n", " folium.CircleMarker(\n", " [lat, lng],\n", " radius = 5,\n", " color='blue',\n", " popup=label,\n", " fill=True,\n", " fill_color='blue',\n", " fill_opacity=0.6\n", " ).add_to(ch_venues_map)\n", " \n", "ch_venues_map" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Explorer le quartier" ] }, { "cell_type": "code", "execution_count": 199, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "46" ] }, "execution_count": 199, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ch_unique = ch_nearby_venues['categories'].unique()\n", "ch_nearby_venues['categories'].nunique()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Il y a 46 types uniques de lieux autour du Rue Lulli 13001 Marseille." ] }, { "cell_type": "code", "execution_count": 200, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Emplacement en Marseille et Emplacement en Paris: \n", " ['Bar', 'Coffee Shop', 'Hotel', 'Wine Bar', 'Ice Cream Shop', 'French Restaurant', 'Café', 'Plaza', 'Museum', 'Pub', 'Seafood Restaurant', 'Bistro', 'Italian Restaurant', 'Vegetarian / Vegan Restaurant', 'Bookstore', 'Trail', 'Diner']\n", "\n", "\n", "Emplacement en Marseille: \n", " ['Department Store', 'Roof Deck', 'Cocktail Bar', 'Spa', 'Tea Room', 'Provençal Restaurant', 'Food', 'Lounge', 'Public Art', 'Pizza Place', 'Moroccan Restaurant', 'Garden', 'Candy Store', 'Burger Joint', 'Fish Market', 'History Museum', 'Electronics Store', 'Cosmetics Shop', 'Sandwich Place', 'Sporting Goods Shop', 'Steakhouse', 'Tourist Information Center', 'Fast Food Restaurant', 'Shopping Mall', 'Supermarket', 'Speakeasy', 'Watch Shop', 'Metro Station', 'Convenience Store']\n", "\n", "\n", "Emplacement en Paris: \n", " ['Japanese Restaurant', 'Indie Movie Theater', 'Bakery', 'Mexican Restaurant', 'Miscellaneous Shop', 'Pastry Shop', 'Historic Site', 'Cheese Shop', 'Pool', 'Basque Restaurant', 'Hobby Shop', 'Portuguese Restaurant', 'Ethiopian Restaurant', 'Liquor Store', 'Wine Shop', 'Tapas Restaurant', 'Park', 'Lebanese Restaurant', 'Noodle House', 'Breakfast Spot', 'Creperie', 'Cupcake Shop', 'Vietnamese Restaurant', 'Spanish Restaurant', 'Syrian Restaurant', 'Middle Eastern Restaurant', 'Taco Place']\n" ] } ], "source": [ "ch_wp_same = []\n", "ch_has = []\n", "for x in ch_unique:\n", " if x in wp_unique:\n", " ch_wp_same.append(x)\n", " else:\n", " ch_has.append(x)\n", "print('Emplacement en Marseille et Emplacement en Paris: ', '\\n', ch_wp_same)\n", "print('\\n')\n", "print('Emplacement en Marseille: ', '\\n', ch_has)\n", "\n", "wp_has = []\n", "for x in wp_unique:\n", " if x in ch_unique:\n", " continue\n", " else:\n", " wp_has.append(x)\n", "print('\\n')\n", "print('Emplacement en Paris: ', '\\n', wp_has)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Marseille a similar variété de \"venues\" que Paris." ] }, { "cell_type": "code", "execution_count": 206, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "categories\n", "Hotel 10\n", "French Restaurant 7\n", "Bar 3\n", "Ice Cream Shop 3\n", "Italian Restaurant 3\n", "Moroccan Restaurant 3\n", "Plaza 3\n", "Electronics Store 3\n", "Coffee Shop 3\n", "Seafood Restaurant 3\n", "Name: name, dtype: int64" ] }, "execution_count": 206, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ch_nearby_venues.groupby('categories').count()['name'].sort_values(ascending=False).head(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2 Rue du Chevalier Roze 13002 Marseille, tarifs et likes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Jetons un coup d'œil aux informations sur du quartier" ] }, { "cell_type": "code", "execution_count": 201, "metadata": {}, "outputs": [], "source": [ "ch_venue_info = get_venue_info(ch_nearby_venues['id'])" ] }, { "cell_type": "code", "execution_count": 202, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[['La Caravelle', {'tier': 2, 'message': 'Moderate', 'currency': '€'}, 96],\n", " ['Starbucks (Starbucks Coffee)',\n", " {'tier': 3, 'message': 'Expensive', 'currency': '€'},\n", " 147],\n", " ['InterContinental Marseille Hôtel-Dieu', 'Not Available', 126],\n", " ['Les Buvards', {'tier': 2, 'message': 'Moderate', 'currency': '€'}, 17],\n", " ['Galeries Lafayette', 'Not Available', 101],\n", " [\"Terrasse de l'InterContinental Marseille Hôtel-Dieu\", 'Not Available', 27],\n", " ['Capian Bar', {'tier': 3, 'message': 'Expensive', 'currency': '€'}, 12],\n", " [\"Spa de l'InterContinental Marseille Hôtel-Dieu\", 'Not Available', 12],\n", " ['Hôtel la Résidence du Vieux-Port', 'Not Available', 14],\n", " ['Vanille Noire', {'tier': 1, 'message': 'Cheap', 'currency': '€'}, 21],\n", " ['La Fabrique', {'tier': 3, 'message': 'Expensive', 'currency': '€'}, 20],\n", " ['Cup of Tea', {'tier': 2, 'message': 'Moderate', 'currency': '€'}, 19],\n", " ['Au Cœur du Panier', 'Not Available', 51],\n", " ['Amorino', {'tier': 1, 'message': 'Cheap', 'currency': '€'}, 69],\n", " ['Une Table Au Sud', 'Not Available', 19]]" ] }, "execution_count": 202, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ch_venue_info" ] }, { "cell_type": "code", "execution_count": 203, "metadata": {}, "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", "
nameprice_tierlikes
1Starbucks (Starbucks Coffee)Expensive147
2InterContinental Marseille Hôtel-DieuNone126
4Galeries LafayetteNone101
0La CaravelleModerate96
13AmorinoCheap69
12Au Cœur du PanierNone51
5Terrasse de l'InterContinental Marseille Hôtel...None27
9Vanille NoireCheap21
10La FabriqueExpensive20
11Cup of TeaModerate19
14Une Table Au SudNone19
3Les BuvardsModerate17
8Hôtel la Résidence du Vieux-PortNone14
6Capian BarExpensive12
7Spa de l'InterContinental Marseille Hôtel-DieuNone12
\n", "
" ], "text/plain": [ " name price_tier likes\n", "1 Starbucks (Starbucks Coffee) Expensive 147\n", "2 InterContinental Marseille Hôtel-Dieu None 126\n", "4 Galeries Lafayette None 101\n", "0 La Caravelle Moderate 96\n", "13 Amorino Cheap 69\n", "12 Au Cœur du Panier None 51\n", "5 Terrasse de l'InterContinental Marseille Hôtel... None 27\n", "9 Vanille Noire Cheap 21\n", "10 La Fabrique Expensive 20\n", "11 Cup of Tea Moderate 19\n", "14 Une Table Au Sud None 19\n", "3 Les Buvards Moderate 17\n", "8 Hôtel la Résidence du Vieux-Port None 14\n", "6 Capian Bar Expensive 12\n", "7 Spa de l'InterContinental Marseille Hôtel-Dieu None 12" ] }, "execution_count": 203, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ch_df = pd.DataFrame(ch_venue_info, columns=['name', 'price_tier', 'likes'])\n", "ch_df['price_tier'] = ch_df.apply(get_price_tier, axis=1)\n", "ch_df.sort_values('likes', ascending=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On dirait que Lyon a des restaurants beaucoup plus chers." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Résultats" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Échelle des prix\n", "\n", "Sur la base de l'analyse, il semblerait que Marseille ait une gamme de prix plus proche de Paris que de Lyon. Cependant, en raison du nombre limité d'appels premium par jour, il est possible que les restaurants chers à Lyon aient simplement été manqués. Lyon avait également plus de sites qui n'ont pas de niveau de prix étiqueté, ce qui rend également la comparaison plus difficile. aussi les nouveaux sites (lyon et marseille) ont moins de restaurants que Paris." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Popularity\n", "\n", "Les lieux de Lyon ont beaucoup plus de likes que Paris ou Marseille. Cela signifie que Lyon pourrait être une zone plus fréquentée avec plus de trafic piétonnier. Ou les gens sont très enthousiaste dans ce domaine." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Discussion" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Après l'anaylsis, il semblerait que Lyon soit le meilleur choix pour quelqu'un qui cherche une expérience plus similaire à Paris. C'est un peu plus cher, mais cela fournira également un style de vie divertissant.\n", "\n", "Marseille semble plus calme et tranquille. Ce serait un bon choix pour quelqu'un qui voudrait changer ce qu'il a obtenu à Paris." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Références" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " The Battle of Neighborhoods: Coursera Capstone Project\n", "\n", " Geopy Geocoders\n", "\n", " Foursquare API\n", "\n", " MapBox Location Data Visualization library for Jupyter Notebooks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 👍👍
Partagez vos idées et vos commentaires, écrivez-moi 🌍
##" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "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.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }