[РЕШЕНО] Установка python-библиотек Pandas и др. в LO7 Calc (Windows)

Автор economist, 2 июня 2021, 09:31

0 Пользователи и 1 гость просматривают эту тему.

economist

Про Top-3 язык программирования Python слышали все. Он же входит в состав LibreOffice 7 (версия 3.8.8) Про профессию/сферу с ЗП ~150-300 тыс. руб. DataScience - (DS) и связанные с ней BI, AI, ML, NLP, IoT, CV итд – тоже многие слышали. Питон стал основным DS-языком и вошел во все вузовские программы (школы - на подходе). Владением им - признак крутости инженера, ученого, аналитика, врача, IT-шника. Если лень читать "многобуков" - внизу поста есть "типовой" кейс применения Pandas в Calc.

Pandas - библиотека для Python, взявшая многое от MatLab/R. Это:
- Загрузка таблиц из любых источников - csv, dbf, все SQL/noSQL-базы данных, web-сайты, геокарты, госуслуги, ЕГРЮЛ, Excel, Сalc, PDF, hd5, Spark, clickhouse итд. Уже 30 млн. свободных источников данных "обо всём" есть в https://datasetsearch.research.google.com/. Данных - море, они есть везде.
- Автосоединение данных таблиц (как =ВПР/VLOOKUP, только авто).
- Разведочный анализ и описательные статистики.
- Очистка и нормализация данных (занимает 80-90% раб. времени DS-спеца).
- Агрегатные "фичи" и трансформации статистик групп в исходные строки.
- Поиск корреляций и моделирование (+ страшные матан и тервер).
- Машинное обучение ML, нейронные сети, все эти NLP, CV итд.
- Визуализация (графики, диаграммы, анимации, слайд-шоу).
- Экспорт в кучу типов файлов и вывод в BI/web-приложения/дэшборды/БД.

В Python море библиотек. Их 300+ тысяч, и все они - свободные и бесплатные. Ну кто ещё так богат и щедр? Не менее важно то, что по ним написаны 5 млн. ответов на StackOverFlow (SO), Питон там "лидер дня": https://stackoverflow.com/questions/tagged/python Русский раздел мал, но Интернет кишит сайтами с приличным машинным переводом всего сайта SO, поэтому вы всегда найдете ответ на русском (с нетронутым кодом).

Главный плюс Pandas, то, почему она полезна в LO Calc, - неимоверная, просто ошеломляющая скорость работы!. Это благодаря С, С++ и Fortran внутри. И тому, что данные не лежат на диске, а "висят" в RAM, в виде упорядоченных массивов. RAM в ПК нужно много (от 4Gb), а значит желательны 64-битные версии ПО. Portable LO бывает лишь 32bit - но тоже работает с Pandas. На огромных таблицах 5+ млн. строк вам придется поставить 64bit LO и память хотя бы 8 Гб. Но до этого еще надо дорасти.

А сколько нужно памяти сразу? Вот реальные цифры моего завода с 50 млрд. выручки за 3 года. Все до единой(!) бухпроводки (20 Гб базы 1С:УПП) - Pandas сожмёт в крохотный архив (20 Мб) и считает из него же в RAM за... 5(!) секунд, "отъев" в RAM всего 2 Гб (пропорция 1000:1:100). Выборка по "период, дебет, кредит, два субконто", например, почем в среднем мы покупали такое-то сырье помесячно за 2 года - будет почти мгновенной, не дольше 2 сек. Все другие программы, базы данных итд - будут в десятки, а то и в сотни раз медленнее.

Даже быстрые IN-MEMORY базы SQLite оказались тормознее. Но на миллиардах строк (т. н. зона BigData) - Pandas "затупит". Выход - "кластерная pandas" - Dask на нескольких ПК. А пока вы можете ускорить аналитику в отделе/компании, начав "с себя" и обычного ПК с 4Gb RAM.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

economist

