Какие-нибудь движки Python OLAP/MDX ORM?

Я новичок в MDX/OLAP, и мне интересно, есть ли какой-либо ORM, похожий на Django ORM для Python, который бы поддерживал OLAP.

Я разработчик Python/Django, и если что-то будет иметь какой-то уровень интеграции с Django, мне будет очень интересно узнать об этом больше.

4 ответа

Решение

У Django есть некоторые функции OLAP, которые скоро будут выпущены.

Читайте http://www.eflorenzano.com/blog/post/secrets-django-orm/

http://doughellmann.com/2007/12/30/using-raw-sql-in-django.html, также

Если у вас есть правильный дизайн схемы звезды в первую очередь, то одномерные результаты могут иметь следующую форму.

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

Если вы хотите создать двухмерную сводку, вы должны сделать что-то вроде следующего.

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

Чтобы вычислить несколько СУММ и СЧЕТОВ, а что нет, вы должны сделать что-то вроде этого.

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 /group_by. Зачем? Вы используете простое сопоставление, а не более сложную операцию группировки на основе сортировки, которую СУБД часто приходится использовать для этого. Да, вы получаете много строк; но вы делаете меньше, чтобы получить их.

Это имеет тот недостаток, что это не так декларативно, как хотелось бы. Преимущество в том, что это чистый Django ORM.

Также есть http://cubes.databrewery.org/. Легкий движок OLAP на питоне.

То же самое, что и kpw, я пишу свои собственные вещи, за исключением того, что это исключительно для Django:

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

У меня была похожая потребность - не для полноценного ORM, а для простого OLAP-подобного хранилища данных в Python. После тщательного поиска существующих инструментов я написал этот небольшой взлом:

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

Даже если это не решит вашу конкретную задачу, это может быть хорошей отправной точкой для написания чего-то более сложного.

Другие вопросы по тегам