Введение:
Бангалор - мегаполис, третий по численности населения город и пятая по численности городская агломерация в Индии. Бангалор иногда называют «Силиконовой долиной Индии» (или «ИТ-столицей Индии») из-за его роли в качестве ведущего национального экспортера информационных технологий (ИТ). Индийские технологические организации ISRO, Infosys, Wipro и HAL расположены в городе. Бангалор - это демографически разнообразный город, второй по темпам роста крупный мегаполис Индии. В Бангалоре одна из самых высокообразованных сотрудников в мире. Он является домом для многих образовательных и исследовательских учреждений, таких как Индийский институт науки (IISc), Индийский институт менеджмента (Бангалор) (IIMB), Международный институт информационных технологий, Бангалор (IIITB), Национальный институт модных технологий, Бангалор. .
Как показано на приведенном выше рисунке, мы можем наблюдать, что население города Бангалор резко увеличивается с каждым годом. Поскольку население увеличивается, это также приводит к росту бизнеса. Будучи развитым городом, он ежедневно привлекает огромное количество инвесторов. Из-за беспощадной конкуренции новым инвесторам будет очень сложно выжить. Чтобы выжить, им необходимо основать свой бизнес в такой области, где конкуренция минимальна или равна нулю, чтобы они могли сосредоточиться на своем бизнесе без какого-либо вмешательства со стороны конкурентов. Итак, чтобы решить эту проблему, мы будем использовать алгоритмы машинного обучения вместе с Foursquare API, чтобы получить подробную информацию о различных квартирах, ресторанах, торговых центрах, кафе в Бангалоре, а также их точную широту и долготу (см. Ниже).
Итак, кому может быть полезна эта работа?
- Инвесторам, которые ищут лучшее место для открытия своего бизнеса с минимальной конкуренцией, нужно понять, кто их конкуренты? и в каком радиусе они проживают. Используя этот проект, они могут найти области, в которых уже существует подобный бизнес, и через предоставленные нами обзоры новые инвесторы могут узнать, чего не хватает его коллегам, что поможет ему улучшить свои позиции в таких областях.
- Население города растет день ото дня, даже поиск новой квартиры также становится тяжелой работой. мы можем помочь им выбрать квартиру в соответствии с их требованиями, выбрав то, что они хотят в своем окружении, мы предоставляем подробную информацию обо всех помещениях, которые находятся вокруг квартиры, таких как рестораны, торговые центры, парки, кафе, зоопарки и т. д.
Как ??
В нашем проекте мы будем помогать предпринимателям, рекомендуя им лучшее место для открытия своего бизнеса, предоставляя основные детали, такие как:
- Есть ли в этой области конкуренты? если да, то как у них дела?
- Используя обзоры, полученные их конкурентами, мы можем предоставить ключевые идеи относительно областей, в которых им нужно больше сосредоточиться на своем бизнесе, чтобы превзойти своих коллег.
- Используя данные, которые у нас были, мы можем спрогнозировать цену на новые квартиры, дав некоторые новые спецификации.
- Технические характеристики здания, такие как площадь здания, место для парковки и т. Д.
- Предоставив подробную информацию об окрестностях, например, человек, который хочет открыть ресторанный дворик, хочет, чтобы его бизнес находился в полностью переполненном районе, где могут проживать многие ИТ-компании, колледжи и т. Д.
- Какие параметры влияют на рост цен?
- На каком расстоянии моя квартира находится от ресторана?
Точно так же мы можем помочь людям, которые переезжают в Бангалор, учитывая, что вы впервые переезжаете в Бангалор. Возможно, вы не знаете Бангалора и не имеете там никаких связей, поэтому вам будет очень трудно там поселиться. Итак, чтобы решить эту проблему, мы будем использовать алгоритмы машинного обучения вместе с Foursquare API, чтобы получить подробную информацию о различных квартирах в Бангалоре, а также их точную широту и долготу (см. Ниже). Теперь, чтобы выбрать лучшую квартиру, нужно учесть следующие факты:
- На каком расстоянии от квартиры находится мой офис?
- Есть ли рестораны поблизости от квартиры ?.
- Есть ли поблизости какое-нибудь кафе?
- Какие параметры влияют на рост цен?
- «Готовы ли они к заселению»? Если нет, когда я могу переехать в квартиру?
- какие квадратные метры в квартире?
- на каком расстоянии я могу найти площадку для бадминтона от моей квартиры?
Идея !!
мы будем использовать Foursquare API для извлечения информации обо всех ресторанах, кафе, парках, отелях и торговых центрах по всему Бангалору. Эти сведения включают расположение зданий, характеристики, отзывы и оценки. Позже мы будем применять методы машинного обучения к извлеченным отзывам, чтобы собрать вышеупомянутую важную информацию. Чтобы собрать подробную информацию о свободных квартирах, я использую свободно доступный набор данных, который содержит подробную информацию обо всех квартирах вокруг города Бангалор вместе с их характеристиками. К этому набору данных я добавил координаты широты и долготы, чтобы упростить построение графика, позже я запустил Foursquare API для этого набора данных, чтобы найти самые известные места вокруг квартир. Чтобы клиенту было проще выбрать более подходящую квартиру, удовлетворяющую его метрикам.
Требования: -
Методология и выполнение: -
Я использовал Python для анализа данных и визуализации данных. Для прогнозирования цены я использовал несколько алгоритмов машинного обучения.
Приступим к кодированию
- Импорт необходимых библиотек:
import os # Operating System import numpy as np import pandas as pd import datetime as dt # Datetime import json # library to handle JSON files #!conda install -c conda-forge geopy --yes from geopy.geocoders import Nominatim # convert an address into latitude and longitude values import requests # library to handle requests from pandas.io.json import json_normalize # tranform JSON file into a pandas dataframe # Matplotlib and associated plotting modules import matplotlib.cm as cm import matplotlib.colors as colors #!conda install -c conda-forge folium=0.5.0 --yes import folium #import folium # map rendering library
- Чтение Dataset:
# Reading The DataSet df_bglr=pd.read_csv("Bengaluru_House_Data.csv") df_bglr.head()
- В fig1 нет значений широты и долготы для квартир. Чтобы извлечь детали ресторанов и торговых центров рядом с квартирами, нам нужно их точное местоположение, для этого нам нужны значения широты и долготы. Теперь мы добавим два пустых столбца - широту и долготу к вышеуказанному набору данных.
# Adding Latitude and logitude columns for our later use df_bglr["latitude"]=np.NaN df_bglr["longitude"]=np.NaN for i in range(0,13320): df_bglr["latitude"]="a" df_bglr["longitude"]="a"
- Теперь, чтобы извлечь подробную информацию о широте и долготе, мы будем использовать службу геолокации под названием Nominatim, которая имеет свой класс геокодеры. Пример: - давайте получим широту и долготу Бангалора.
from geopy.geocoders import Nominatim address = 'Bangalore, KA' geolocator = Nominatim(user_agent="bg_explorer") location = geolocator.geocode(address) latitude = location.latitude longitude = location.longitude print('The geograpical coordinate of Bangalore City are {}, {}.'.format(latitude, longitude))
Вывод: - «Географические координаты города Бангалор: 12.9791198, 77.5912997.»
- Мы повторим аналогичную задачу, описанную выше, и соберем детали всех широт и долгот для всех квартир.
df_bglr_tail_venues=df_bglr["location"] df_bglr_tail_venues=df_bglr_tail_venues.unique() #extracting only the unique locations #print(len(df_bglr_venues)) j=0 for i in df_bglr_tail_venues: #Updating the values of latitude and longitudes by iterating over the dataset address_venue=i print(i) geolocator = Nominatim(user_agent="bg_explorer") location = geolocator.geocode(address_venue,timeout=10000) if location !=None: #Taking only values without null location values #Foursquare May not find the location for all locations so we are removing such undefined locations print(location.latitude) df_bglr.at[j,"latitude"] = location.latitude df_bglr.at[j,"longitude"]= location.longitude j=j+1
- Вот набор данных после обновления столбца широты и долготы:
- Очистка данных:
- Как показано на рис. 4, в столбце «total_sqft» есть некоторые нечисловые значения, мы должны удалить их, иначе мы получим ошибки при интерпретации нечисловых значений во время визуализации данных.
df_bglr=df_bglr[df_bglr.total_sqft.apply(lambda x: x.isnumeric())]
2. Foursquare может не находить значения широты и долготы для некоторых местоположений, поэтому мы удаляем такие неопределенные местоположения.
df_bglr=df_bglr[df_bglr.latitude !='a']
3. Удаление всех значений NaN.
df_bglr.dropna(inplace=True)
— — — — — — —
- Визуализация данных:
Теперь мы увидим некоторые визуализации наших данных, построив графики и проанализировав отношения между различными атрибутами.
- Area_type против цены
import seaborn as sns import matplotlib.pyplot as plt plts = pd.read_csv('df_bglr.csv') sns.catplot(x="area_type", y="price", data=plts);
sns.barplot(x="area_type", y="price", data=tips);
Из рис5 видно, что в « сверхзастроенной зоне » больше квартир в этом ценовом диапазоне (0–150) по сравнению с другие типы площадей.
2. Размер квартиры в сравнении с ценой
sns.catplot(x="size", y="price", data=tips);
sns.boxplot(x="size", y="price", data=tips);
sns.barplot(x="size", y="price", data=tips);
Итак, если вы посмотрите на рис.9, для 5BHK неясно, сколько там квартир, поэтому если вы посмотрите на рис. 8 или 7, то ясно увидите, что доступна только одна квартира 5BHK. Поэтому не рекомендуется использовать только одну технику визуализации, мы должны применять все доступные техники визуализации.
— — — — — —
Давайте погрузимся в наш основной проект
Изучение окрестностей вокруг квартир
- Расположение квартир на карте Бангалора:
Мы будем использовать Folium для отображения наших квартир. folium является частью библиотеки leaflet.js и позволяет нам визуализировать данные.
# create map of New York using latitude and longitude values map_bnglr = folium.Map(location=[latitude, longitude], zoom_start=10) # add markers to map for lat, lng, borough, neighborhood in zip(df_bglr_155['latitude'], df_bglr_155['longitude'], df_bglr_155['society'], df_bglr_155['location']): label = '{}, {}'.format(neighborhood, borough) label = folium.Popup(label, parse_html=True) folium.CircleMarker( [lat, lng], radius=5, popup=label, color='blue', fill=True, fill_color='#3186cc', fill_opacity=0.7, parse_html=False).add_to(map_bnglr) map_bnglr
2. Выделение площадок вокруг квартир:
мы будем использовать Foursquare API для извлечения информации о местах проведения мероприятий в каждой квартире. Foursquare - это локальное приложение для поиска и обнаружения. Это дает персональные рекомендации, куда можно пойти рядом с пользователем.
Чтобы получить подробную информацию о площадках в указанном месте, вам необходимо зарегистрироваться в качестве разработчика на портале Foursquare. Чтобы зарегистрироваться, выполните следующие действия:
- Посетите веб-сайт Foursquare. : Https://foursquare.com/
- Нажмите кнопку Ресурсы в верхнем левом углу, после чего появится раскрывающийся список вариантов, нажмите Портал разработчика, и вы будете перенаправлены на страницу регистрации. Теперь создайте учетную запись.
- Выбрав уровень учетной записи Sandbox, он будет иметь следующие характеристики, которые достаточны для наших текущих требований.
- 950 обычных звонков в день
- 50 премиальных звонков в день
- 1 фото на объект
- 1 совет на заведение
4. После создания учетной записи для входа на портал и создания нового приложения вы получите новый идентификатор клиента и секрет клиента.
- Теперь скопируйте свой ИДЕНТИФИКАТОР КЛИЕНТА и СЕКРЕТ КЛИЕНТА и сохраните их в переменных, как показано ниже:
CLIENT_ID = 'paste your client ID here, under the Apostrophe' # your Foursquare ID CLIENT_SECRET = 'paste your client secret here, under the Apostrophe' # your Foursquare Secret VERSION = '20180605' # Foursquare API version
- Теперь давайте протестируем наш Foursquare API -
мы найдем места поблизости от « Electronic City Phase II » с помощью нашего API.
neighborhood_latitude = df_bglr_155.loc[0, 'latitude'] # neighborhood latitude value for "electroniccityphaseII" neighborhood_longitude = df_bglr_155.loc[0, 'longitude'] # neighborhood longitude value for "electroniccityphaseII" neighborhood_name = df_bglr_155.loc[0, 'location'] # neighborhood name print('Latitude and longitude values of {} are {}, {}.'.format(neighborhood_name, neighborhood_latitude, neighborhood_longitude))
output: Значения широты и долготы для Electronic City Phase II: 12,8468545, 77,6769267.
Теперь давайте найдем лучшие 6 заведений, которые находятся в районе «фазы II электронного города».
LIMIT = 6# limit of number of venues returned by Foursquare API radius = 500 # define radius url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format( CLIENT_ID, CLIENT_SECRET, VERSION, neighborhood_latitude, neighborhood_longitude, radius, LIMIT) url
мы создадим файл JSON и сохраним в нем 50 лучших заведений.
results = requests.get(url).json() results
Выход:
{'meta': {'code': 200, 'requestId': '5e818d6e98205d001b5b9702'}, 'response': {'suggestedFilters': {'header': 'Tap to show:', 'filters': [{'name': 'Open now', 'key': 'openNow'}]}, 'headerLocation': 'Current map view', 'headerFullLocation': 'Current map view', 'headerLocationGranularity': 'unknown', 'totalResults': 6, 'suggestedBounds': {'ne': {'lat': 12.851354504500003, 'lng': 77.68153362366434}, 'sw': {'lat': 12.842354495499995, 'lng': 77.67231977633566}}, 'groups': [{'type': 'Recommended Places', 'name': 'recommended', 'items': [{'reasons': {'count': 0, 'items': [{'summary': 'This spot is popular', 'type': 'general', 'reasonName': 'globalInteractionReason'}]}, 'venue': {'id': '4e0855c8b61c60b0454a7cbb', 'name': 'TCS Think Campus', 'location': {'address': '#42, Electronic City', 'crossStreet': 'Phase II', 'lat': 12.847598224906433, 'lng': 77.6791380938702, 'labeledLatLngs': [{'label': 'display', 'lat': 12.847598224906433, 'lng': 77.6791380938702}], 'distance': 253, 'postalCode': '560100', 'cc': 'IN', 'city': 'Bangalore', 'state': 'Karnātaka', 'country': 'India', 'formattedAddress': ['#42, Electronic City (Phase II)', 'Bangalore 560100', 'Karnātaka', 'India']}, 'categories': [{'id': '4bf58dd8d48988d174941735', 'name': 'Coworking Space', 'pluralName': 'Coworking Spaces', 'shortName': 'Coworking Space', 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/building/office_coworkingspace_', 'suffix': '.png'}, 'primary': True}], 'photos': {'count': 0, 'groups': []}}, 'referralId': 'e-0-4e0855c8b61c60b0454a7cbb-0'}, {'reasons': {'count': 0, 'items': [{'summary': 'This spot is popular', 'type': 'general', 'reasonName': 'globalInteractionReason'}]}, 'venue': {'id': '4eebe42077c82b92f636bb4f', 'name': 'TCS Think Campus Ground', 'location': {'address': 'Electronic city', 'lat': 12.848343641377438, 'lng': 77.67926678752525, 'labeledLatLngs': [{'label': 'display', 'lat': 12.848343641377438, 'lng': 77.67926678752525}], 'distance': 303, 'postalCode': '560100', 'cc': 'IN', 'city': 'Bangalore', 'state': 'Karnātaka', 'country': 'India', 'formattedAddress': ['Electronic city', 'Bangalore 560100', 'Karnātaka', 'India']}, 'categories': [{'id': '4bf58dd8d48988d1e1941735', 'name': 'Basketball Court', 'pluralName': 'Basketball Courts', 'shortName': 'Basketball Court', 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/parks_outdoors/basketballcourt_', 'suffix': '.png'}, 'primary': True}], 'photos': {'count': 0, 'groups': []}}, 'referralId': 'e-0-4eebe42077c82b92f636bb4f-1'}, {'reasons': {'count': 0, 'items': [{'summary': 'This spot is popular', 'type': 'general', 'reasonName': 'globalInteractionReason'}]}, 'venue': {'id': '50fe76dde4b06b7ff49c608c', 'name': 'Coffee Day Xpress', 'location': {'address': '42, Think Campus- TCS,', 'crossStreet': 'Electronic City, Phase 2,', 'lat': 12.848826839267772, 'lng': 77.67894642513268, 'labeledLatLngs': [{'label': 'display', 'lat': 12.848826839267772, 'lng': 77.67894642513268}], 'distance': 310, 'postalCode': '560010', 'cc': 'IN', 'city': 'Bangalore', 'state': 'Karnātaka', 'country': 'India', 'formattedAddress': ['42, Think Campus- TCS, (Electronic City, Phase 2,)', 'Bangalore 560010', 'Karnātaka', 'India']}, 'categories': [{'id': '4bf58dd8d48988d16d941735', 'name': 'Café', 'pluralName': 'Cafés', 'shortName': 'Café', 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/cafe_', 'suffix': '.png'}, 'primary': True}], 'photos': {'count': 0, 'groups': []}}, 'referralId': 'e-0-50fe76dde4b06b7ff49c608c-2'}, {'reasons': {'count': 0, 'items': [{'summary': 'This spot is popular', 'type': 'general', 'reasonName': 'globalInteractionReason'}]}, 'venue': {'id': '50fe5c8fe4b0d36cb9d9913d', 'name': 'Mint-The Kitchen, Think Campus.', 'location': {'address': '42, Think Campus-TCS', 'crossStreet': 'Electronic City, Phase 2', 'lat': 12.848941327230767, 'lng': 77.6789602817386, 'labeledLatLngs': [{'label': 'display', 'lat': 12.848941327230767, 'lng': 77.6789602817386}], 'distance': 320, 'postalCode': '560010', 'cc': 'IN', 'city': 'Bangalore', 'state': 'Karnātaka', 'country': 'India', 'formattedAddress': ['42, Think Campus-TCS (Electronic City, Phase 2)', 'Bangalore 560010', 'Karnātaka', 'India']}, 'categories': [{'id': '4bf58dd8d48988d1d3941735', 'name': 'Vegetarian / Vegan Restaurant', 'pluralName': 'Vegetarian / Vegan Restaurants', 'shortName': 'Vegetarian / Vegan', 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/vegetarian_', 'suffix': '.png'}, 'primary': True}], 'photos': {'count': 0, 'groups': []}}, 'referralId': 'e-0-50fe5c8fe4b0d36cb9d9913d-3'}, {'reasons': {'count': 0, 'items': [{'summary': 'This spot is popular', 'type': 'general', 'reasonName': 'globalInteractionReason'}]}, 'venue': {'id': '52fe2d9211d2c8e9f718d193', 'name': 'Foodies Express', 'location': {'address': 'Electronics City Phase 2', 'lat': 12.847622629612248, 'lng': 77.68072608901532, 'labeledLatLngs': [{'label': 'display', 'lat': 12.847622629612248, 'lng': 77.68072608901532}], 'distance': 421, 'postalCode': '560100', 'cc': 'IN', 'city': 'Bangalore', 'state': 'Karnātaka', 'country': 'India', 'formattedAddress': ['Electronics City Phase 2', 'Bangalore 560100', 'Karnātaka', 'India']}, 'categories': [{'id': '4bf58dd8d48988d147941735', 'name': 'Diner', 'pluralName': 'Diners', 'shortName': 'Diner', 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/diner_', 'suffix': '.png'}, 'primary': True}], 'photos': {'count': 0, 'groups': []}}, 'referralId': 'e-0-52fe2d9211d2c8e9f718d193-4'}, {'reasons': {'count': 0, 'items': [{'summary': 'This spot is popular', 'type': 'general', 'reasonName': 'globalInteractionReason'}]}, 'venue': {'id': '4d9d82c0c97a236a82a2be99', 'name': 'Aastha', 'location': {'address': '108 Gokul Complex', 'crossStreet': 'Nr. TCS, Electronic City', 'lat': 12.849795443905391, 'lng': 77.6793909072876, 'labeledLatLngs': [{'label': 'display', 'lat': 12.849795443905391, 'lng': 77.6793909072876}], 'distance': 422, 'cc': 'IN', 'city': 'Bangalore', 'state': 'Karnātaka', 'country': 'India', 'formattedAddress': ['108 Gokul Complex (Nr. TCS, Electronic City)', 'Bangalore', 'Karnātaka', 'India']}, 'categories': [{'id': '4bf58dd8d48988d10f941735', 'name': 'Indian Restaurant', 'pluralName': 'Indian Restaurants', 'shortName': 'Indian', 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/indian_', 'suffix': '.png'}, 'primary': True}], 'photos': {'count': 0, 'groups': []}}, 'referralId': 'e-0-4d9d82c0c97a236a82a2be99-5'}]}]}}
В выходных данных выше вы можете увидеть выделенные места. Теперь извлечем подробную статистику по каждой площадке:
# function that extracts the category of the venue def get_category_type(row): try: categories_list = row['categories'] except: categories_list = row['venue.categories'] if len(categories_list) == 0: return None else: return categories_list[0]['name']
—
venues = results['response']['groups'][0]['items'] nearby_venues = json_normalize(venues) # flatten JSON # filter columns filtered_columns = ['venue.name', 'venue.categories', 'venue.location.lat', 'venue.location.lng'] nearby_venues =nearby_venues.loc[:, filtered_columns] # filter the category for each row nearby_venues['venue.categories'] = nearby_venues.apply(get_category_type, axis=1) # clean columns nearby_venues.columns = [col.split(".")[-1] for col in nearby_venues.columns]
Теперь мы повторим ту же процедуру для всех местоположений квартир и сохраним все лучшие места в файле CSV для дальнейшего анализа.
def getNearbyVenues(names, latitudes, longitudes, radius=500): venues_list=[] for name, lat, lng in zip(names, latitudes, longitudes): print(name) # create the API request URL url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format( CLIENT_ID, CLIENT_SECRET, VERSION, lat, lng, radius, LIMIT) # make the GET request results = requests.get(url).json()["response"]['groups'][0]['items'] # return only relevant information for each nearby venue venues_list.append([( name, lat, lng, v['venue']['name'], v['venue']['location']['lat'], v['venue']['location']['lng'], v['venue']['categories'][0]['name']) for v in results]) nearby_venues = pd.DataFrame([item for venue_list in venues_list for item in venue_list]) nearby_venues.columns = ['Neighborhood', 'Neighborhood Latitude', 'Neighborhood Longitude', 'Venue', 'Venue Latitude', 'Venue Longitude', 'Venue Category'] return(nearby_venues)
— —
banglore_venues = getNearbyVenues(names=df_bglr_155['location'], latitudes=df_bglr_155['latitude'], longitudes=df_bglr_155['longitude']) banglore_venues.to_csv("banglore_venues.csv") banglore_venues
Мы отфильтруем все уникальные категории мест, присутствующие в наборе данных.
banglore_venues['Venue Category'].unique()
Теперь мы применим горячую кодировку к нашим «banglore_venue», чтобы получить подробное представление о категориях мест проведения мероприятий.
# one hot encoding banglore_onehot = pd.get_dummies(banglore_venues[['Venue Category']], prefix="", prefix_sep="") # add neighborhood column back to dataframe banglore_onehot['Neighborhood'] = banglore_venues['Neighborhood'] # move neighborhood column to the first column fixed_columns = [banglore_onehot.columns[-1]] + list(banglore_onehot.columns[:-1]) banglore_onehot = banglore_onehot[fixed_columns] banglore_onehot.head()
banglore_grouped = banglore_onehot.groupby('Neighborhood').mean().reset_index() banglore_grouped
- Теперь выделим 10 самых посещаемых и высоко оцененных заведений возле каждой квартиры.
num_top_venues = 10 for hood in banglore_grouped['Neighborhood']: print("----"+hood+"----") temp = banglore_grouped[banglore_grouped['Neighborhood'] == hood].T.reset_index() temp.columns = ['venue','freq'] temp = temp.iloc[1:] temp['freq'] = temp['freq'].astype(float) temp = temp.round({'freq': 2}) print(temp.sort_values('freq', ascending=False).reset_index(drop=True).head(num_top_venues)) print('\n')
- наша следующая задача - скопировать вышеперечисленные площадки в более понятный формат CSV для лучшей наглядности.
def return_most_common_venues(row, num_top_venues): row_categories = row.iloc[1:] row_categories_sorted = row_categories.sort_values(ascending=False) return row_categories_sorted.index.values[0:num_top_venues] --------- num_top_venues = 10 indicators = ['st', 'nd', 'rd'] # create columns according to number of top venues columns = ['Neighborhood'] for ind in np.arange(num_top_venues): try: columns.append('{}{} Most Common Venue'.format(ind+1, indicators[ind])) except: columns.append('{}th Most Common Venue'.format(ind+1)) # create a new dataframe neighborhoods_venues_sorted = pd.DataFrame(columns=columns) neighborhoods_venues_sorted['Neighborhood'] = banglore_grouped['Neighborhood'] for ind in np.arange(banglore_grouped.shape[0]): neighborhoods_venues_sorted.iloc[ind, 1:] = return_most_common_venues(banglore_grouped.iloc[ind, :], num_top_venues) neighborhoods_venues_sorted.head()
neighborhoods_venues_sorted['Neighborhood Latitude'] = banglore_venues['Neighborhood Latitude'].astype(float) neighborhoods_venues_sorted['Neighborhood Longitude'] = banglore_venues['Neighborhood Longitude'].astype(float) neighborhoods_venues_sorted['1st Most Common Venue'].value_counts()
Кластеризация площадок
используя кластеризацию Kmeans, мы будем формировать кластеры на основе конкретных требований -
from sklearn.cluster import KMeans # set number of clusters kclusters = 10 banglore_grouped_clustering = banglore_grouped.drop('Neighborhood', 1) # run k-means clustering kmeans = KMeans(n_clusters=kclusters, random_state=42).fit(banglore_grouped_clustering) # check cluster labels generated for each row in the dataframe kmeans.labels_[0:11]
# add clustering labels neighborhoods_venues_sorted.insert(0, 'Cluster Labels', kmeans.labels_) banglore_merged = df_bglr # merge toronto_grouped with toronto_data to add latitude/longitude for each neighborhood banglore_merged = banglore_merged.join(neighborhoods_venues_sorted.set_index('Neighborhood'), on='location') banglore_merged.drop(banglore_merged.loc[banglore_merged['1st Most Common Venue']==np.NaN].index, inplace=True) banglore_merged = banglore_merged.dropna()
- Наша следующая задача - нанести на карту кластеры с помощью фолиума:
# create map map_clusters = folium.Map(location=[latitude, longitude], zoom_start=11) # set color scheme for the clusters x = np.arange(kclusters) ys = [i + x + (i*x)**2 for i in range(kclusters)] colors_array = cm.rainbow(np.linspace(0, 1, len(ys))) rainbow = [colors.rgb2hex(i) for i in colors_array] # add markers to the map markers_colors = [] for lat, lon, poi, cluster in zip(banglore_merged_final['latitude'], banglore_merged_final['longitude'], banglore_merged_final['location'], banglore_merged_final['Cluster Labels']): label = folium.Popup(str(poi) + ' Cluster ' + str(cluster), parse_html=True) folium.CircleMarker( [lat, lon], radius=5, popup=label, color=rainbow[int(cluster)-1], fill=True, fill_color=rainbow[int(cluster)-1], fill_opacity=0.7).add_to(map_clusters) map_clusters
Давайте погрузимся в наш Основной проект, Ура !!
Задание 1:
Помогая предпринимателям, рекомендуя им лучшее место для открытия своего бизнеса, предоставляя основные детали.
Вопрос 1: где вы можете открыть новый «ресторан» с минимальной конкуренцией и доступным для дальнейшего продвижения?
мы возьмем набор данных banglore_merged и отфильтруем области, поблизости от которых нет ресторанов. Теперь, когда у нас есть окончательный набор данных, нашим следующим шагом будет выбор других характеристик, таких как: «Готова ли территория к переезду?», «Цена на площадь», «Есть ли ИТ-центры рядом с рестораном?» И т. Д.,
Шаг 1:. Фильтруя области, в которых нет ресторанов в их местности. Для этого мы выберем области, в которых нет ресторанов, центров быстрого питания или кафе. их 1-й, 2-й или 3-й список самых посещаемых мест. Таким образом мы можем выделить районы, поблизости от которых нет хорошего ресторана.
best_places_for_restaurant = banglore_merged[(~banglore_merged["1st Most Common Venue"].str.contains('Restaurant'))&(~banglore_merged["2nd Most Common Venue"].str.contains('Restaurant'))&(~banglore_merged["3rd Most Common Venue"].str.contains('Restaurant'))&(~banglore_merged["1st Most Common Venue"].str.contains('Food'))&(~banglore_merged["2nd Most Common Venue"].str.contains('Food'))&(~banglore_merged["3rd Most Common Venue"].str.contains('Food'))&(~banglore_merged["1st Most Common Venue"].str.contains('Pizza'))&(~banglore_merged["2nd Most Common Venue"].str.contains('Pizza'))&(~banglore_merged["3rd Most Common Venue"].str.contains('Pizza'))]
Шаг 2:. Теперь наш следующий приоритет - применить дополнительные фильтры, такие как: «Готова ли территория к переезду?», «Цена площади», «Есть ли ИТ-центры. возле ресторана? »и т. д.,
Например, предположим, что наш клиент хочет открыть свой ресторан прямо сейчас, поэтому он будет искать зону, которая «готова к переезду», поэтому мы должны отфильтровать зоны которые готовы к переезду.
best_places_for_restaurant=best_places_for_restaurant.loc[best_places_for_restaurant['availability'] == 'Ready To Move']
Мы упростим выбор, рассортируя области по цене.
best_places_for_restaurant=best_places_for_restaurant.sort_values("price")
Посмотрим на результат:
pd.set_option('display.max_columns', None) best_places_for_restaurant
У нашего клиента есть 11 лучших мест для своего ресторана, кроме того, он может применить другие фильтры и выбрать лучшее место для открытия своего ресторана.
- Построение отфильтрованных областей для лучшей визуализации.
# create map of New York using latitude and longitude values map_bnglr = folium.Map(location=[latitude, longitude], zoom_start=10) # add markers to map for lat, lng, borough, neighborhood in zip(best_places_for_restaurant['latitude'], best_places_for_restaurant['longitude'], best_places_for_restaurant['society'], best_places_for_restaurant['location']): label = '{}, {}'.format(neighborhood, borough) label = folium.Popup(label, parse_html=True) folium.CircleMarker( [lat, lng], radius=5, popup=label, color='red', fill=True, fill_color='#3186cc', fill_opacity=0.7, parse_html=False).add_to(map_bnglr) map_bnglr
Вопрос 2. Как лучше всего создать площадку для бадминтона с минимальной конкуренцией, окруженную хорошими фуд-кортами?
мы возьмем набор данных banglore_merged и отфильтруем области, поблизости от которых нет кортов для бадминтона, и наша следующая задача - выбрать район с ресторанным двориком по соседству.
Шаг 1: Фильтрация областей, где нет площадок для бадминтона в их местности. Для этого мы выберем области, в которых нет «площадок для бадминтона» в их 1-м, 2-м или 3-м месте. Список наиболее часто посещаемых мест.
best_places_for_badminton_court = banglore_merged[(~banglore_merged["1st Most Common Venue"].str.contains('Badminton Court'))&(~banglore_merged["2nd Most Common Venue"].str.contains('Badminton Court'))&(~banglore_merged["3rd Most Common Venue"].str.contains('Badminton Court'))&((banglore_merged["1st Most Common Venue"].str.contains('Restaurant'))|(banglore_merged["1st Most Common Venue"].str.contains('Food'))|(banglore_merged["1st Most Common Venue"].str.contains('Pizza')))]
Шаг 2: Теперь наша следующая приоритетная задача - применить дополнительные фильтры, такие как: «Готова ли территория к перемещению?», «Цена площади» и т. д.,
Например, предположим, что наш клиент хочет открыть свой ресторан прямо сейчас, поэтому он будет искать зону, которая «готова к переезду», поэтому мы должны отфильтровать зоны которые готовы к переезду.
best_places_for_badminton_court=best_places_for_badminton_court.loc[best_places_for_badminton_court['availability'] == 'Ready To Move'] best_places_for_badminton_court=best_places_for_badminton_court.sort_values("price") best_places_for_badminton_court
best_places_for_badminton_court.shape (55, 25)
У нашего клиента есть 55 лучших мест для своего ресторана, кроме того, он может применить другие фильтры и выбрать лучшее место для открытия своего ресторана.
- Построение отфильтрованных областей для лучшей визуализации.
Задача 2:
Помощь людям, которые ищут лучшую квартиру для переезда, исходя из интересов своего района.
Вопрос 1: я хочу, чтобы моя квартира была рядом с автобусной остановкой, так где мне арендовать?
мы возьмем набор данных banglore_merged и отфильтруем области, в которых есть автобусная станция.
Шаг 1:. Фильтрация областей с автовокзалом в их местности. Для этого мы должны выбрать области, в которых есть «автобусные станции». в их 1-м, 2-м или 3-м списке самых посещаемых мест.
placenearestto_bustand = banglore_merged[(banglore_merged["1st Most Common Venue"]=="Bus Station")|(banglore_merged["2nd Most Common Venue"]=="Bus Station")|(banglore_merged["3rd Most Common Venue"]=="Bus Station")]
Шаг 2: Теперь наша следующая приоритетная задача - применить дополнительные фильтры, такие как: «Готова ли территория к перемещению?», «Цена площади» и т. д.,
Например, предположим, что наш клиент хочет открыть свой ресторан прямо сейчас, поэтому он будет искать зону, которая «готова к переезду», поэтому мы должны отфильтровать зоны которые готовы к переезду.
placenearestto_bustand=placenearestto_bustand.loc[placenearestto_bustand['availability'] == 'Ready To Move'] placenearestto_bustand=placenearestto_bustand.sort_values("price") placenearestto_bustand placenearestto_bustand
Всего 4 квартиры удовлетворяют требованиям клиента.
- Построение отфильтрованных областей для лучшей визуализации.
Запрос 2: наш клиент хочет построить свое тело, как скала !!, поэтому он хочет, чтобы его квартира была очень близко к спортзалу, а также ему нужна квартира 2BHK
мы возьмем набор данных banglore_merged и отфильтруем апартаменты 2BHK, поблизости от которых есть тренажерный зал.
Шаг 1: Фильтрация областей с тренажерным залом в их местности. Для этого мы должны выбрать области, в которых есть «тренажерный зал». 1-й, 2-й или 3-й список часто посещаемых мест.
best_places_for_apartment_gym = banglore_merged[(banglore_merged["1st Most Common Venue"].str.contains('Gym'))|(banglore_merged["2nd Most Common Venue"].str.contains('Gym'))|(banglore_merged["3rd Most Common Venue"].str.contains('Gym'))]
Теперь отфильтруем квартиры стоимостью 2 BHK:
best_places_for_apartment_gym[best_places_for_apartment_gym['size']=='2 BHK']
у нашего клиента был только один вариант на выбор.
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -
Вот и все. Поздравляем, мы помогли одним из наших клиентов наладить хороший бизнес, а другим - выбрать квартиру по своему выбору.