В Python всё на удивление легко. Язык "толкает" писать ясный код. В теле цикла, условия, функции - обязателен Tab-отступ для строк (его редактор кода вставляет сам). За терпимость к этой внешней особенности кода - вам полагается вкусная "конфетка" - не нужно кучи скобок и ";", не надо закрывающих строк End, End If, Next итд. Такой код даже с 2 метров выглядит ясно, структурно, он в 4 раза меньше чем на любых других топ-языках.

Хозяева MS Excel давно почуяли неладное и постоянно заимствуют идеи у Pandas/R/Matlab (новые функции типа UNIQUE, "умные" таблицы, динамические массивы итд). И всё больше грозятся внедрить Python в Excel.

5 лет назад экселисты уже начали использовать мощь Pandas в VBA с библиотеками PyXLL, XlWings и др. А вот Calc и его пользователи - отстали. Python "внутри" LO есть, но "кривой". А внешний - работает с уже открытыми файлами LO только с тяжелым бубном. Тут не до Pandas и новинок DS...

А причина вот в чем: когда-то давно разработчики LO не стали делать большой API-модуль для внешнего интерпретатора Pуthon, а просто наспех "воткнули" его в дистрибутив LO, вырезав "на всякий случай" часть функций, без которых:
- нельзя установить ни одну библиотеку (удален pip)
- нельзя создать внешнее GUI-приложение (удален TKinter)
- нет IDE и нет отладки на уровне API LibreOffice (не сделано)
- нет СУБД SQLite, самой быстрой и известной (удален модуль)
- нельзя использовать эффективные методы сжатия BZ2, LZMA (удален модуль)
- трудно использовать COM-автоматизацию в Windows (но есть сложный UNO)
- нельзя использовать print-отладку py-скриптов в UDF Calc (рушится stdout)

Всё это, конечно, результат нехватки ресурсов у разработчиков. Но местами похоже на диверсию. Питону в LO отвели роль "золушки", о нем должны были забыть. Так и вышло. Но нет худа без добра - айтишники, сами того не зная, установили на сотни миллионов рабочих мест в мире Python вместе с LO. Сейчас, когда бурлит тема DS и Pandas, задача "догнать конкурента", внедрить мощный инструмент в Calc встала остро, и она, похоже, уже стала решаема, т. к. Питон у всех уже есть...
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

economist

#2
Благодаря крайним патчам разработчиков в версии LO 7, мне удалось запустить Pandas в Calc под Win7/8/10. Это дает нам самые быстрые вычисления для ячеек Calc из возможных (быстрее даже чем Excel). Решение доступно всем, без прав администратора и Интернета.

Итак, начнем. Сначала нам нужно вернуть в LO 7 "вырезанные" DLL-ки для сжатия данных. Затем восстановим pip - штатный установщик библиотек в Python. И лишь потом поставим им Pandas и др. "либы", не испортив ни "внешний" Python (если он есть), ни сам LO. Действуем на свой стах и риск, по пунктам:

1) Переходим в консоль или, что гораздо удобнее, в FarManager или в Total/Unreal Commander итп в подпапку ...\LibreOffice\program\, где находится файл python.exe (глубже не надо, там могут встретиться файлы-заглушки с таким же именем и сбить с толку). Удаленные DLL с расширением .pyd можно вытащить из ZIP-архива Embedded-версии Python с тем же номером, что и в LO (Far/Unreal "входят" в архивы как в папки). Номер LO-версии в формате N.N.N указан в имени папки (спасибо разрабам). В LO 7.1.3.2 - это две папки: python-core-3.7.10\lib\ и python-core-3.8.8\lib\ Какая из них и когда используется - непонятно. Вот туда (в обе папки) и копируем две разные пары файлов _bz2.pyd и _lzma.pyd из embedded-архивов, скачанных с сайта www.python.org, нужной разрядности и архитектуры. Альтернативы копированию - посложнее: правка переменной окружения PYTHONPATH на папку с .pyd или добавление в каждый ваш скрипт строки import sys;sys.path.append('C:/path/to_pyd_dir')
2) Сохраняем в папку ...\LibreOffice\program\ скрипт по ссылке с сайта разработчика pip файл: https://bootstrap.pypa.io/get-pip.py Находясь в папке program - запускаем его, набрав py get-pip.py Так можно получить pip вообще в любом "убитом" Python, даже когда Windows/AD/злой одмин начудил с правами в профилях пользователей.

