Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

Estimativa de efetivo para PMMT nas eleições de 2018

3171 views
Kernel: Python 3 (Ubuntu Linux)
import geopy import numpy as np import math from sklearn.metrics.pairwise import pairwise_distances from sklearn.cluster import DBSCAN from geopy.distance import vincenty import pandas as pd
d_max = 1 # Distância máxima: 1km
def calcula_distancias(locs_1, locs_2): n_linhas_1 = locs_1.shape[0] n_linhas_2 = locs_2.shape[0] dists = np.empty((n_linhas_1, n_linhas_2)) for i in range(n_linhas_1): for j in range(n_linhas_2): dists[i, j] = geopy.distance.vincenty(locs_1[i], locs_2[j]).km return dists
locais = pd.read_excel('Planilha para distribuicao do efetivo.xlsx', sheet_name='dados') locais[:5]
coords = locais[['longitude','latitude']].values matriz_distancias = calcula_distancias(coords, coords)
matriz_distancias.shape
(1478, 1478)
matriz_distancias[:5]
array([[ 0. , 66.18017766, 229.587452 , ..., 1224.13550379, 1224.27558743, 1249.01214879], [ 66.18017766, 0. , 216.50955026, ..., 1161.21112574, 1161.34618197, 1185.53982862], [ 229.587452 , 216.50955026, 0. , ..., 1100.428728 , 1100.61519704, 1130.48952764], [ 283.50213756, 272.28352866, 55.774277 , ..., 1090.93086467, 1091.13030532, 1122.38046158], [ 284.22572745, 272.55321051, 56.07755092, ..., 1088.93159991, 1089.13103518, 1120.38122882]])
grupos_obj = DBSCAN(metric='precomputed', min_samples=d_max, algorithm='auto').fit(matriz_distancias)
grupos = grupos_obj.labels_
n_grupos = len(set(grupos)) - (1 if -1 in grupos else 0) print('Número estimado de grupos: %d' % n_grupos)
Número estimado de grupos: 700
ax1 = locais.plot.scatter(x='latitude', y='longitude', c=grupos, colormap='tab20b')
Image in a Jupyter notebook
locais['GRUPOS'] = grupos
locais[:5]
res1 = pd.ExcelWriter('res1 DBSCAN.xlsx') locais.to_excel(res1,'dados',index=False) res1.save()