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


Нет, это статья не про то, какой огромный и злобный монстр компания 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)

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

Сталкивались ли Вы с подобной проблемой?
Помогла ли информация, приведённая в статье, решить проблему визуализации python?
Поделиться публикацией
Комментарии 7
    0
    Извечная проблема со знаком дробной части… Вроде бы все просто, ставь локаль и будет тебе счастье, но на практике выясняется, что это работает очень плохо. Хоть табличку «Место для удара головой» вешай.

    Рано или поздно миру придется принять, что существует только один знак дробной части, и это точка.
      0
      netricks, и на каком языке будет говорить тот мир? На китайском?

      А про локаль до сих пор MS удавалось соблюдать баланс. С помощью отдельного переключателя локали. Правда не они его придумали.
      Надеюсь починят и этот баг рано или поздно.
        +2
        Человеческие языки могут быть разными, хотя, я надеюсь, что рано или поздно человечество добьётся какой-нибудь унификации, но язык математики должен быть общим.
          0
          netricks, эта светлая мысль давно людям в голову приходит. Большинство стран мира перешло, например, на метрическую систему, в том числе и Великобритания, а вот экономика №1 до сих пор измеряет в имперских дюймах, милях и фаренгейтах… И что с этим поделать?
            0
            Разумеется работать над собой!
      +1
      Существует понятие интерфейса взаимодействия с пользователем. Это единственное место, где имеет место быть локализованное представление чисел, дат, времени и всего остального.
      Во всех остальных местах должны использоваться стандартные представления величин.
        0
        Если говорить о машинном представлении, то да, так обычно и происходит (обычно, но как мы видим — не всегда).
        Однако интерфейс — это не только отображение, но и получение данных, в том числе от пользователя. А уж как вводит данные пользователь, зависит от того, как его ещё в школе учили…

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

      Самое читаемое