私は MDX/OLAP が初めてで、OLAP をサポートする Python 用の Django ORM のような ORM があるかどうか疑問に思っています。
私は Python/Django の開発者ですが、Django とある程度統合できるものがあれば、それについてもっと知りたいと思っています。
Djangoには、リリースが近づいているいくつかのOLAP機能があります。
http://www.eflorenzano.com/blog/post/secrets-django-orm/を読む
http://doughellmann.com/2007/12/30/using-raw-sql-in-django.html、また
そもそも適切なスタースキーマ設計がある場合、1次元の結果は次の形式になります。
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
2次元の要約を作成する場合は、次のような操作を行う必要があります。
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
複数のSUMとCOUNTを計算するには、次のようにする必要があります。
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
これは、一見すると非効率的なようです。ファクトテーブルをトローリングして、アプリケーションで集計している多くの行を返します。
場合によっては、これはRDBMSのネイティブsum/group_byよりも高速である可能性があります。なんで?RDBMSがこれに使用することが多い、より複雑なソートベースのグループ化操作ではなく、単純なマッピングを使用しています。はい、たくさんの行があります。しかし、あなたはそれらを取得するために少ないことをしています。
これには、私たちが望むほど宣言的ではないという欠点があります。純粋なDjangoORMであるという利点があります。
kpwと同じですが、 Django 専用であることを除いて、私は自分のものを書きます:
http://cubes.databrewery.org/もあります。Python の軽量 OLAP エンジン。
本格的な ORM ではなく、Python の単純な OLAP のようなデータ ストアが必要でした。既存のツールを乾いた状態で検索した後、私はこの小さなハックを書きました:
https://github.com/kpwebb/python-cube/blob/master/src/cube.py
それがあなたの正確なニーズを解決しないとしても、より洗練されたものを書くための良い出発点になるかもしれません.