[Из песочницы] Как Microsoft забыла про полмира или читайте сообщения об ошибках

vvdnd-jg8bvp3c9k8rxvlubwdq8.png


Нет, это статья не про то, какой огромный и злобный монстр компания Microsoft. И как она опять обижает пользователей. А про то, как исправить досадный изъян, появившийся с последним, августовским обновлением Power BI Desktop c включённой поддержкой Python, а именно проблемы с визуализацией в локализованных версиях PBI, в частности matplotlib.

В первой декаде августа Microsoft выпустила давно и с нетерпением ожидавшийся релиз своего действительно замечательного BI-продукта с поддержкой языка Python. На момент написания статьи эта функциональность находится в разделе предварительных возможностей (т.е. просто бета-версия).
Я давно и с удовольствием использую Power BI в своей работе (и как аналитик данных и как разработчик BI). Всегда стараюсь попробовать новинки функциональности, которые щедро анонсируются в разделе предварительных версий. И, надо отдать должное команде разработки Microsoft, это почти всегда добротные, пригодные к работе версии фич, опций и визуализаций.
Особенно ожидалось BI-сообществом включение в Power BI поддержки Python. Не то, чтобы встроенной функциональности Power BI не хватало для реализации самых заковыристых задач, решаемых BI-системами. Около 250 функций встроенного языка запросов DAX и ещё более семисот функций Power Query позволяли решать практически любые задачи BI, от получения данных из самых разных источников, построения модели данных и до поддержки визуализаций и отчётов. В прошлом году была добавлена поддержка языка R, что резко расширило возможности Power BI в плане выполнения научных расчётов, новых визуализаций и даже машинного обучения.
Однако не секрет, что на сегодняшний день лидером в среде Data Science среди языков программирования является именно Python. И включение этого языка в BI-экосистему Microsoft превращает Power BI в эдакий швейцарский нож для подготовки, анализа и финального представления данных. С полноценной поддержкой четырёх специализированных языков (DAX, Power Query /M, R, Python) и ограниченной, в рамках необходимой функциональности SQL и MDX. Некоторые гики прикручивают ещё JavaScript, но это отдельный разговор.

Не являясь практикующим разработчиком Python, я всё же с нетерпением включил экспериментальную поддержку Python, чтобы протестировать новые, открывающиеся горизонты. Установил галочку в меню последнего релиза PBI и перезагрузил приложение. Подробнее о подключении и настройке можно прочитать в блоге Microsoft.

У меня уже была установлена предыдущая версия Python и я решил рискнуть и не заморачиваться с установкой новой. В итоге в источниках данных появился новый коннектор — «Скрипт Pyton», а на панели визуализаций новая иконка [Py].

Однако на этом этапе пайтоновский код не выполнялся. Не буду описывать все перипетии, связанные с попыткой запустить в знакомом мне окружении и Power BI незнакомый (почти) Python.

Проблемы визуализации


Как бы то ни было, даже чистая установка сборки Anaconda с огромным количеством предустановленных библиотек, продвинутым менеджером пакетов и т. п. практически ни на йоту не продвинули меня к заветным «картинкам». Разные версии Python выдавали на мой тестовый код разные сообщения об ошибках, и я был слегка обескуражен. Поиск Google по этим сообщениям тоже не давал адекватных результатов. Недавно появившийся на портале, в сообществе Power BI (https://community.powerbi.com) запрос датского пользователя о похожей проблеме натолкнул на давно зревшую мысль — дело не в мой конфигурации компьютера с гремучей смесью установленного ПО (причём проверял я на разных своих машинах, но на них везде — гремучая смесь, только разная). Дело в локализации.
Когда стало ясно, в какую сторону смотреть, на уточнённые запросы стали попадаться более вменяемые ответы поисковиков. Но смысл был везде один: «В текущей версии Power BI нельзя использовать формат чисел с десятичной запятой, а только с десятичной точкой, совместно с Python. Ждите обновлённой версии или меняйте формат представления чисел».

В Power BI поменять формат числа можно за пару секунд через меню, но что делать с тоннами готовых отчётов и исходными данными? Овчинка тут явно не стоила выделки.

PBI Python set up


В этот момент все страждущие «питона под пауэр би» разделились на два лагеря: американцы и англичане с десятичной точкой и все остальные. Часть «оставшихся за бортом текущей версии» спешно переметнулась к первой группе, установив в качестве стандартного разделителя точку. Остальные понура принялись ждать исправленного релиза. Но т.к. это бета-версия и перевод в продуктовую функциональность может занять и два месяца и полгода, ожидать исправлений со дня на день точно не стоило.

И в этот момент я решил повнимательнее прочитать сообщение об ошибке:

Ошибка


Повнимательнее, потому что ошибка относилась не к моему коду, который в Jypyter исполнялся как раз без ошибок и отображал все визуальные элементы без каких бы то ни было проблем. Проблема была вызвана дополнительным кодом, который Microsoft внедрила для интеграции Python с Power BI. А именно с вызовом библиотеки matplotlib (https://ru.wikipedia.org/wiki/Matplotlib) и конкретно функции pyplot (файл pyplot.py).

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

В исходном коде библиотеки этот код на Python выглядит так:

figManager = new_figure_manager(num, figsize=figsize,
dpi=dpi,
facecolor=facecolor,
edgecolor=edgecolor,
frameon=frameon,
FigureClass=FigureClass,
**kwargs)


Соблюдая уважение к столь важной библиотеке я просто закомментировал код вызова проблемного параметра figsize, в который Microsoft передаёт в локализованных версиях четыре аргумента из Poiwer BI вместо двух, и передал этому параметру значение размеров визуализации по умолчанию.

Теперь этот код выглядит так:

figManager = new_figure_manager(num, 
figsize=rcParams['figure.figsize'],
#figsize=figsize,
dpi=dpi,
facecolor=facecolor,
edgecolor=edgecolor,
frameon=frameon,
FigureClass=FigureClass,
**kwargs)


В актуальной сборке Anaconda это 542–549 строки. Если у вас другая версия библиотеки, просто поищите вхождение «figManager» и внесите необходимые изменения и сохраните исправленную библиотеку под тем же именем (для этого понадобятся права администратора).

После этого просто перезапустите код визуализации на исполнение и наслаждайтесь результатом… Ну, или подождите, пока гора не придёт к Магомету, точнее Microsoft к Python.

result


Юрий Колмаков (McCow)

© Habrahabr.ru