import sys
reload(sys)
sys.setdefaultencoding("utf-8")

import pandas as pd
df = pd.read_csv('data/desaparecidos.csv',header=0,names=['estado','municipio','cvegeo','year','total','tasa'], encoding='utf-8')

"""
Explanation: Leemos los datos del csv
End of explanation
"""


df.groupby(['estado','year']).sum().reset_index('year').reset_index('estado').head()

"""
Explanation: Agrupamos y quitamos los índices de las columnas estado y year para poder usarlas en el pivot:
End of explanation
"""


tmp = df.groupby(['estado','year']).sum().reset_index('year').reset_index('estado')
estado_tiempo = tmp.pivot(index='estado',columns='year',values='total')
estado_tiempo.tail()

"""
Explanation: Creamos la pivot table para tener los años en columnas:
End of explanation
"""


cve_estado = df[['estado','cvegeo']].groupby('estado').first()
cve_estado.tail()

"""
Explanation: En la maniobra perdimos las claves cvegeo que luego vamos a necesitar para unirlo a las geometrías. Recuperémoslas:
End of explanation
"""


cve_estado = cve_estado.reset_index('estado')
estado_tiempo = estado_tiempo.reset_index('estado')

"""
Explanation: Además tenemos que reindexar las tablas para poder usar los valores de las columnas 'estado' como llaves en la unión:
End of explanation
"""


estado_tiempo = pd.merge(cve_estado,estado_tiempo, on='estado')
estado_tiempo.head()

"""
Explanation: Ahora si unimos:
End of explanation
"""


from geopandas import GeoDataFrame
gf = GeoDataFrame.from_file('data/estados.shp', encoding='utf-8')
gf.columns

"""
Explanation: Ahora leemos el shapefile con las geometrías de los estados:
End of explanation
"""


gf = gf[['NOMBRE','POB1','geometry']]
gf = gf.rename(columns = {'NOMBRE':'estado'})
gf.columns

"""
Explanation: Trístemente las cvegeo no coinciden, tendremos que intentar unir por nombre. 
Nos quedamos con las columnas necesarias del shape y renombramos la columna nombre para usarla como llave común:
End of explanation
"""


des_estado = pd.merge(gf,estado_tiempo, on='estado')
des_estado = GeoDataFrame(des_estado)
des_estado.head()

"""
Explanation: Unimos los dos conjuntos de datos y lo casteamos a GeoDataFrame:
End of explanation
"""


des_estado = des_estado.rename(columns={2006:'2006',2007:'2007',2008:'2008',2009:'2009',2010:'2010',2011:'2011',2012:'2012',2013:'2013',2014:'2014'})


"""
Explanation: Antes de guardar el resultado como shape necesitamos renombrar las columnas de los años porque son enteros y no strings.
End of explanation
"""


des_estado.to_file('data/desaparecidos_estatal',encoding='utf-8')

for c in des_estado.columns:
    print des_estado[c].dtype
    

"""
Explanation: Guardamos el resultado como shapefile para leerlo con clusterpy
End of explanation
"""


