Подключение к кубу анализа 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 необходимо в файле
Затем, вне зависимости от платформы на которой вы работаете, нужно добавить следующий fix для корректной работы json-парсера. Вносить его надо в
Описание настройки куба и процесс его разворачивания
- 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
После этого надо настроить приложение в файле
Осталось внести небольшой fix в dajno-piston
Теперь можно синхронизировать наше приложение с БД. Для этого из
Осталось запустить локальный сервер Django
Теперь осталось зайти на указанный в CUBESVIEWER_BACKEND_URL адрес через браузер. И наслаждаться готовым результатом.