Domanda

Sono nuovo di MDX / OLAP e mi chiedo se ci siano ORM simili come Django ORM per Python che supportino OLAP.

Sono uno sviluppatore Python / Django e se ci fosse qualcosa che avrebbe un certo livello di integrazione con Django sarei molto interessato a saperne di più su di esso.

È stato utile?

Soluzione

Django ha alcune funzionalità OLAP che stanno per essere rilasciate.

Leggi http://www.eflorenzano.com/blog/post / segreti-django-orm /

http://doughellmann.com/2007 /12/30/using-raw-sql-in-django.html , anche

Se in primo luogo si dispone di un corretto schema a stella, i risultati unidimensionali possono avere il seguente modulo.

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

Se vuoi creare un riepilogo bidimensionale, devi fare qualcosa di simile al seguente.

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

Per calcolare più SUM e COUNT e cosa no, devi fare qualcosa del genere.

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

Questo - a prima vista - sembra inefficiente. Stai trollando attraverso la tabella dei fatti che restituisce molte righe che stai quindi aggregando nella tua applicazione.

In alcuni casi, potrebbe essere più veloce della somma / group_by nativa di RDBMS. Perché? Stai utilizzando una mappatura semplice, non l'operazione di raggruppamento basata su ordinamento più complessa che RDBMS deve spesso utilizzare per questo. Sì, stai ricevendo molte righe; ma stai facendo di meno per ottenerli.

Questo ha lo svantaggio di non essere così dichiarativo come vorremmo. Ha il vantaggio che è puro ORango Django.

Altri suggerimenti

Stessa cosa di kpw , scrivo le mie cose, tranne che è esclusivamente per Django:

https://code.google.com/p/django-cube/

Vi è anche http://cubes.databrewery.org/ . Motore OLAP leggero in pitone.

Avevo un'esigenza simile, non per un ORM completo ma per un semplice archivio di dati simile a OLAP in Python. Dopo essere venuto a cercare gli strumenti esistenti ho scritto questo piccolo trucco:

https://github.com/kpwebb/python -cube / blob / master / src / cube.py

Anche se non risolve il tuo preciso bisogno, potrebbe essere un buon punto di partenza per scrivere qualcosa di più sofisticato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top