- PVSM.RU - https://www.pvsm.ru -
Добрый день, уважаемые читатели.
Сегодня я расскажу вам о том, как можно построить простенькую систему анализа данных на Python. В этом мне помогут framework cubes [1] и пакет cubesviewer [2].
Сubes представляет собой framework'ом для работы с многомерными данными с помощью Python. Кроме того он включает в себя OLAP HTTP-сервер для упрощенной разработки приложений отчетности и общего просмотра данных.
Сubesviewer представляет собой web-интерфейс для работы с вышеуказанным сервером.
Для начала надо установить библиотеки, необходимые для работы пакета:
pip install pytz python-dateutil jsonschema
pip install sqlalchemy flask
Далее устанавливаем сам пакет cubes:
pip install cubes
Как показала практика, лучше использовать версию (1.0alpha2) из текущего репозитория [3].
Если вы планируете работать под Windows необходимо в файле {PYTHON_DIR}Libsite-packagesdateutiltz.py заменить 40 строку:
return myfunc(*args, **kwargs).encode()
на
return myfunc(*args, **kwargs)
Затем, вне зависимости от платформы на которой вы работаете, нужно добавить следующий fix [4] для корректной работы json-парсера. Вносить его надо в {PYTHON_DIR}Libsite-packagescubes-1.0alpha-py2.7.eggcubesmetadata.py начиная с 90 строки:
elif len(parts.scheme) == 1 and os.path.isdir(source):
# TODO: same hack as in _json_from_url
return read_model_metadata_bundle(source)
Для примера возьмем OLAP-куб, который идет в поставке с cubes. Он находится в папке examples/hello_world (ее можно взять с репозитория).
Наибольший интерес для нас представляют 2 файла:
Остановимся на них поподробнее. Начнем с файла slicer.ini, который может включать следующие разделы:
[workspace]
– конфигурация рабочего места[server]
— параметры сервера (адрес, порт и тд.)[models]
— список моделей для загрузки[datastore] или [store]
– параметры хранилища данных[translations]
— настройки локализации для модели.
Итак разберем из нашего тестового файла видно, что сервер будет располагаться на локальной машине и будет работать по 5000 порту. В качестве хранилища будет использоваться локальная база SQLite под названием data.sqlite.
Подробнее о конфигурировании сервера можно прочитать [5] в документации.
Также из файла видно, что описание модели нашего куба находиться в файле model.json, описание структуры которого мы сейчас и займемся.
Файл описания модели, это json-файл, который включает следующие логические разделы:
name
– имя моделиlabel
– метка description
– описание моделиlocale
– локаль для модели (если задана локализация)cubes
– список метаданных кубов dimensions
– список метаданных измеренийpublic_dimensions
– список доступных измерений. По умолчанию все измерения доступны.
Для нас представляют интерес разделы cubes и dimensions, т.к. все остальные опциональны.
Элемент списка dimensions, содержит следующие метаданные:
Ключ | Описание |
---|---|
name | идентификатор измерения |
label | Имя измерения видное пользователю |
description | описание измерения для пользователей |
levels | Список уровней измерений |
hierarchies | Список иерархий |
default_hierarchy_name | Идентификатор иерархии |
Элемент списка cubes, содержит следующие метаданные:
Ключ | Описание |
---|---|
name | идентификатор измерения |
label | Имя измерения видное пользователю |
description | описание измерения для пользователей |
dimensions | список имен измерений заданных выше |
measures | список мер |
aggregates | список функций агрегации мер |
mappings | задание разметки логических и физических атрибутов |
Исходя из выше описанного, можно понять, что у нас в модели в будет 2 измерения (item, year). У измерения "item" 3 уровня измерений:
В качестве меры в нашем кубе будет выступать поле «amount», для которой выполняются функции суммы и подсчета кол-ва строк.
Подробнее о разметке модели куба можно почитать в документации [6]
После того, как мы разобрались с настройками, надо создать нашу тестовую базу. Для того, чтобы это сделать, необходимо запустить скрипт prepare_data.py:
python prepare_data.py
Теперь осталось только запустить наш тестовый сервер с кубом, который называется slicer:
slicer serve slicer.ini
После этого можно проверить работоспособность нашего куба. Для этого в строке браузера можно ввести:
localhost [7]:5000/cube/irbd_balance/aggregate?drilldown=year
В ответ мы получим json-объект с результатом агрегации наших данных. Подробнее о формате ответа сервера можно почитать тут [8].
Когда мы настроили наш куб, можно приступить к установке сubesviewer. Для этого надо скопировать репозиторий [9] себе на диск:
git clone https://github.com/nonsleepr/cubesviewer.git
А потом просто переместить содержимое папки /src в нужный место.
Надо отметить, что сubesviewer является Django-приложением, поэтому для его работы необходим Django (не выше версии 1.4), а также пакеты requests и django-piston. Т.к. данная версия Django уже устарела, то выше я привел ссылку откуда можно взять сubesviewer для версии Django 1.6.
Установка ее немного отличается от оригинала тем, что в файл конфигурации сервера slicer.ini
в раздел [server]
нужно добавить строку allow_cors_origin: http://localhost:8000
После этого надо настроить [10] приложение в файле {CUBESVIEWER_DIR}/web/cvapp/settings.py. Указав ему настройки БД, адрес OLAP сервера (переменная CUBESVIEWER_CUBES_URL
) и адрес просмоторщика (CUBESVIEWER_BACKEND_URL
)
Осталось внести небольшой fix [11] в dajno-piston
Теперь можно синхронизировать наше приложение с БД. Для этого из {CUBESVIEWER_DIR}/web/cvapp нужно выполнить:
python manage.py syncdb
Осталось запустить локальный сервер Django
python manage.py runserver
Теперь осталось зайти на указанный в CUBESVIEWER_BACKEND_URL
адрес через браузер. И наслаждаться готовым результатом.
Для иллюстрации работы я взял самый простой пример. Надо отметить что для производственных проектов cubes можно развернуть [12] например на apache [13] или uswgi [14]. Ну а подключить к нему сubesviewer с помощью этой статьи не составит труда.
Если тема будет интересна сообществу, то я раскрою ее в одной из будущих статей.
Автор:
Источник [15]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/news/59707
Ссылки в тексте:
[1] cubes: http://cubes.databrewery.org/
[2] cubesviewer: http://jjmontesl.github.io/cubesviewer/
[3] репозитория: https://github.com/Stiivi/cubes
[4] fix: https://github.com/rgruebel/cubes/commit/4fb6b8e1d85a99bc7bdd4f88697ca6731503eee6
[5] прочитать: http://pythonhosted.org/cubes/configuration.html
[6] документации: http://pythonhosted.org/cubes/model.html#introduction
[7] localhost: http://localhost
[8] тут: http://pythonhosted.org/cubes/server.html
[9] репозиторий: https://github.com/nonsleepr/cubesviewer
[10] настроить: https://github.com/jjmontesl/cubesviewer/blob/master/doc/guide/cubesviewer-gui-installation.md
[11] fix: https://bitbucket.org/spookylukey/django-piston/commits/40645e760ea2cb9a37d87c9352607b3fa7fac346#chg-piston/emitters.py
[12] развернуть: http://pythonhosted.org/cubes/deployment.html
[13] apache: http://httpd.apache.org/
[14] uswgi: http://uwsgi-docs.readthedocs.org/en/latest/
[15] Источник: http://habrahabr.ru/post/222421/
Нажмите здесь для печати.