3) Запускаем установку Pandas, набрав в папке python -m pip install pandas Важная буква -m заставляет искать pip.exe, начиная с текущего каталога файла с python.exe (это LO-Питон), а не в папке с "внешним" Python, который наверняка прописан в переменной окружения Path и будет вызываться без -m по умолчанию. Риск что-то установить "не в тот" Python - есть, но ничего страшного не случится. Другие полезные пакеты (например, те, что по ИНН возвращают из ЕГРЮЛ название ЮЛ/ИП, должность/ФИО директора, адрес) - ставим точно так же. Однако что-то грандиозно DS-сложное, какой-нибудь TensorFlow, Keras или PуTorch - пока "не взлетят" в LO Python. Но чем больше будет DS-ников, тем выше шанс на улучшения в будущем.

4) Есть простой способ автоматом ставить/обновлять нужные библиотеки - вписать их имена в столбик в "накопительный" TXT-файл зависимостей - !requirements.txt и запустить BAT-файл в той же папке program вот такого содержания:

python -m pip install --upgrade pip setuptools wheel
python -m pip install --upgrade -r !requirements.txt


Запускать BAT можно хоть каждый день (делаю так 2 года). Но это рискованно: если новая версия пакета X требует новую версию пакета Y - они обновятся вместе, но могут "поломать на месяц-полгода" важный для вас пакет Z, который работает только со старой версией пакета Y. Придется удалить все три пакета и поставить заново их старые версии, указав номер явно, например так: pandas<=1.2.5 Другой вариант - ждать месяцы пока разработчики пакетов допилят совместимость. Поэтому дергайте BAT "раз в квартал", на другом компьютере/виртуальном окружении, в свободное от авралов время и только если вам очень нужно "самое новое". Сразу тестируйте, и лишь потом делайте обновление "в продакшн". За пару лет - я лишь 3 раза ловил глюки и понижал версии. Обновления Windows BSOD-ят и то чаще...
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

economist

СОВЕТ: Иногда библиотека упорно не ставится и сыплет "красные" ошибки. У Windows причины есть всегда: "не те" С++ Redistributable, Net.Framework, GCC+, MSVCRT...dll, нет Visual Studio итд. Доустановка муторна (тот же Visual Studio качает 2 Гб файлов и ставится 2 часа), и поможет она не всегда. Есть план "Б", которым я нередко пользуюсь - готовые бинарные сборки: https://www.lfd.uci.edu/~gohlke/pythonlibs/ - "колеса" для установки DS-библиотек. Скачайте нужное в папку ...\LibreOffice\program\ и выполните python -m pip install <filename>
Через заранее скачанные файлы - можно ставить либы даже без Интернета и прав админа. Файлы можно прислать "себе" в запароленном архиве с зашифрованными именами файлов на рабочую почту. Конечно, действуйте ответственно и разумно, во благо родному предприятию.

Все заработало, что дальше? - Пишите скрипты! И параллельно учите Python и Pandas. На Форуме есть мои короткие примеры для Calc, Base, парсинга логов итд. Например:
https://forumooo.ru/index.php/topic,8553.0/msg,57625.html
https://forumooo.ru/index.php/topic,8531.0/msg,57501.html
https://forumooo.ru/index.php/topic,7964.0/msg,53374.html
https://forumooo.ru/index.php/topic,7949.0/msg,53223.html
https://forumooo.ru/index.php/topic,8682.0/msg,58517.html
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

economist

Типовой кейс применении Pandas в LO Calc:

Ситуация:

Во-первых, у вас в работе наверняка есть что-то важное и огромное: текстовый файл, лог-журнал, медленный от формул/форматов/строк ODS/XLS, PDF с таблицами, сложный 1С-отчет с иерархией, сохраненный в XLS/TXT, что-то большое в буфере обмена из программы N (в жизни всё это часто бывает и даже "вперемешку").

