Salvar un DataFrame en Google Sheets
ฅ^•ﻌ•^ฅ Para poder comunicarlo al público en general
Este es uno de los mejores trucos que aprendí trabajando en Mutt Data. Del lado del desarrollo, en el día a día, trabajar con Pandas es de lo más común, tanto para análisis exploratorio de datos como manipulación de datos en general. Cuando existen otras partes interesadas en un proyecto, sobre todo personas de negocio, la comunicación es esencial y en Mutt nos iba bastante bien sacando a la luz DataFrame
s por medio de Google Sheets — ambos están hechos para trabajar con datos tabulares y lo bueno de los documentos de Google es que son fáciles de compartir y que las personas de negocio están acostumbradas a interactuar con hojas de cálculo.
El paquete que vamos a usar se llama gspread y es una API en Python para Google Sheets.
pip install gspread
Autenticación
Vamos a necesitar una cuenta de servicio —que es un archivo con credenciales— para habilitar a nuestro programa a escribir en Google Sheets. Estas son las instrucciones.
- Ir a la consola de Google Cloud Platform (GCP) y crear un proyecto nuevo o seleccionar uno existente (yo creé
mi-proyecto
). Si nunca usaste GCP, vas a tener algunos pasos adicionales. - En la barra de Buscar productos y recursos buscar Google Drive API y habilitarla.
- En la barra de Buscar productos y recursos buscar Google Sheets API y habilitarla.
- En la barra de Buscar productos y recursos buscar cuentas de servicio, en esa página:
- + Crear cuenta de servicio, completar el formulario; con el nombre de la cuenta de servicio es suficiente (yo elegí
google-sheets
). - Una vez creada, seleccionarla para entrar en los detalles de la cuenta.
Claves > Agregar clave > Crear clave nueva > JSON > Crear
. Aceptar la descarga de la cuenta de servicio. En mi caso, demi-proyecto-80a030363d28.json
.- Mover el archivo a la carpeta de trabajo. Debe estar en lugar seguro.
- + Crear cuenta de servicio, completar el formulario; con el nombre de la cuenta de servicio es suficiente (yo elegí
La cuenta de servicio servirá para todas las planillas de cálculo que necesitemos dentro de un mismo proyecto de GCP.
Acceso a la hoja de cálculo
Este paso es mucho muy importante, debe realizarse cada vez que utilicemos una hoja de cálculo nueva.
Ir a la hoja de cálculo y compartirla con el correo electrónico de la cuenta de servicio (es el que figura en el detalle de la cuenta) de la misma manera que haríamos para compartírsela a otra persona mediante su cuenta de correo.
En mi caso, tengo que compartir las hojas con google-sheets@mi-proyecto.iam.gserviceaccount.com
.
import gspread
GSHEETS_CREDENTIALS = 'mi-proyecto-80a030363d28.json'
def save_to_gsheets(df, sheet_name, worksheet_name='Sheet1'):
client = gspread.service_account(GSHEETS_CREDENTIALS)
sheet = client.open(sheet_name)
worksheet = sheet.worksheet(worksheet_name)
# convertimos el tipo de las columnas que sean datetime a string
for column in df.columns[df.dtypes == 'datetime64[ns]']:
df[column] = df[column].astype(str)
# reemplazamos valores NaN por strings vacíos
worksheet.update([df.columns.values.tolist()] + df.fillna('').values.tolist())
print(f'DataFrame escrito en la hoja {sheet_name} / {worksheet_name}.')
Vamos con un ejemplo:
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randint(0, 100, size=(7, 4)), columns=list('ABCD'))
df
Previamente tuve que crear la hoja Ejemplo Pandas
y darle acceso a la cuenta de servicio.
save_to_gsheets(df, 'Ejemplo Pandas', worksheet_name='Sheet1')
Este es el resultado 📝.