Pull to refresh

Comments 10

Не совсем ясно как отображать отсчеты графика в реальном времени. Например когда числа поступают с улицы из последовательного COM пота или TCP сокета.

Поступают они в массив — его и отображайте. Несколько раз в секунду сможет перерисовываться.

  1. Бесплатных инструментов много

  2. Интерактивных графиков тоже много, в том числе бесплатных

  3. Ты не скроешь код построения графика (да и зачем - не понятно, если данные из csv), потому что большинство способов сделать ехе из питона - это самораспаковывающийся архив и открыть его можно архиватором и взять напрямую код

  4. Это что вообще за чушь? Как сделаешь билдер графиков так он и будет работать. Я больше скажу, большинство решений тоже не создаёт никаких временных файлов. Пишем программу - один ехе, запускаем и она работает без проблем. Ещё и быстро

  5. А это - сомнительное "достижение", требующее постоянно иметь под рукой документацию по библиотеке. Т.к. нет возможности просто изучить инструмент визуально и посмотреть что и как изменится. В чем проблема не использовать мышку - не понятно. У вас нет мышки? Уверен - есть.

  6. Кроссплатформенность - давно не проблема и не крутая фича.

А вот реальные недостатки:

  1. Код всегда открытый, даже если действительно требуется его скрыть нужно использовать разные костыли

  2. Работа с большим количеством данных - черевато потере работоспособности

  3. Кроссплатформенность не такая и кроссплатформенная, потому что зависимости, которые тянет питон зачастую могут не иметь кроссплатформенного решения. Да, не все а даже большинство библиотек для питона являются бинарными и подключаются динамически (dll, so, o, ...)

  4. График использует почту способ использования данных - мы просто их ему передаём (копируем), а он рисует. В крупных программах, нацеленных на работу с большим количеством данных используются датасеты, которые могут не хранить все данные в оперативной памяти. (Хотя тут повтор со вторым пунктом)

Я просто оставлю это здесь

pd.read_csv('1.csv')[['n','k']].plot()

mathplotlib как по мне - слишком уж "развесистый". Если не копипастить из хаутуя в хаутуй, а разбираться из чего оно состоит и как работает - такое себе. Для задачки "быстро визуализировать набор данных" проще взять pandas, а если нужно что-нибудь совсем-совсем легковесное без лишних зависимостей практически без "порога вхождения" - то pygal.

На python c либами доступны все актуальные способы визуализации из других языков программирования (около ~50).

Pandas не просто прячет "все ужасы Matplotlib" внутрь простого метода df.plot(), но и поддерживает несколько других мощных либ рисования, прямо из коробки df.plot(..., backend=<name>)

altair популярная либа декларативной графики, чертит в vega

bokeh в лице pandas_bokeh

echarts свежак из мира Apache. Мощная, юзает свой метод df.eplot()

hvplot или holoview, чертит в bokeh, но может в matplotlib и plotly

plotly еще одна очень популярная либа, чертит сама или методом iplot из либы cufflinks

pdvega чертит в vega, см. также altair

Графики - это всегда итерации в сторону прекрасненького, поэтому их сразу правильнее чертить в JupyerLab - ведь в нем многие сложные вещи окажутся еще проще (автоналожение графиков при вызове неск. df.plot() в одной ячейке, "кристальный" вывод в SVG, доступ коллегам в LAN/WAN как веб-приложения, добавление интерактивности - списков, кнопок итд).

Спасибо за ваш комментарий, аггрегирует много полезных либ. От себя добавлю что plotly - та еще ботва, во всяком случае на фронте. Куча пуллреквестов с фиксами висят с табличкой СМЕРЖИМ, КОГДА ДАДИТЕ НАМ ДЕНЕГ, ну и в целом эти ребята очень меркантильные и неторопливые, не рекомендую. Документация полный трэш. Столкнулся с plotly потому, что на момент выбора bokeh прибывал в забвении.

Данные почти всегда требуют предобработки. Ее возможности в gnuplot намного уступают той же Pandas в JupyterLab с коллаборацией и web-шарингом из коробки. GNUPlot, MS LogParser итп утилиты сослужили хорошую службу до эпохи Pandas/Jupyter. Но времена изменились.

А можно попросить наглядный пример одной из ключевых возможностей pandas, недоступных в gnuplot? Интересуюсь, поскольку python в своей работе не использую, но ваше столь резкое сравнение заставляет задуматься

P.S. Речь именно о предварительной обработке имеющихся данных.

Хм, попробую. В работе с графиками много сил отнимают подписи, ховеры итп штуки. Это работа с округл. числами и текстом, срезами, спецсимволами и эмоджи итп. В Питоне строковые операции очень хорошо реализованы. В данных могут быть "дыры", ошибки, пустоты, и их придется обработать. Но Pandas игнорит пустоты или ловко их затирает.

Прямо сейчас написал полезняшку для читателей Хабра. Например, в вашей таблице есть два столбца: "было" и "стало". Курс USD 10/01/23 был 55.3, сегодня 90.69 - но людям хочется рядом с 55.3 и 90.69 увидеть понятное без слов: ▲35.39(64%) То есть мы видим что $ вырос на 35 руб. или на +64%.

Предположим вам нужно это сделать в огромной таблице, скажем на 1 млн. строк. В Pandas мы работаем с целыми столбцами (сериями) и плюем на пустоты до самого конца:

df['ИзмКурса'] = izm(df.Было, df.Стало)

Вот так, одной строкой за 1 секунду вы получите нужное. В любой таблице. С любыми показателями, даже с пустотами.

Но чтобы это сработало, напишем UDF-функцию, в которой сила Pandas и проявляется:

def izm(before, after):
'''Вернет столбец из строк вида '▲300(15%)' для 2-х столбцов до/после.
Если изменений нет, то вернет '-' (c) economist75 '''
izm = after - before
izm = izm.fillna(0).apply(lambda x: '▼' if x<0 else '▲' ) + izm.astype(str) \
+ '(' + (abs(izm/before).round(2)*100).fillna(0).astype(int).astype(str) + '%)'
return izm.replace({'▲(0%)':'-'}).replace({'▲0(0%)':'-'})

Я не будут повторять код для gnuplot и не ожидаю что кто-то это сделает. Уверен что это будет намного больше и дольше. У меня ушло на написание функции 8 минут.

Sign up to leave a comment.

Articles