Mi objetivo para este script es extraer cierta información de una consulta de la API Overpass y, en última instancia, unirla con la tabla de otra clase de característica que he creado.
Hasta ahora he completado los siguientes pasos relacionados con mi problema:
- Extraer los datos deseados del diccionario JSON
- Introducir datos en un marco de datos pandas
- convertir dicho dataframe a un array numpy ordenado, y luego de vuelta a nparray
- exportar los datos de mi matriz numpy a una tabla ArcGIS mediante NumPyArrayToTable()
Con una consulta vacía el script parece funcionar y me da una tabla vacía como deseaba, lo que me lleva a creer, que al menos sintácticamente mi código es correcto.
import requests
import arcpy
import pandas as pd
import numpy as np
output = r'C:\Users\...\Output\test'
# GET request to overpass API
osmurl = 'http://overpass-api.de/api/interpreter'
osmrequest = {....}
osm = requests.get(osmurl, params=osmrequest)
# Extract data from JSON dictionary nested in elements
data = osm.json()
data = data['elements']
# rearrange osmdata so only relevant attributes in 'tags'can be extracted as dataframe
for i in data
...
del i['tags']
# Create a dataframe from sorted JSON dictionary containing desired data
df = pd.DataFrame(data, columns=['data_1', 'data_2'])
# coerce dtype 'O' object values to np array native float64 type
df['data2'] = pd.to_numeric(df['data2'], errors='coerce')
# remove all rows containing NaNs (no data2 information)
df = df[~np.isnan(osmdataframe).any(axis=1)]
# Create a sorted np array
sorted_osmNParray = np.array(osmdataframe.to_records())
# reconvert to np array so it can be passed to NumpyArrayToTable method
osmNParray = np.array(sorted_osmNParray, np.dtype([('index', '<i8'), ('data_1', '<i8'), ('data_2', '<f8')]))
# Convert NP Array to table
arcpy.da.NumPyArrayToTable(osmNParray, output)
Sin embargo, en cuanto introduzco datos reales, se produce el siguiente error:
SystemError: retorno de error sin excepción establecida
La causa de esto es el método NumPyArrayToTable().
Mi Numpyarray tiene este aspecto antes de pasarlo a dicho método:
array([(20536, 4054816, 6.), (20537, 4054817, 2.),
(20538, 4239284, 3.), ..., (23731, 581630073, 5.),
(23732, 587279616, 4.), (23733, 590872784, 7.)],
dtype=(numpy.record, [(u'index', '<i8'), (u'data_1', '<i8'), (u'data_2', '<f8')]))
He probado la última conversión de dataframe a numpy array con una variación (NaNs todavía en mis datos) y resulta en el mismo error:
df = pd.DataFrame(data, columns=['data_1', 'data_2'])
df['data_2'] = pd.to_numeric(df['data_2'], errors='coerce')
# Convert df to np record array with df.values, then reconvert to unstructured np array
n = np.array(np.rec.fromrecords(df.values))
# make list of column names to replace default nparray ones
list_names = df.dtypes.index.tolist()
n.dtype.names = tuple(list_names)
# Create table
arcpy.da.NumPyArrayToTable(n, output)
¿Podría alguien decirme qué estoy haciendo mal exactamente? ¿Tengo que hacer referencia a una tabla ya existente?