Python как подключиться к кубами

Подключение к кубу анализа SQL Server с помощью Python (Anaconda)

Я использую Python для автоматизации некоторых отчетов, но не могу подключиться к кубу SSAS. У меня Windows 7 с Anaconda 4.4, и я не могу установить какие-либо библиотеки, кроме тех, которые включены в Anaconda.

Я использовал pyodbc+pandas для подключения к базам данных SQL Server и извлечения данных с помощью SQL-запросов, и теперь цель состоит в том, чтобы сделать что-то подобное в кубе SSAS, используя запрос MDX для извлечения данных, но я не могу получить успешное соединение .

Эта первая строка подключения очень похожа на строки, которые я использовал для подключения к базам данных SQL Server, но она дает мне ошибку аутентификации. Я без проблем могу получить доступ к кубу с помощью SQL Server Management Studio, поэтому я знаю, что у моих учетных данных Windows есть доступ.

Когда я попытался воспроизвести попытки Question1 и Question2 Я получил другую ошибку:

Любая помощь/руководство будет принята с благодарностью. Мой опыт работы с кубами SSAS минимален, поэтому возможно, что я нахожусь на совершенно неправильном пути для этой задачи, и даже если проблема с подключением будет решена, будет другая проблема с загрузкой данных в pandas и т. д.

API OLAP служб MS Analysis Services для Python [закрыто]

Я ищу способ подключиться к кубу OLAP MS Analysis Services, выполнить запросы многомерных выражений и передать результаты в Python. Другими словами, именно то, что делает Excel. Есть ли в Python решение, которое позволило бы мне это сделать?

Кто-то с подобным вопросом указал на ORM Django. Как бы мне ни нравился фреймворк, это не то, что я ищу. Я также не ищу способ извлекать строки и агрегировать их — в первую очередь для этого предназначены службы Analysis Services.

Вы пробовали обернуть adomd.dll? Я как раз собирался попробовать. — user376636

3 ответы

Я совершенно не разбираюсь в Python, но если он может вызывать библиотеки DLL, он должен иметь возможность использовать объект ADOMD от Microsoft. Это лучший вариант, который я могу придумать.

Вы можете посмотреть на веб-компоненты Office (OWC), поскольку в них есть элемент управления OLAP, который можно встроить в веб-страницу. Я думаю, вы можете передать ему MDX, но, возможно, вы хотите, чтобы Python тоже видел результаты, а я не думаю, что это позволяет.

В противном случае, возможно, вы сможете создать свой собственный «прокси» на другом языке. Эта программа / веб-страница может принимать многомерные выражения и возвращать вам XML с отображением результатов. Тогда Python мог бы использовать этот XML.

ответ дан 30 апр.

Насколько я знаю, он может вызывать библиотеки DLL. Проблема в том, что они так плохо документированы. Собственно то же самое относится и к протоколу связи клиент-сервер OLAP. Я бы сам реализовал клиента на Python (или попробовал), но нигде не могу найти. Есть указатели? — ктдрв

Найдите пример Python, показывающий, как вызвать DLL. Затем установите «Клиентские компоненты» MS SQL Server на свою машину разработчика и попробуйте изменить пример Python для вызова adomd.dll и использовать документацию Microsoft, чтобы сообщить вам, какие классы / объекты / свойства использовать. В VBScript мы бы сделали Server.CreateObject («ADOMD.Cellset») — Магнус Смит

Это легко сделать с помощью pythonnet:

Вы загружаете Microsoft.AnalysisServices.dll, поставляемый с SQL Server 2005 и 2008, или получаете распространяемый пакет здесь:

Затем вы можете загрузить его и использовать. Вот пример, который просто обрабатывает кубики:

Введение в OpenGL и PyOpenGL. Часть I: создание вращающегося куба

Если вы пользователь Windows, я настоятельно рекомендую загрузить PyGame и PyOpenGL из этого источника: Windows binaries for Python Modules. Обязательно сохраните эту ссылку, это крайне полезный сайт.

Загрузив все это, откройте вашу IDE и выполните следующий код:

Если эти выражения не вызовут ошибок, значит вы готовы к дальнейшей работе. А если будут ошибки, значит что-то пошло не так. Как правило, ошибки возникают при несовпадении версий Python, PyGame или PyOpenGL. Также они могут возникнуть при несовпадении битовости Python и загружаемых в него библиотек. То есть, если вы используете 32-битный Python, вам нужно использовать 32-битные модули библиотек и так далее.

Даже если ваша операционная система — 64-битная, все равно может оказаться, что вы используете 32-битную версию Python. Мы настоятельно рекомендуем по возможности использовать 64-битный Python. Дело в том, что 32-битный Python может использовать только 2 ГБ оперативной памяти, а это существенное ограничение. Разумеется, если у вас 32-битная ОС, вы не можете использовать 64-битный Python.

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