Во-вторых, вы точно знаете что Calc часть таких файлов всё же откроет, но будет страшно тупить. Смещения, объединения, группировки ячеек/строк - "сломают" Автофильтр, а значит предстоит долгая ручная нормализация. Объединить несколько таких файлов по =ВПР() и =СУММЕСЛИМН() - трудно и чревато "падениями" и долгими ожиданиями пересчета.

В-третьих, обидно осознавать что вам нужна лишь небольшая часть из всех данных. Но загружать "часть" - Calc не умеет. Из-за этого приходится делать "частичную" выгрузку средствами внешней программы. Это ловушка, ведь завтра или через час - понадобятся другие строки, другой период. А значит всё заново - выгрузка, "чистка" в Calc итд. Круг мучений замкнулся...

А вот и решение: Нужно выгрузить в TXT/XLS вообще всё "историческое", неизменяемое, за все периоды и из всех программ (пусть это будут миллионы строк - Pandas не боится). А по утрам - просто довыгружать "свежее". Pandas очистит и объединит файлы, сохранит их в компактный pickle-файл ("консерву") на сетевой диск. И теперь, если вам/другому быстро нужна какая-то сумма/цена/колво по определенному критерию - он напишет в ячейку Calc UDF-функцию с несколькими аргументами, поставит в них критерии отбора и нажмет Enter. Pandas загрузит "консерву" в RAM, посчитает и возвратит итог (или вернет нужные строки), почти молниеносно. ODS-файл с десятками таких функций будет открываться с задержкой на пересчет ячеек, зато результат при изменении аргументов (их в яч. Calc удобно сделать на раскрывающихся списках) - сразу.

Подведем итог. 5 лет назад с Python+Pandas+xlwings "расправили крылья" приунывшие от растущего "торможения" таблиц экселисты. А теперь расправим и мы! И у нас, кстати, есть три "плюса", которых нет у "соперников":

- Не нужно ставить "внешний" Python, достаточно встроенного в LO. Для  "бесправного" офисного люда это важно. Есть и portable-путь, и "партизанский".

- Не нужно платить 20 тыс. руб. за новый Excel, чтобы использовать мощь новейших DataScience-библиотек. Быстрее Pandas не считает ни одно ПО.

- Не нужен глючноватый COM-мост для работы UDF-функций. Скорость Excel+COM и Calс+UNO/RPC примерно одинакова. Calc даже чуть быстрее.

Итак, все, кому нужна скорость расчетов в Calc с миллионами строк, кто хочет получать итоги/отчеты в среднем в 5 раз быстрее и вовремя уходить с работы - ставим Pandas и... вперед в мир DS! Как конкретно вызывать функцию в ячейке и вернуть в нее значение - см. https://forumooo.ru/index.php/topic,8682.0/msg,58517.html

Питон породил ещё две сущности, ставшие "золотым стандартом" в мире DS:

- Jupyter, ныне JupyterLab - браузерная IDE/web-сервер для 100+ языков программирования (можно кодить с разных компьютеров по сети или через интернет, одновременно!) Ваш офисный компьютер с Юпитером превращается в... "сервер бизнес-аналитики"! Только представьте: коллеги открывают свой бразуер с вашим IP (по паролю) и просто выполняют запросы по "консерве", висящей в вашей RAM, не напрягая свои ПК (вам это тоже не мешает, но нагрузка на CPU и RAM, конечно, будет "прыгать"). Важно что память "сервера" на каждый новый сеанс не расходуется (она shared). Все вычисления делает ваш Python, его kernel. Испортить данные в RAM коллеги, конечно, могут. Но достать их из "консервы" - дело пяти секунд (они сами это сделают). Так Юпитер полностью меняет отчетность в бизнесе.

- Notebooks/Тетрадки, "дети Юпитера", файлы, совместившие в себе исполняемый по-ячейно код, документацию с Markdown/Latex/DrawIO, рисунки, таблицы/графики итд. Это мета-документ, новый формат знаний и "повторимых исследований" для доказательной экономики, медицины, социологии итд. На гитхабе уже 3 млн. тетрадок, а в Сети - 100M+. Волшебство Тетрадок - в простоте. А то что ячейки (программу) можно "выполнять" в произвольном порядке, хаотично, со скоростью чернового письма, и при этом значения переменных "висят", не обнуляются - делает решение задачи анализа наиболее естественным образом: итерациями. Едим слона по частям, начав с лапки.

