Example #1
0
def run_main(path_danios, path_manzanas, google_key):
    radius_buffer = 0.0001
    df_danios = pd.read_csv(
        path_danios, parse_dates=['Timestamp'],
        dtype={
           'Calle': str, 'Colonia': str, 'Delegacin': str, 'Estado': str,
           'NmeroExterioroAproximado': str
        }
    )
    df_danios = df_danios.assign(fuente='')
    df_danios.loc[df_danios.Calle.isnull(), 'fuente'] = 'JSON'
    df_danios.loc[~df_danios.Calle.isnull(), 'fuente'] = 'georref'
    # Call google
    print('Geocoding ...')
    # Sequential requests
    # df_google_danios = []
    # for _, row in df_danios.iterrows():
    #     respuesta = make_google_request(row, google_key)
    #     df_google_danios.append(respuesta)

    # Concurrent requests
    df_google_danios = Parallel(n_jobs=-1, backend="threading")(
        delayed(make_google_request)(row, google_key) for i, row in df_danios.iterrows()
    )
    df_google_danios = pd.concat(
        [row for row in df_google_danios if row is not None], ignore_index=True, axis=0
    )
    df_google_danios = df_google_danios[
        df_google_danios.google_estado.isin(['Ciudad de México', 'Morelos', 'Puebla'])
    ]
    df_google_danios = df_google_danios.assign(
        google_calle=df_google_danios.google_calle.fillna(df_google_danios.Calle)
    )
    df_google_danios = df_google_danios.loc[df_google_danios.google_confidence >= 8]

    # Geo-ref
    print('Loading cvegeos...')
    files = [file for file in glob.glob(path_manzanas)]
    usecols = ['cvegeo', 'geometry']
    df_mnz = Parallel(n_jobs=2)(delayed(load_shape)(file, usecols) for file in files)
    df_mnz = pd.concat(df_mnz, axis=0, ignore_index=True)
    df_mnz = df_mnz.to_crs({'init': 'epsg:4326'})

    aux = df_danios.loc[df_danios.fuente == 'JSON']
    aux = aux.assign(lat=aux.latitud, lon=aux.longitud)

    aux2 = df_google_danios.rename(
        columns={'google_lat': 'lat', 'google_lon': 'lon'})

    aux = pd.concat([aux2, aux], ignore_index=True, axis=0)

    geometry = [Point(xy) for xy in zip(aux.lon, aux.lat)]

    crs = {'init': 'epsg:4326'}
    geo_df = gpd.GeoDataFrame(aux, crs=crs, geometry=geometry)
    geo_df['geometry'] = geo_df.geometry.buffer(radius_buffer)
    geo_df = geo_df.to_crs({'init': 'epsg:4326'})
    print('Spatial joint between points and manzanas ...')
    danios_manzana = gpd.sjoin(geo_df, df_mnz, how="inner", op='intersects')

    danios_manzana = danios_manzana.sort_values('Timestamp', ascending=False)
    danios_manzana.to_csv('danios_zonas.csv', index=False)
    limpio_danios = danios_manzana.reset_index().drop_duplicates(subset='index')
    limpio_danios = limpio_danios.drop_duplicates(subset='cvegeo')
    limpio_danios = limpio_danios.drop(
        ['geometry', 'index_right', 'latitud', 'longitud'],
        axis=1
    )
    limpio_danios = limpio_danios.rename(
        columns={'lat': 'latitud', 'lon': 'longitud'})
    limpio_danios = pd.DataFrame(limpio_danios)
    final_cols = [
        'Calle', 'Colonia', 'Delegacin', 'EspecialistasFaltantesseparaporcomas', 'Estado', 'Foto',
        'HerramientasExistentes', 'HerramientasFaltantes', 'Hora', 'HoradelReporte',
        'ManodeObraExistente', 'ManodeObraFaltante', 'MedicamentosExistentes',
        'MedicamentosFaltantes', 'Municipio', 'NmeroExterioroAproximado',
        'NmerodePersonasAtrapadas', 'NmerodePersonasDesaparecidas', 'NmerodePersonasFallecidas',
        'NmerodePersonasLesionadas', 'NmerodePersonasRescatadas', 'OtraReferenciadeUbicacin',
        'Timestamp', 'TipoDao', 'TipodeInfraestructura', 'TipodeUso', 'TipodelDao', 'Verificado',
        'VveresExistentes', 'VveresFaltantes', 'VveresSobrantes', 'latitud', 'longitud'
    ]
    limpio_danios = limpio_danios.loc[:, final_cols]
    print('Writing output')
    limpio_danios.to_csv(
        'danios_clean.csv', index=False, quoting=1, encoding='utf-8'
    )