2 votos

NumPyArrayToTable() (SystemError: error return without exception set)

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?

1voto

MisterEd Puntos 131

Después de juguetear un poco, encontré la respuesta a mi problema: Simplemente haciendo referencia a una base de datos global a la que se exportaría la tabla de salida se solucionó el error del sistema.

arcpy.da.NumPyArrayToTable(osmNParray, r'C:\Users\ArcGIS 10.3.1\DataBase.gdb\out_table')

Ahora también funciona con la otra conversión que he probado.

enter image description here

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X