¿Algún motor Python OLAP/MDX ORM?
django (4)
Lo mismo que kpw , escribo mis propias cosas, excepto que es exclusivamente para Django:
Soy nuevo en el MDX / OLAP y me pregunto si hay algún ORM similar a Django ORM para Python que sea compatible con OLAP.
Soy un desarrollador de Python / Django y si hubiera algo que tuviera algún nivel de integración con Django, estaría muy interesado en aprender más sobre él.
Tenía una necesidad similar, no para un ORM completo, sino para una simple tienda de datos OLAP en Python. Después de buscar en seco las herramientas existentes, escribí este pequeño truco:
https://github.com/kpwebb/python-cube/blob/master/src/cube.py
Incluso si no resuelve su necesidad exacta, podría ser un buen punto de partida para escribir algo más sofisticado.
También hay http://cubes.databrewery.org/ . Motor OLAP liviano en python.
Django tiene algunas características OLAP que están a punto de lanzarse.
Leer http://www.eflorenzano.com/blog/post/secrets-django-orm/
http://doughellmann.com/2007/12/30/using-raw-sql-in-django.html , también
Si tiene un diseño de esquema en estrella adecuado, en primer lugar, los resultados unidimensionales pueden tener la siguiente forma.
from myapp.models import SomeFact
from collections import defaultdict
facts = SomeFact.objects.filter( dimension1__attribute=this, dimension2__attribute=that )
myAggregates = defaultdict( int )
for row in facts:
myAggregates[row.dimension3__attribute] += row.someMeasure
Si desea crear un resumen bidimensional, debe hacer algo como lo siguiente.
facts = SomeFact.objects.filter( dimension1__attribute=this, dimension2__attribute=that )
myAggregates = defaultdict( int )
for row in facts:
key = ( row.dimension3__attribute, row.dimension4__attribute )
myAggregates[key] += row.someMeasure
Para calcular múltiples SUM''s y COUNT''s y lo que no, debes hacer algo como esto.
class MyAgg( object ):
def __init__( self ):
self.count = 0
self.thisSum= 0
self.thatSum= 0
myAggregates= defaultdict( MyAgg )
for row in facts:
myAggregates[row.dimension3__attr].count += 1
myAggregates[row.dimension3__attr].thisSum += row.this
myAggregates[row.dimension3__attr].thatSum += row.that
Esto, a primera vista, parece ineficiente. Estás revisando la tabla de hechos y devolviendo muchas filas que luego agregas en tu aplicación.
En algunos casos, esto puede ser más rápido que el sum / group_by nativo del RDBMS. ¿Por qué? Está utilizando un mapeo simple, no la operación de agrupamiento por orden más compleja que el RDBMS a menudo tiene que usar para esto. Sí, estás recibiendo muchas filas; pero estás haciendo menos para obtenerlos.
Esto tiene la desventaja de que no es tan declarativo como quisiéramos. Tiene la ventaja de que es puro Django ORM.