La creación de pandas trama de datos de API Smartsheet (anidado, torpe, JSON)

votos
0

Estoy intentando conectar con el API Smartsheet de mi oficina a través de Python para crear unos cuadros de mando de seguimiento de rendimiento que utilizan los datos fuera de Smartsheet. Todo lo que quiero hacer es crear una trama de datos sencilla donde los campos reflejan los valores de celda ColumnID y reflejan la tecla DisplayValue en el diccionario Smartsheet. Estoy haciendo esto usando un requests.get API estándar en lugar de documentación de la API de Smartsheet porque he encontrado este último más difícil de trabajar.

Estas son las dos maneras que he abordado el problema:

ENTRADA:

from pandas.io.json import json_normalize
dbopj = dbop.json()
dfj_rows = json_normalize(data=dbopj['rows'], record_path='cells', meta=['id', 'rowNumber'])
dfj_rows

SALIDA:

Trama de datos con ColumnID, valor, disdlayValue, identificación, y rowNumber como sus propios campos.

Si pudiera encontrar la manera de incorporar la presente los datos de la manera correcta que probablemente podría hacer que funcione, pero que parece muy complicado.

ENTRADA:

dbopj = dbop.json()
cellist = []
def get_cells():
    dbrows = dbopj['rows']
    for db_cells in dbrows:
        dbcells = db_cells['cells']
        cellist.append(dbcells)
get_cells()
pd.DataFrame(cellist)

SALIDA:

Este una trama de datos con el número correcto de columnas y filas, pero cada celda devuelve se rellena con un diccionario que se parece

{'columnId': 1500325145274244, 'value': 731.0, 'displayValue': '731'}

Si había una manera de eliminar todo excepto el valor correspondiente a la clave DisplayValue en cada célula, esto probablemente a resolver mi problema. Una vez más, sin embargo, parece extrañamente complicado.

Soy bastante nuevo en Python y trabajar con el API del, por lo que puede ser una forma sencilla de abordar el problema que estoy con vistas. O, si usted tiene una sugerencia para abordar las posibles soluciones que he descrito soy todo oídos. ¡Gracias por tu ayuda!

Publicado el 13/02/2020 a las 23:52
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
0

Usted debe hacer uso del columnscampo:

colnames = {x['id']: x['title'] for x in samplej['columns']}
columns = [x['title'] for x in samplej['columns']]
cellist = [{colnames[scells['columnId']]: scells['displayValue']
            for scells in s_cells['cells']} for s_cells in samplej['rows']]
celldf = pd.DataFrame(cellist, columns=columns)

Esto da como era de esperar:

  Number Letter Name
0      1      A  Joe
1      2      B  Jim
2      3      C  Jon

Si algunas células podrían contener solamente un ColumnID pero ningún campo DisplayValue, scells['displayValue']debe ser reemplazado en el código anterior con scells.get('displayValue', defaultValue), donde defaultValueno podía ser, np.nano cualquier otro incumplimiento relevante.

Respondida el 14/02/2020 a las 17:02
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more