In [1]:
import os
import json
import folium
import numpy as np
import pandas as pd
from scipy.interpolate import interp1d
In [82]:
# Los coloresd de los bloque que mas viajan, sacados de wikipedia:
# https://es.wikipedia.org/wiki/Senado_de_la_Naci%C3%B3n_Argentina#Composici.C3.B3n_actual
colores = {'PJ Frente para la Victoria': '#0000ff',
'Unión Cívica Radical':'#ED1C24',
'PJ La Pampa':'#318CE7',
'Movimiento Popular Neuquino':'#4169e1',
'Justicialista San Luis': '#add8e6',
'Frente Pro': '#FFD700',
'Frente Cívico por Santiago':'#E60026',
'Partido Socialista':'#fdbf6f',
'otros':'#ff7f00'}
bloques_validos = ['PJ Frente para la Victoria', 'Unión Cívica Radical', 'PJ La Pampa', 'Movimiento Popular Neuquino',
'Justicialista San Luis', 'Frente Pro', 'Frente Cívico por Santiago', 'Partido Socialista']
In [18]:
# Se sacan los del 13 y 14 porque no tienen bloque
csvs = ['../' + csv for csv in os.listdir('../') if csv not in ['viajes_2013.csv', 'viajes_2014.csv']
and csv.endswith('.csv')]
# Open and concat df
for cnt, csv in enumerate(csvs):
if cnt == 0:
df = pd.read_csv(csv)
else:
df_temp = pd.read_csv(csv)
df = pd.concat([df, df_temp], ignore_index=True)
In [19]:
def check_dato(destino, bloque, list_datos, origen='Argentina'):
for dato in list_datos:
if destino == dato['destino'] and bloque == dato['bloque'] and origen == dato['origen']:
dato['count'] = dato['count'] + 1
return True
if not '/' in destino:
viaje = {'destino':destino, 'bloque':bloque, 'origen':origen, 'count':1}
list_datos.append(viaje)
else:
# Atajo los dos casos
if ' / ' in destino:
escala, destino = destino.split(' / ', maxsplit=1)
escala = ' '.join(escala.split())
destino = ' '.join(destino.split())
elif '/' in destino:
escala, destino = destino.split('/', maxsplit=1)
escala = ' '.join(escala.split())
destino = ' '.join(destino.split())
check_dato(destino, bloque, list_datos, escala)
return True
datos = []
for i in df.itertuples():
check_dato(i.Destino, i.Bloque, datos)
count_viajes_x_destino_bloque = pd.DataFrame(datos)
In [20]:
count_viajes_x_destino_bloque.destino.unique()
Out[20]:
In [21]:
df_counts = df.groupby('Destino')['Destino'].count()
countries_destino = set([country for country in count_viajes_x_destino_bloque.destino])
countries_origen = set([country for country in count_viajes_x_destino_bloque.origen])
countries = countries_destino.union(countries_origen)
# Elimino algos repetidos (con un espaciol al principo)
list_countries = list(countries)
In [30]:
# Lat lon del centro de cada pais
with open('centro_paises.geojson', 'r') as file:
data = json.load(file)
In [31]:
countries = dict()
for feature in data['features']:
nombre = feature['properties']['nombre']
if nombre in list_countries:
countries[nombre] = {'latlon': [feature['geometry']['coordinates'][1],
feature['geometry']['coordinates'][0]]}
countries
Out[31]:
In [32]:
countries['Argentina']['latlon'], countries['Alemania']['latlon']
Out[32]:
In [53]:
atribution = ('Map data © <a href="http://openstreetmap.org">OpenStreetMap</a> '
'contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">'
'CC-BY-SA</a>, Imagery © <a href="http://mapbox.com">Mapbox</a>')
my_map = folium.Map(location=[45.372, -121.6972],
zoom_start=2,
tiles='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
attr=atribution)
# Countries markers
for country in list_countries:
# Marker
text = "{0}".format(country)
folium.Marker(countries[country]['latlon'],
popup=text).add_to(my_map)
# Connection lines
for i in count_viajes_x_destino_bloque.itertuples():
lat = np.linspace(countries[i.origen]['latlon'][0], countries[i.destino]['latlon'][0], 3)
lon = np.linspace(countries[i.origen]['latlon'][1], countries[i.destino]['latlon'][1], 3)
# los paises que esta muy juntos los conecto por una recta
if lat.max() - lat.min() > 5:
lat[1] = lat[1] + np.random.choice([-1, 1])*(lat.max() - lat.min())/np.random.choice([4, 5])
lon[1] = lon[1] + np.random.choice([-1, 1])*np.random.random()*15
f2 = interp1d(lat, lon, kind='quadratic')
#
xnew = np.linspace(lat.min(), lat.max(), num=41, endpoint=True)
coordinates = [[x, y] for x, y in zip(xnew, f2(xnew))]
else:
coordinates = [[x, y] for x, y in zip(lat, lon)]
# Asignamos los colores si estan en los principales bloques
if i.bloque in colores.keys():
color = colores[i.bloque]
else:
color = colores['otros']
popup = "Bloque: {0}\nCantidad de viajes: {1}".format(i.bloque, i.count)
html="""
<div class="line-popup">
<strong>Bloque:</strong> {0}<br>
<strong>Cantidad de viajes:</strong> {1}<br>
</div>
""".format(i.bloque, i.count)
iframe = folium.element.IFrame(html=html, width='auto', height='70px;')
popup = folium.Popup(iframe)
folium.PolyLine(coordinates, weight=1+i.count, color=color, popup=popup).add_to(my_map)
my_map
Out[53]:
In [52]:
my_map.save('index.html')
In [54]:
In [ ]:
In [ ]:
In [58]:
features = []
for country in countries:
features.append({
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [countries[country]['latlon'][1], countries[country]['latlon'][0]]
},
"properties": {
"name": country
}
})
data = { "type": "FeatureCollection", "features": features}
with open('countries.geojson', 'a') as f:
json.dump(data, f, indent=4)
In [85]:
ls = []
lines = []
for i in count_viajes_x_destino_bloque.itertuples():
lat = np.linspace(countries[i.origen]['latlon'][0], countries[i.destino]['latlon'][0], 3)
lon = np.linspace(countries[i.origen]['latlon'][1], countries[i.destino]['latlon'][1], 3)
# los paises que esta muy juntos los conecto por una recta
if lat.max() - lat.min() > 5:
lat[1] = lat[1] + np.random.choice([-1, 1])*(lat.max() - lat.min())/np.random.choice([4, 5])
lon[1] = lon[1] + np.random.choice([-1, 1])*np.random.random()*15
f2 = interp1d(lat, lon, kind='quadratic')
#
xnew = np.linspace(lat.min(), lat.max(), num=41, endpoint=True)
coordinates = [[y, x] for x, y in zip(xnew, f2(xnew))]
else:
coordinates = [[y, x] for x, y in zip(lat, lon)]
# Asignamos los colores si estan en los principales bloques
if i.bloque in colores.keys():
color = colores[i.bloque]
else:
color = colores['otros']
if i.bloque in bloques_validos:
capa = i.bloque
else:
capa = "otros"
ls.append(capa)
lines.append({
"type": "Feature",
"properties": {"color": color,
"bloque": i.bloque,
"contador": i.count,
"capa": capa},
"geometry": {
"type": "LineString",
"coordinates": coordinates
}
})
with open('connections.js', 'a') as f:
f.write("var connections = {0};".format(str(lines).replace("'", '"')))
In [87]:
set(ls)
Out[87]:
In [90]:
for i in list(set(ls)):
print(i, colores[i])
In [89]:
colores
Out[89]:
In [ ]: