KeplerDB + SAP HANA Cloud: cartas natales, clustering y exploracion analitica sobre 8.473 registros historicos.
AstroHana toma el dataset historico de KeplerDB, recalcula cada carta natal con pyswisseph, lo carga en SAP HANA Cloud y lo explota como:
- base de datos relacional para cartas y textos interpretativos,
- base analitica para queries astrologicas sobre miles de registros,
- base vectorial numerica para similitud entre cartas,
- soporte de clustering con resultados persistidos en HANA,
- miniapp web para explorar todo esto desde una capa visual.
El proyecto ya no es solo una demo de "vecinos". Ahora expone un pequeño entorno de trabajo para:
- calcular una carta natal a partir de fecha, hora y coordenadas,
- encontrar perfiles historicos cercanos,
- inspeccionar clusters guardados en HANA,
- explorar categorias y busquedas por texto dentro del dataset,
- recuperar interpretaciones Kepler desde la tabla
KEPLER_TEXTOS.
Pipeline real:
fecha / hora / lugar
|
v
pyswisseph
calcula posiciones planetarias, ASC y MC
|
v
vector numerico de carta
(8 o 12 factores)
|
v
SAP HANA Cloud
- vecinos por similitud
- queries SQL analiticas
- clustering persistido
- textos Kepler
|
v
CLI + miniapp Gradio
Aqui no hay embeddings generados por LLM para la parte astrologica principal. Cada carta es un vector de grados planetarios fisicos. Eso hace que HANA funcione como backend de similitud numerica real, no como sucedaneo de vector DB.
La similitud ya no usa diferencia lineal de angulos. Ahora emplea distancia angular circular, para que 359° y 1° se consideren cercanos y no opuestos por culpa del salto 0/360.
| Tabla | Filas aproximadas | Contenido |
|---|---|---|
CARTAS_NATALES |
8.473 | Cartas con posiciones planetarias y metadatos |
KEPLER_TEXTOS |
1.124 | Textos interpretativos del Kepler 4 |
PAL_KMEANS_INPUT |
101.676 | Features en formato long (8473 x 12) |
PAL_KMEANS_RESULT |
8.473 | Cluster asignado y distancia al centro |
PAL_KMEANS_CENTROIDS |
144 | Centroides de 12 clusters |
Hay 29 cartas del dataset original con datos temporales incompletos o invalidos que quedan fuera del calculo correcto.
pyswissephcalcula Sol, Luna, planetas, ASC y MC.- Sistema de casas: Placidus.
- Conversión de hora local a UT aplicada antes del calculo.
- Manejo del desbordamiento de dia por efecto del GMT.
- similitud sobre 8 factores o 12 factores,
- query directa contra HANA,
- ranking de cartas cercanas,
- visualizacion en CLI y en miniapp.
scikit-learnejecutaKMeanslocalmente,- los resultados se guardan en HANA (
CLUSTER_ID,DIST_TO_CENTER), - la miniapp permite explorar overview y miembros por cluster.
- almacenamiento de interpretaciones en
KEPLER_TEXTOS, - recuperacion por planeta, signo y casa,
- uso directo desde la miniapp para la carta calculada.
- busquedas por categoria,
- busquedas libres por palabra clave en nombre y descripcion,
- queries SQL analiticas sobre el corpus historico.
La miniapp esta implementada en app.py con Gradio y reutiliza la logica Python + HANA del proyecto.
- formulario de nacimiento,
- calculo de carta natal,
- vecinos mas cercanos,
- resumen del mejor match,
- recuperacion de textos Kepler asociados a la carta.
- overview del K-Means persistido en HANA,
- numero de cartas por cluster,
- cohesion media,
- inspeccion de miembros cercanos al centroide.
- filtros rapidos por categoria (
Musica,Politica,Ciencia,Arte,Deporte), - busqueda libre por texto en nombre o descripcion,
- lectura rapida de perfiles dentro del corpus.
- consulta directa a
KEPLER_TEXTOS, - seleccion de planeta, signo y casa,
- inspeccion de interpretaciones sin recalcular carta.
py -X utf8 app.pyNormalmente quedara disponible en:
http://127.0.0.1:7860
AstroHana/
|-- app.py
|-- README.md
|-- HANA_LECCIONES.md
|-- requirements.txt
|-- .env.example
|-- scripts/
| |-- __init__.py
| |-- 01_migrate.py
| |-- 02_pal_kmeans.py
| |-- 06_query_examples.py
| |-- fix_roles.py
| |-- kmeans_sklearn.py
| |-- migrate_direct.py
| |-- quien_soy.py
| |-- run_kmeans.py
| |-- run_kmeans_final.py
| |-- run_kmeans_hanaml.py
| |-- run_kmeans_v2.py
| `-- vecinos.py
`-- sql/
|-- 01_create_tables.sql
`-- 04_queries.sql
- app.py: miniapp web de presentacion y exploracion.
- scripts/vecinos.py: logica principal de calculo + vecinos.
- scripts/quien_soy.py: version simplificada del flujo de consulta.
- scripts/kmeans_sklearn.py: clustering local con persistencia en HANA.
- sql/04_queries.sql: queries analiticas de referencia.
- HANA_LECCIONES.md: notas tecnicas, errores y aprendizajes.
- Python 3.12
- acceso a SAP HANA Cloud
- dataset fuente
kepler.db - efemerides Swiss Ephemeris disponibles en disco
pip install -r requirements.txtActualmente el proyecto declara:
hdbclipyswissephpandaspython-dotenvmatplotlibnumpyscikit-learnhana-mlgradio
Copia la plantilla:
copy .env.example .envContenido esperado en .env:
HANA_HOST=tu_instancia.hanacloud.ondemand.com
HANA_PORT=443
HANA_USER=DBADMIN
HANA_PASS=tu_password
HANA_GRANTHELPER_USER=GRANTHELPER
HANA_GRANTHELPER_PASS=tu_password_granthelper
KEPLER_DB=C:\ruta\al\kepler.db
EPHE_PATH=C:\swisseph\epheLas credenciales ya no se guardan en duro dentro de los scripts principales. Toda la configuracion sensible se carga desde variables de entorno.
Si el repo tuvo claves expuestas en iteraciones anteriores, conviene rotarlas en HANA aunque el codigo actual ya este saneado.
py -X utf8 scripts/vecinos.pypy -X utf8 scripts/vecinos.py 1976 10 11 20 33 1.0 40.4 -3.7py -X utf8 scripts/vecinos.py 1976 10 11 20 33 1.0 40.4 -3.7 --top 20 --todospy -X utf8 scripts/kmeans_sklearn.pypy -X utf8 scripts/06_query_examples.pypy -X utf8 scripts/01_migrate.py --allOpciones utiles:
py -X utf8 scripts/01_migrate.py --create-tables
py -X utf8 scripts/01_migrate.py --migrate
py -X utf8 scripts/01_migrate.py --checkpy -X utf8 scripts/migrate_direct.pyEsta ruta se uso como variante practica cuando hubo que resolver ciertos problemas de datos o insercion.
En Free Tier, la opcion fiable es:
- leer features desde HANA,
- ejecutar
KMeansconscikit-learn, - persistir resultados en HANA.
- scripts/kmeans_sklearn.py: camino funcional principal.
- scripts/run_kmeans_final.py: intento con
hana-mlpreparado para entornos con PAL disponible. - scripts/run_kmeans_hanaml.py: variante PAL via
hana-ml. - scripts/run_kmeans.py: llamadas PAL por overload.
- scripts/run_kmeans_v2.py: pruebas de invocacion via
DO BEGIN. - scripts/fix_roles.py: utilidades relacionadas con permisos/roles PAL.
En SAP HANA Cloud Free Tier, PAL queda bloqueado por privilegios AFL que no siempre se pueden conceder desde SQL con DBADMIN.
Consecuencia:
- el motor de clustering nativo de HANA no queda utilizable en este entorno,
- pero el proyecto sigue funcionando porque el clustering se ejecuta fuera y se persiste dentro de HANA.
El valor del proyecto no esta solo en "vecinos". Estas son las capas realmente interesantes:
- distribucion de cartas por cluster,
- cohesion media,
- perfiles centrales,
- cluster dominante por categoria.
- busqueda por categoria profesional,
- filtrado por palabra clave en descripcion,
- busqueda de cartas con combinaciones raras Sol/Luna.
- acceso directo a
KEPLER_TEXTOS, - combinacion signo/casa/planeta,
- lectura de textos interpretativos asociados a una carta calculada.
Revisa sql/04_queries.sql para ejemplos listos sobre:
- vecinos,
- clusters,
- combinaciones solares/lunares,
- textos Kepler,
- estadisticas del dataset.
HANA trabaja aqui como motor de similitud numerica sobre vectores de grados astrologicos.
- vector actual: grados planetarios,
- metrica: distancia en espacio numerico,
- uso: similitud entre cartas.
El siguiente salto es combinar esto con vectores semanticos reales:
- cargar corpus textual en HANA,
- generar embeddings,
- guardarlos como
REAL_VECTOR, - consultar por similitud semantica.
Eso permitiria convertir AstroHana en puente entre:
- astrologia estructurada,
- corpus textual interpretativo,
- RAG semantico,
- y HANA como backend unico.
Durante esta fase se verifico:
- compilacion sintactica de
app.pyy scripts principales conpy_compile, - importacion correcta de la miniapp,
- consultas reales contra HANA para:
run_lookup,- overview de clusters,
- miembros por cluster,
- categorias del dataset,
- textos Kepler.
Tambien se resolvio un error real de parametros SQL en la app al aplicar la distancia angular circular.
- la calidad del clustering esta muy influida por planetas generacionales y epoca de nacimiento,
- algunos registros del dataset tienen descripciones ruidosas o repetidas,
- PAL sigue bloqueado por restricciones del Free Tier,
- la miniapp es funcional pero no pretende ser una app final de usuario masivo,
- no hay aun capa de autenticacion ni despliegue productivo.
- sintetizador narrativo de la carta desde la miniapp,
- mejor filtro y deduplicacion de vecinos,
- mejoras visuales en tablas y resaltes,
- exportacion de resultados.
- perfilado automatico por cluster,
- busqueda combinada carta + textos,
- dashboards mas fuertes sobre epocas, signos y categorias.
- embeddings semanticos en HANA para corpus textual,
- RAG astrologico / interpretativo,
- app desplegada con persistencia de consultas o perfiles de usuario.
- KeplerDB: app con interpretaciones Kepler 4.
- AstroExtracto: RAG sobre corpus YouTube con backend vectorial local.
- DesktopCommanderPy: MCP server Python con tools HANA.
Ejemplo base:
from hdbcli import dbapi
conn = dbapi.connect(
address="tu_instancia.hanacloud.ondemand.com",
port=443,
user="DBADMIN",
password="...",
encrypt=True,
sslValidateCertificate=False,
)Notas practicas:
- Free Tier suele dormirse y hay que reactivar la instancia desde BTP Cockpit.
- La instancia trabaja en UTC y eso importa mucho para astrologia.
- HANA 4.0 no soporta algunos patrones comodisimos de otros motores, asi que parte del manejo DDL se resuelve con
try/except. - En PowerShell,
&&no es el mejor aliado; usa;para encadenar.
Eduardo Abdul Malik Arias
Orgiva, Granada
Marzo 2026