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

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

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

juceser

По последней команде fig.show() даже выплюнул график поверхности в браузере самостоятельно.  :beer:

Теперь остается вопрос можно ли связать код Питона с LO по кнопке, как я изначально хотел, скажем создать процедуру в модуле вроде -


Определение функции

def xyz(x, y):
    return 2*x**2 - y**2

Исходные данные

x0, xk, dx = -1, 1, 0.2
y0, yk, dy = -1, 1, 0.2
nx = round((xk-x0)/dx) + 1
ny = round((yk-y0)/dy) + 1

Построение графика

u, v = np.mgrid[x0:xk:nx*1j, y0:yk:ny*1j]
z3 = xyz(u, v)
fig = plt.figure()
plt.suptitle('Поверхность')
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(u, v, z3, cmap='inferno');
plt.show()

И нажав на кнопку получить график в LO.

Как правильно оформить такую процедуру в Питоне и как к ней обратиться в LO?

economist

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

Для уверенного использования Python в LibreOffice нужно освоить расширение APSO с пошаговой отладкой и консолью.

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

juceser

Прогоняю сейчас этот же код в консоли APSO. Ну что сказать, это куда утомительней, чем даже в cmd после запуска Python, там мне удавалось копировать целые блоки и интерпретатор это понимал, здесь нет.
Но операторы проходят, например import pandas прошел без проблем, нет ошибки, значит видит библиотеки.

Столкнулся, например, с тем что код присвоения нескольким переменным значений, прошедший без проблем в интерпретаторе Питона, в APSO вызвал непонимание -


>>>x0, xk, dx = -2.0, 2.0, 0.1
  File "<console>", line 1
    0, xk, dx = -2.0, 2.0, 0.1
           ^^^^^^^^^
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
>>> 0, xk, dx := -2.0, 2.0, 0.1
  File "<console>", line 1
    0, xk, dx := -2.0, 2.0, 0.1
              ^^
SyntaxError: invalid syntax
>>> x0, xk, dx := -2.0, 2.0, 0.1
  File "<console>", line 1
    x0, xk, dx := -2.0, 2.0, 0.1
               ^^
SyntaxError: invalid syntax
>>> x0 = -2.0
>>> xk = 2.0
>>> dx = 0.1


По одному он значения присвоил.
Получается APSO это не окно обращения к тому же самому Питону, что мы запускали в командной строке, а свой собственный интерпретатор со своим собственным и отличающимся от основного синтаксиса языком, что совсем печально и вынуждает править код под свою версию языка даже на таких элементарных вещах.

juceser

Уже следующая команда ставит в тупик -


>>> df = pd.DataFrame(columns=['x', 'y', 'g', 'z'])
>>> for i in range(n):
...     x = x0 + i*dx
...     df.loc[len(df.index)] = [x, y(x), g(x), z(x)]
...
Traceback (most recent call last):
  File "<console>", line 3, in <module>
  File "<console>", line 2, in z
TypeError: 'module' object is not callable
>>> for i in range(n):
...     x = x0 + i*dx
...     df.loc[len(df.index)] = [x, y(x), g(x), z(x)]
...
Traceback (most recent call last):
  File "<console>", line 3, in <module>
  File "<console>", line 2, in z
TypeError: 'module' object is not callable
>>>



При том что было ранее задано import pandas as pd без проблем, те обращение к модулю законно.
В консоли Питона проблем не было.

juceser

С предыдущей ошибкой разобрался, там ошибка была в написании функции z, пропущен sin и вместо math.sin(x) было math(x). При этом синтаксический контроль был пройден.

Сейчас завис на поверхности -

def xyz(x, y):
    return ((3*math.exp(-2*y))*(x**2)) - ((2*math.cos(x))*(math.sin(y))*(y**2))

x0, xk, dx = -1, 1, 0.1
y0, yk, dy = -1.2, 1.2, 0.1
nx = round((xk-x0)/dx) + 1
ny = round((yk-y0)/dy) + 1   

u, v = np.mgrid[x0:xk:nx*1j, y0:yk:ny*1j]
z3 = xyz(u, v)
fig = plt.figure()
plt.suptitle('Поверхность')
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(u, v, z3, cmap='inferno');
plt.show()

Код не проходит, получается что функция слишком сложная что-ли, хотя она считаемая.

