¿Ha tenido una computadora portátil Jupyter desordenada llena de código de copia solo para reutilizar algunas lógicas de disputa de datos? Ya sea que lo haga por pasión o por trabajo, si codifica mucho, entonces probablemente haya respondido algo como “demasiados”.
No estás solo.
Tal vez intentó compartir datos con colegas o conectar su último modelo ML a un tablero elegante, pero enviar CSV o reconstruir el tablero desde cero no se siente correcto.
Aquí está la solución (y tema) de hoy: cree una API personal.
En esta publicación, le mostraré cómo configurar un servicio Fastapi ligero y potente para exponer sus conjuntos de datos o modelos y finalmente Proporcione a sus proyectos de datos la modularidad que se merecen.
Si eres un solo Ciencia de datos ENTRADANADORES, un estudiante con proyectos paralelos o un ingeniero de ML experimentado, esto es para usted.
Y no, no me pagan para promocionar este servicio. Sería bueno, pero la realidad está lejos de eso. Simplemente disfruto usarlo y pensé que valía la pena ser compartido.
Revisemos la tabla de contenido de hoy:
- ¿Qué es una API personal? (¿Y por qué deberías importarte?)
- Algunos casos de uso
- Configurarlo con Fastapi
- Conclusión
¿Qué es una API personal? (¿Y por qué deberías importarte?)
El 99% de las personas que leen esto ya estarán familiarizadas con el concepto API. Pero para ese 1%, aquí hay una breve introducción que se complementará con el código en las siguientes secciones:
Un API (Interfaz de programación de aplicaciones) es un conjunto de reglas y herramientas que permite que diferentes aplicaciones de software se comuniquen entre sí. Define lo que puede pedirle a un programa que hagacomo “Dame el pronóstico del tiempo” o “enviar un mensaje”. Y ese programa maneja la solicitud detrás de escena y devuelve el resultado.
Entonces, ¿qué es un API personal? Es esencialmente un pequeño servicio web que expone sus datos o lógica de una manera estructurada y reutilizable. Piense en ello como una mini aplicación que responde a las solicitudes HTTP con versiones JSON de sus datos.
¿Por qué sería una buena idea? En mi opinión, tiene diferentes ventajas:
- Como ya se mencionó, reutilización. Podemos usarlo en nuestros cuadernos, paneles o scripts sin tener que reescribir el mismo código varias veces.
- Colaboración: Sus compañeros de equipo pueden acceder fácilmente a sus datos a través de los puntos finales de la API sin necesidad de duplicar su código o descargar los mismos conjuntos de datos en sus máquinas.
- Portabilidad: Puede implementarlo en cualquier lugar, en la nube, en la nube, en un contenedor o incluso en una Raspberry Pi.
- Pruebas: ¿Necesita probar una nueva función o actualización del modelo? Empujelo a su API y pruebe instantáneamente en todos los clientes (cuadernos, aplicaciones, paneles).
- Encapsulación y versiones: Puede verificar su lógica (V1, V2, etc.) y separar los datos sin procesar de la lógica procesada limpiamente. Esa es una gran ventaja para la mantenibilidad.
Y Fastapi es perfecto para esto. Pero veamos algunos casos de uso reales en los que cualquiera como usted y yo nos beneficiaría de una API personal.
Algunos casos de uso
Ya sea que sea un científico de datos, analista, ingeniero de ML o simplemente construyendo cosas geniales los fines de semana, una API personal puede convertirse en su arma secreta de productividad. Aquí hay tres ejemplos:
- Modelo como servicio (Mass): capacite a un modelo ML localmente y exponga a su público a través de un punto final como
/predict. Y las opciones de aquí son infinitas: prototipos rápidos, integrándolo en una frontend … - Datos listos para el tablero: Servir conjuntos de datos preprocesados, limpios y filtrados a herramientas de BI o paneles personalizados. Puede centralizar la lógica en su API, para que el tablero se mantenga liviano y no vuelva a implementar el filtrado o la agregación.
- Capa de acceso a datos reutilizable: Al trabajar en un proyecto que contiene múltiples cuadernos, ¿alguna vez le ha sucedido que las primeras celdas en todas ellas contienen siempre el mismo código? Bueno, ¿qué pasa si centralizó todo ese código en su API y lo hizo con una sola solicitud? Sí, podría modularizarlo también y llamar a una función para hacer lo mismo, pero crear la API le permite ir un paso más allá, poder usarlo fácilmente desde cualquier lugar (no solo localmente).
Espero que entiendas el punto. Las opciones son infinitas, al igual que su utilidad.
Pero vamos a la parte interesante: construir la API.
Configurarlo con Fastapi
Como siempre, comience configurando el entorno con su herramienta Env (Venv, Pipenv …). Luego, instale Fastapi y Uvicorn con pip install fastapi uvicorn. Entendamos lo que hacen:
- Fastapi[1]: Es la biblioteca la que nos permitirá desarrollar la API, esencialmente.
- Uvicorn[2]: Es lo que nos permitirá ejecutar el servidor web.
Una vez instalado, solo necesitamos un archivo. Por simplicidad, lo llamaremos app.py.
Ahora pongamos un contexto en lo que haremos: imagine que estamos construyendo un sistema de riego inteligente para nuestro huerto en casa. El sistema de riego es bastante simple: tenemos un sensor de humedad que lee la humedad del suelo con cierta frecuencia, y queremos activar el sistema cuando está por debajo del 30%.
Por supuesto, queremos automatizarlo localmente, por lo que cuando llega al umbral comienza a dejar caer agua. Pero también estamos interesados en poder acceder al sistema de forma remota, tal vez leer el valor actual o incluso activar la bomba de agua si queremos. Ahí es cuando la API personal puede ser útil.
Aquí está el código básico que nos permitirá hacer exactamente eso (tenga en cuenta que estoy usando otra biblioteca, duckdb[3]porque ahí es donde almacenaría los datos, pero podría usar SQLite3, pandas o lo que desee):
import datetime
from fastapi import FastAPI, Query
import duckdb
app = FastAPI()
conn = duckdb.connect("moisture_data.db")
@app.get("/last_moisture")
def get_last_moisture():
query = "SELECT * FROM moisture_reads ORDER BY day DESC, time DESC LIMIT 1"
return conn.execute(query).df().to_dict(orient="records")
@app.get("/moisture_reads/{day}")
def get_moisture_reads(day: datetime.date, time: datetime.time = Query(None)):
query = "SELECT * FROM moisture_reads WHERE day = ?"
args = [day]
if time:
query += " AND time = ?"
args.append(time)
return conn.execute(query, args).df().to_dict(orient="records")
@app.get("/trigger_irrigation")
def trigger_irrigation():
# This is a placeholder for the actual irrigation trigger logic
# In a real-world scenario, you would integrate with your irrigation system here
return {"message": "Irrigation triggered"}
Leyendo verticalmente, este código separa tres bloques principales:
- Importaciones
- Configuración del objeto de aplicación y la conexión DB
- Creando los puntos finales de la API
1 y 2 son bastante sencillos, por lo que nos centraremos en el tercero. Lo que hice aquí fue crear 3 puntos finales con sus propias funciones:
/last_moisturemuestra el último valor del sensor (el más reciente)./moisture_reads/{day}es útil ver las lecturas del sensor desde un solo día. Por ejemplo, si quisiera comparar los niveles de humedad en invierno con los que en verano, verificaría lo que hay en/moisture_reads/2024-01-01y observar las diferencias con/moisture_reads/2024-08-01.
Pero también he hecho que pueda leer los parámetros GET si estoy interesado en verificar un tiempo específico. Por ejemplo:/moisture_reads/2024-01-01?time=10:00/trigger_irrigationHaría lo que su nombre sugiere.
Así que solo nos faltan una parte, comenzando el servidor. Vea lo simple que es ejecutarlo localmente:
uvicorn app:app --reload
Ahora podría visitar:
Pero no termina aquí. Fastapi proporciona otro punto final que se encuentra en http: // localhost: 8000/documentos Eso muestra documentación interactiva autogenada para nuestra API. En nuestro caso:
Es extremadamente útil cuando la API es colaborativa, ¡porque no necesitamos verificar el código para poder ver todos los puntos finales a los que tenemos acceso!
Y con solo unas pocas líneas de código, muy pocas de hecho, hemos podido construir nuestra API personal. Obviamente puede ser mucho más complicado (y probablemente debería), pero ese no fue el propósito de hoy.
Conclusión
Con solo unas pocas líneas de Pitón Y el poder de Fastapi, ahora ha visto lo fácil que es exponer sus datos o lógica a través de una API personal. Ya sea que esté construyendo un sistema de riego inteligente, exponiendo un modelo de aprendizaje automático o simplemente cansado de reescribir la misma lógica de disputa en los cuadernos: este enfoque aporta modularidad, colaboración y escalabilidad a sus proyectos.
Y esto es solo el comienzo. Tú podrías:
- Agregar autenticación y versiones
- Desplegarse en la nube o en una Raspberry Pi
- Encadenarlo a un frontend o un bot de telegrama
- Convierta su cartera en un Proyecto de Proyecto Viviente
Si alguna vez ha querido que sus datos funcionen sentir Como un producto real, esta es tu puerta de entrada.
Avísame si construyes algo genial con él. O incluso mejor, envíame la url a tu /predict, /last_moistureo cualquier API que hayas hecho. Me encantaría ver qué se te ocurre.
Recursos
[1] Ramírez, S. (2018). Fastapi (Versión 0.109.2) [Computer software]. https://fastapi.tiangolo.com
[2] Codificar. (2018). Uvicorn (Versión 0.27.0) [Computer software]. https://www.uvicorn.org
[3] Mühleisen, H., Raasveldt, M. y Duckdb Colaboradores. (2019). Duckdb (Versión 0.10.2) [Computer software]. https://duckdb.org