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' )