---------------------------------------------------------------------------
TypeError                                Traceback (most recent call last)
Cell In[39], line 9
      6 ny = round((yk-y0)/dy) + 1   
      8 u, v = np.mgrid[x0:xk:nx*1j, y0:yk:ny*1j]
----> 9 z3 = xyz(u, v)
    10 fig = plt.figure()
    11 plt.suptitle('Поверхность')

Cell In[39], line 2, in xyz(x, y)
      1 def xyz(x, y):
----> 2    return ((3*math.exp(-2*y))*(x**2))

TypeError: only length-1 arrays can be converted to Python scalars

При этом если функцию упростить до


def xyz(x, y):
    return (y*(x**2))
x0, xk, dx = -1, 1, 0.1
y0, yk, dy = -1.2, 1.2, 0.1
nx = round((xk-x0)/dx) + 1
ny = round((yk-y0)/dy) + 1   

u, v = np.mgrid[x0:xk:nx*1j, y0:yk:ny*1j]
z3 = xyz(u, v)
fig = plt.figure()
plt.suptitle('Поверхность')
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(u, v, z3, cmap='inferno');
plt.show()


то строит поверхность.

juceser

Итак решение полностью найдено - все выполнено на платформе Anaconda через jupyter notebook.
Далее весь код засовываем в консоль и все интерактивно отображается в браузере.

Предыдущая проблема также решена, оказывается здесь нужно обращаться почему-то не к модулю math, как делали в графиках, а к модулю numpy as np -

def xyz(x, y):
    return ((3*np.exp(-2*y))*(x**2)) - ((2*np.cos(x))*(np.sin(y))*(y**2))

# Исходные данные   

x0, xk, dx = -1, 1, 0.1
y0, yk, dy = -1.2, 1.2, 0.1
nx = round((xk-x0)/dx) + 1
ny = round((yk-y0)/dy) + 1   

# Построение графика

u, v = np.mgrid[x0:xk:nx*1j, y0:yk:ny*1j]
z3 = xyz(u, v)
fig = plt.figure()
plt.suptitle('Поверхность')
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(u, v, z3, cmap='inferno');
# Сохранение графика в PNG
plt.savefig("plot_surf.png", format="png")  # Также можно сохранить как JPG или SVG, изменив формат
plt.show()

Тогда этот же код спокойно работает.

Да, осталась непонятка с сохранением графика plt.savefig, поскольку функция не терпит в имени указание абсолютного пути, но пусть уж сохраняет (а она сохраняет) в профиле. Хотелось бы большего, сохранить весь вывод скажем в pdf или html, и это вроде тоже как должно работать, но File - Save and export Notebook As выдает в меню все варианты серым. Ладно, будем считать, что это не работает. Задача в целом выполнена без LO.

economist

Моржовый оператор := из новинок, такое лучше не использовать, в старых LO не работает.

APSO использует тот же интерпретатор LO Python, но вот парсер при отладке использует свой, медленный и неудобный. И альтернатив больше нет, точнее они сложные. Настройка Visual Studio Code с отладкой в LO Python с uno пробегала в видео на Ютьюбе, но там все очень непросто.

Использовать Anaconda можно, но это минус 100-500 Гб у диска за полгода и еще один слой абстракции, который у практикующих дата-сайентистов на глазах выходит из моды из-за чрезмерной сложности, непоняток и лицензионных ограничений. Ее время ушло. Если в Анаконде что-то серьезно ломается - все начинается заново. При этом сейчас появился шикарный инструмент uv

Рисовать 3D поверхности лучше не в закосневшем Matplotlib, а в Plotly/Bokeh итд, там их можно плавно вращать и можно обойтись без зубодробительного Numpy/Matlab-синтаксиса (Pandas появилось именно как ответ на это неудобство).
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

economist

Цитата: juceser от  5 апреля 2025, 19:45непонятка с сохранением графика plt.savefig, поскольку функция не терпит в имени указание абсолютного пути

Это не непонятка, а забота о безопасности. Вы выполняете код в Jupyter, в web-сервере Tornado. Он ограничивает права на запись web-каталогом запуска, т.е. вы и удаленные пользователи не сможете обозреть другие папки и туда что-то сохранять/удалять файлы.   
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...