Для начала произведем импорт необходимых библиотек:

Мы импортируем все из PyGame, а затем все из PyGame.locals. Это вполне стандартный код для PyGame. Если вы хотите подробнее ознакомиться с данной библиотекой, то можете посмотреть другие статьи про нее на нашем сайте, например вот эту.

Затем мы импортируем OpenGL.GL и OpenGL.GLU. OpenGL.GL содержит в себе самые обычные функции библиотеки OpenGL, а вот OpenGL.GLU — более забавные.

Теперь вспомним про наши вершины:

Здесь мы определили координаты (x, y, z) каждой нашей вершины. Думаю, лучше всего представить это в относительных единицах. Попробуйте представить их в пространстве. Напоминаю, что у куба восемь вершин.

Далее нам надо задать ребра:

Каждое ребро представлено кортежем, состоящим из двух чисел. Эти числа соответствуют номерам вершин, а ребро их соединяет. Как принято в Python, да и во многих других языках программирования, нумерация начинается с 0 . Соответственно, 0 обозначает вершину (1, -1, -1) , и так далее.

Теперь, когда у нас все это есть, давайте поработаем над необходимым кодом для работы с OpenGL, чтобы фактически создать сам куб:

Как обычно, мы начинаем с задания функции. Поскольку это просто функция, которая будет содержать код OpenGL, мы начинаем этот код со следующего выражения: glBegin (GL_LINES) . Это уведомляет OpenGL сначала о том, что мы собираемся бросить в нее какой-то код, а затем — о том, как надо обрабатывать этот код (это указывает аргумент GL_LINES ). В данном случае этот код будет рассматриваться как код для рисования линий.

Далее, мы итерируем по всем нашим ребрам (список edges ), а затем каждой вершине в ребре (их там две) мы ставим в соответствие вершину из нашего списка вершин vertices (при помощи функции glVertex3fv ).

В конечном итоге в OpenGL передаются константы GL_LINES:

И так далее. OpenGL, зная, что мы хотим рисовать здесь линии, проведет их между этими точками.

После прохождения всех ребер работа функции заканчивается и мы вызываем glEnd() , чтобы сообщить об этом OpenGL. Подобные открывающие и закрывающие команды используются в OpenGL постоянно.

Это все, что касается нашей функции. Она создает куб, но теперь мы хотим его отобразить и указать его перспективу в нашем окружении:

Это тоже очень типичный для Pygame код. Единственное существенное отличие здесь в том, что после параметра display в функции pygame.display.set_mode мы добавляем еще один параметр. На самом деле это константы, уведомляющие PyGame о том, что мы будем использовать код OpenGL. Константа DOUBLEBUF расшифровывается как двойной буфер. Она обозначает тип буфферизации, в котором есть два буфера для соответствия кадровой частоте монитора. Обратите внимание, что для разделения констант используется символ «|». Мы еще столкнемся с ним в дальнейшем.

Идем дальше. В теле главной функции находится следующий код:

Функция gluPerspective определяет перспективу, о чем, впрочем, несложно догадаться из ее названия. Ее первый параметр определяет угол поля зрения и выражается в градусах. Второй параметр — это соотношение сторон дисплея, ширина, деленная на высоту. Следующие два параметра — znear и zfar , которые представляют собой ближнюю и дальнюю плоскости отсечения.

Что, черт возьми, означает плоскость отсечения? Если вы похожи на меня, на данный момент это ничего вам не говорит. По сути, плоскость отсечения — это расстояние, на котором объект либо появляется, либо исчезает. Таким образом, объект будет виден только между этими двумя значениями, и оба значения должны быть положительными, потому что они связаны с вашей перспективой, а не с вашим фактическим местоположением в трехмерной среде.

Итак, у нас есть ближняя плоскость отсечения, находящаяся на расстоянии 0.1 единицы, и дальняя плоскость отсечения на расстоянии 50.0 единиц. Это станет более понятным несколько позже, как только мы отобразим куб и сможем контролировать свое местонахождение в 3D-среде. Именно тогда вы увидите плоскости отсечения в действии.

Идем дальше. У нас есть следующая функция:

Функция glTranslatef , цитируя дословно, «умножает текущую матрицу на матрицу перехода». Круто, но для меня это опять ничего не значит. Итак, с точки зрения непрофессионала, это в основном перемещает вас, то есть сдвигает параметры ваших координат — x, y и z. Таким образом, вышеуказанный код означает, что мы сдвигаемся на 5 единиц назад. Это делается для того, чтобы мы действительно могли видеть куб, когда создаем его. Иначе мы были бы слишком близко.

Теперь напишем наш типичный цикл для отслеживания событий в PyGame. Опять же, если вы хотите узнать больше, ознакомьтесь со статьями, которые уже упоминались ранее.

