tutta colpa di Alberto Cottica con questo post
ehm ... un pdf con i dati a dicembre 2018
con dentro questa immagine
da cui ho creato questo dataset usando tabula selezionando la sola tabella alla pagina 95
Inoltre, il Comune di Trento, offre lo shapefile con le circoscrizioni
il procedimento è il seguente:
.. il tutto usando geopandas&c
In [49]:
%matplotlib inline
import pandas as pd
import geopandas as gpd
stranieri_x_circoscrizione = pd.read_csv('trento_stranieri_circoscrizioni_2018.csv')
geo_circoscrizioni = gpd.read_file('http://webapps.comune.trento.it/cartografia/gis/dbexport?db=base&sc=confini&ly=circoscrizioni&fr=shp')
In [50]:
stranieri_x_circoscrizione
Out[50]:
In [40]:
geo_circoscrizioni
Out[40]:
rimuovo la colonna europa perchè ridondante
In [115]:
stranieri_x_circoscrizione=stranieri_x_circoscrizione.drop(columns=['europa'])
In [179]:
delrow = stranieri_x_circoscrizione[stranieri_x_circoscrizione.Circoscrizione=='Senza fissa dimora'].index[0]
stranieri_x_circoscrizione= stranieri_x_circoscrizione.drop(stranieri_x_circoscrizione.index[delrow])
In [180]:
geo_circoscrizioni.plot()
Out[180]:
In [181]:
import random
from shapely.geometry import Polygon, Point
def get_random_point_in_polygon(poly,total,district,kind,init_crs):
points = {}
xs = []
ys = []
minx, miny, maxx, maxy = poly.bounds
for i in range(total):
p = Point(random.uniform(minx, maxx), random.uniform(miny, maxy))
if poly.contains(p):
xs.append(p.x)
ys.append(p.y)
points['x']= xs
points['y']= ys
df = pd.DataFrame(points)
df['district']=district
df['kind']=kind
df = gpd.GeoDataFrame(
df.drop(['x', 'y'], axis=1),
crs=init_crs,
geometry=[Point(xy) for xy in zip(df.x, df.y)])
return df
In [192]:
data = []
for index,row in stranieri_x_circoscrizione.iterrows():
circoscrizione = row.Circoscrizione.upper().replace("S. ","S.").replace("O-P","O P")
polygon = geo_circoscrizioni[geo_circoscrizioni.nome==circoscrizione].geometry.values[0]
for col in stranieri_x_circoscrizione.columns:
if col != 'Circoscrizione':
points = get_random_point_in_polygon(polygon,row[col],circoscrizione,col,geo_circoscrizioni.crs)
data.append(points)
one_person_one_dot = pd.concat(data)
In [271]:
ax = geo_circoscrizioni.plot(facecolor='#eeeeee',edgecolor='#eeeeee',color='#2a2a2a', figsize=(20, 20),alpha=0.5)
ax.set_title('Trento - presenza stranieri per circoscrizioni al 2018',fontsize=14)
one_person_one_dot.plot(ax=ax,markersize=10,column='kind', cmap='Spectral',legend=True)
Out[271]:
In [257]:
ax = geo_circoscrizioni.plot(facecolor='#eeeeee',edgecolor='#eeeeee',color='#2a2a2a', figsize=(20, 20),alpha=0.5)
add_basemap(ax, zoom=11, url=ctx.sources.ST_TONER_LITE)
one_person_one_dot.plot(ax=ax,markersize=10,column='kind', cmap='Spectral',legend=True)
ax.set_axis_off()
In [272]:
one_person_one_dot.to_file('one_person_one_dot_trento.shp')
In [273]:
from zipfile import ZipFile
In [274]:
with ZipFile('one_person_one_dot_trento.zip','w') as zip:
zip.write('one_person_one_dot_trento.shp')
zip.write('one_person_one_dot_trento.shx')
zip.write('one_person_one_dot_trento.dbf')
zip.write('one_person_one_dot_trento.prj')
Scarica il file .shp da usare in QGIS per fare una mappa migliore :)