JupyterLab крут и быстр (внутри куча модных web-технологий), но пока он не ставитя и не работает в урезанном LO Python (ставьте во внешний). Попробовав Юпитер и Тетрадки - возвращаться в DS-задачах к другим редакторам кода/IDE и форматам файлов/отчетов/документации вам не захочется. Но об этом в другой раз (если окажется что и этот раз был не зря)...
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

sokol92

Владимир.

kompilainenn

Цитата: economist от  2 июня 2021, 09:45В-третьих, обидно осознавать что вам нужна лишь небольшая часть из всех данных. Но загружать "часть" - Calc не умеет
а вот есть GSoC проект этого года по допиливанию инструмента импорта внешних данных с настройкой того, что импортирвоать. Посмотрим, что получится
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

economist

Цитата: kompilainenn от  2 июня 2021, 15:10с настройкой того, что импортировать

"Часть" данных из ODS/TXT, грубо говоря, можно и сейчас грузить, SQL-запросом с условием WHERE, через прослойку - базу данных. Но Pandas - быстрее, т.к. позволяет загрузить не часть, а именно всё, прямо в RAM, в сжатом и упорядоченном виде.

Внутренние механизмы Calc тоже хранят данные в RAM, но пересчитывают медленнее. Векторные операции Pandas эффективны из-за матричной Fortran-арифметики в модуле Numpy.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

mishich666

Цитата: economist от  2 июня 2021, 09:45он напишет в ячейку Calc UDF-функцию с несколькими аргументами
Добрый вечер. О какой UDF-функции речь? Можно пример подобного применения?

economist

В тексте выше две одинаковых ссылки на UDF-функцию, пусть будет и третья: https://forumooo.ru/index.php/topic,8682.0/msg,58517.html Там есть и файл с UDF и сам ODS и скриншот с текстом двух UDF-макросов.

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

ost

Спасибо за такой развернутый пост.
Сейчас потихоньку разбираюсь с Python, но уже понимаю, что его возможности по работе со строками, массивами (списками) не идут ни в какое сравнение с LO Basic. Возможно, многого не знаю о LO Basic, но, например, функцией split() в Python очарован тихо и навсегда. =)

По-теме. Попробовал по вашей инструкции довести до ума Python LO 7.2.0.0 Beta1 на рабочей машине.
После выполнения
Цитата: economist от  2 июня 2021, 09:41Находясь в папке program - запускаем его, набрав
Код:

py get-pip.py

Получил такое https://disk.yandex.ru/d/0KyQpgwVVWsOvQ
Вопрос классический: что делать?



sokol92

Цитата: ost от 25 июня 2021, 13:59но, например, функцией split() в Python очарован тихо и навсегда
Взята из языка BASIC один в один.
Владимир.

ost

Да. Но я об использовании функцией whitespace-символов "из коробки".

economist

Цитата: ost от 25 июня 2021, 13:59Получил такое https://disk.yandex.ru/d/0KyQpgwVVWsOvQ
Вопрос классический: что делать?

Была похожая ошибка в домене с антивирусом, прокси и VPN. Решилось установкой OpenSSL нужной разрядности + ребутнуться (ссылка с Википедии) http://slproweb.com/products/Win32OpenSSL.html
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

ost

#14
Доброго, economist.
Цитата: economist от  2 июня 2021, 09:41Другие полезные пакеты (например, те, что по ИНН возвращают из ЕГРЮЛ название ЮЛ/ИП, должность/ФИО директора, адрес) - ставим точно так же
По вашей инструкции поставил pandas в LO. Пока не пробовал (на этой машине), но ошибок при установке не получил. А вот sqlite3 не ставится. Ошибка:
ERROR: Could not find a version that satisfies the requirement sqlite3 (from versions: none)
ERROR: No matching distribution found for sqlite3


Вопрос вечный: что делать?
Спасибо.

На борту:
LO 7.2.0.2, с ним в поставке "куцый" Python 3.8.10