Это простой цикл отслеживания событий в PyGame, который определяет возможность выхода. Иными словами, он отслеживает нажатие клавиши «x» . Далее, под оператором while продолжаем наш код:

Функция glRotatef умножает текущую матрицу на матрицу вращения. Ее параметрами являются угол вращения и координаты x, y, и z.

Затем у нас есть функция glClear , работающая, как любая другая функция очистки. Мы указываем в ее параметрах пару констант, которые сообщают OpenGL, что именно мы очищаем.

Как только мы очистим «экран», мы опять вызовем нашу функцию Cube () .

После этого мы вызываем функцию pygame.display.flip () , которая обновляет наш экран.

И наконец, мы вставляем небольшую задержку при помощи функции pygame.time.wait (10) .

Это все, что касается нашей главной функции main() , и теперь мы просто вызываем ее в конце, чтобы все заработало. На случай, если вы где-то заблудились, вот весь наш код, собранный воедино:

Результат его выполнения должен быть следующим:

Отлично, поздравляем вас с созданием куба при помощи PyOpenGL! Очевидно, что вам еще многое предстоит узнать, и работа многих функций пока для вас до конца не понятна. Мы скоро рассмотрим их более подробно.

Организация OLAP куба средствами Python

Добрый день, уважаемые читатели.
Сегодня я расскажу вам о том, как можно построить простенькую систему анализа данных на Python. В этом мне помогут framework cubes и пакет cubesviewer.
Сubes представляет собой framework’ом для работы с многомерными данными с помощью Python. Кроме того он включает в себя OLAP HTTP-сервер для упрощенной разработки приложений отчетности и общего просмотра данных.
Сubesviewer представляет собой web-интерфейс для работы с вышеуказанным сервером.

Установка и настройка cubes

Для начала надо установить библиотеки, необходимые для работы пакета:

Далее устанавливаем сам пакет cubes:

Как показала практика, лучше использовать версию (1.0alpha2) из текущего репозитория.

Доп настройки под windows

Если вы планируете работать под Windows необходимо в файле \Lib\site-packages\dateutil\tz.py заменить 40 строку:

Затем, вне зависимости от платформы на которой вы работаете, нужно добавить следующий fix для корректной работы json-парсера. Вносить его надо в \Lib\site-packages\cubes-1.0alpha-py2.7.egg\cubes\metadata.py начиная с 90 строки:

Описание настройки куба и процесс его разворачивания

  • slicer.ini — файл настроек http сервера нашего куба
  • model.json — файл с описание модели куба
  • [workspace] – конфигурация рабочего места
  • [server] — параметры сервера (адрес, порт и тд.)
  • [models] — список моделей для загрузки
  • [datastore] или [store] – параметры хранилища данных
  • [translations] — настройки локализации для модели.
  • name – имя модели
  • label – метка
  • description – описание модели
  • locale – локаль для модели (если задана локализация)
  • cubes – список метаданных кубов
  • dimensions – список метаданных измерений
  • public_dimensions – список доступных измерений. По умолчанию все измерения доступны.
  • category. Отображаемое имя «Category», поля «category», «category_label»
  • subcategory. Отображаемое имя «Sub-category», поля «subcategory», «subcategory_label»
  • line_item. Отображаемое имя «Line Item», поле «line_item»

Теперь осталось только запустить наш тестовый сервер с кубом, который называется slicer:

После этого можно проверить работоспособность нашего куба. Для этого в строке браузера можно ввести:
localhost:5000/cube/irbd_balance/aggregate?drilldown=year
В ответ мы получим json-объект с результатом агрегации наших данных. Подробнее о формате ответа сервера можно почитать тут.

Установка cubesviewer

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

А потом просто переместить содержимое папки /src в нужный место.
Надо отметить, что сubesviewer является Django-приложением, поэтому для его работы необходим Django (не выше версии 1.4), а также пакеты requests и django-piston. Т.к. данная версия Django уже устарела, то выше я привел ссылку откуда можно взять сubesviewer для версии Django 1.6.
Установка ее немного отличается от оригинала тем, что в файл конфигурации сервера slicer.ini в раздел [server] нужно добавить строку allow_cors_origin: localhost:8000
После этого надо настроить приложение в файле /web/cvapp/settings.py. Указав ему настройки БД, адрес OLAP сервера (переменная CUBESVIEWER_CUBES_URL ) и адрес просмоторщика ( CUBESVIEWER_BACKEND_URL )
Осталось внести небольшой fix в dajno-piston
Теперь можно синхронизировать наше приложение с БД. Для этого из /web/cvapp нужно выполнить:

Осталось запустить локальный сервер Django

Теперь осталось зайти на указанный в CUBESVIEWER_BACKEND_URL адрес через браузер. И наслаждаться готовым результатом.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *