Des moteurs Python OLAP / MDX ORM?
Question
Je suis nouveau dans le MDX / OLAP et je me demande s’il existe un ORM similaire à Django ORM pour Python qui prendrait en charge OLAP.
Je suis un développeur Python / Django et s'il y avait quelque chose qui aurait un certain niveau d'intégration avec Django, je serais très intéressé d'en apprendre plus à ce sujet.
La solution
Django propose certaines fonctionnalités OLAP bientôt disponibles.
Lire http://www.eflorenzano.com/blog/post / secrets-django-orm /
http://doughellmann.com/2007 /12/30/using-raw-sql-in-django.html , ainsi que
Si vous avez une conception en étoile appropriée, les résultats unidimensionnels peuvent avoir la forme suivante.
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 vous souhaitez créer un résumé en deux dimensions, vous devez procéder de la manière suivante.
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
Pour calculer plusieurs SUM et COUNT et ce qui ne l'est pas, vous devez faire quelque chose comme ceci.
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
Cela - à première vue - semble inefficace. Vous parcourez la table des faits en retournant de nombreuses lignes que vous agrégez ensuite dans votre application.
Dans certains cas, cela peut être plus rapide que la somme / group_by native du SGBDR. Pourquoi? Vous utilisez un mappage simple, pas l'opération de regroupement basée sur le tri plus complexe que le SGBDR doit souvent utiliser pour cela. Oui, vous obtenez beaucoup de lignes. mais vous en faites moins pour les obtenir.
Cela a le désavantage de ne pas être aussi déclaratif que nous le souhaiterions. Il a l'avantage d'être pur Django ORM.
Autres conseils
Même chose que kpw , j'écris moi-même, sauf que c'est exclusivement pour Django:
Il existe également http://cubes.databrewery.org/ . Moteur OLAP léger en python.
J'avais un besoin similaire - pas pour un ORM complet, mais pour un simple magasin de données de type OLAP en Python. Après être revenu à sec à la recherche d’outils existants, j’ai écrit ce petit hack:
https://github.com/kpwebb/python -cube / blob / master / src / cube.py
Même si cela ne résout pas votre besoin, cela pourrait être un bon point de départ pour écrire quelque chose de plus sophistiqué.