NewTechAudit
133

Интерактивный модуль голосования на Python

Как определить, что работа выполнена качественно, все требования соблюдены и клиенты довольны? Можно, конечно, спросить, но это не путь Джедая…

В закладки

Первым делом нужно продумать инструмент распространения, мне понравилась идея отправления ссылок на почту. Что бы еще добавить? Хочу визуализировать ответы в режиме реального времени!

Приступаем к реализации.

Ну, с опросником все понятно — гугл-форма, однозначно. Заполняем, подключаем к гугл диску, прописываем варианты ответов.

Самое интересное – это визуализация, но стандартный инструмент от google, с помощью которого можно построить графики - не позволяет осуществлять сложную предобработку данных. В качестве дополнительной фичи я хочу представить этот инструмент в качестве исполняемого файла своему руководству, что тоже недоступно при использовании стандартной визуализации в google forms.

Исходя из ограничений уже существующих инструментов, нужно поднять веб-сервис для отрисовки графиков. Просмотрев все возможные варианты решения проблемы я решила, что с этой задачей прекрасно справится библиотека plotly, которая представлена в виде платформы (на которой можно опубликовать свой интерактивный график). Преимущество этого инструмента заключается в возможности запуска инструмента в оффлайн. Документация по библиотеке, с примерами на python, есть на официальном сайте.

Для реализации задумки необходимо подключиться к API сервисам Google Drive и Plotly и получить свои API key:

tls.set_credentials_file(username=’youre username', api_key='youre api key') token = 'youre token' #переменная для дальнейшего обновления гистограммы stream_ident = dict(token=token, maxpoints=60) s = py.Stream(stream_id=token)

На Google диске нам необходимо подключиться к файлу, для этого стоит изучить этот Jupyter Notebook.

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

Преобразуем скачанный excel файл в DataFrame, передаем значения для построения гистограммы в Bar (необходимо изначально обозначить размер передаваемых массивов).

command = list(data_set().keys()).sort() points = [0]*len(list(data_set().keys())) val=[0]*len(list(data_set().keys())) clr=[0]*len(list(data_set().keys())) #построение графиков trace = go.Bar(x=command, y=points, xaxis='x2', yaxis='y2', marker=dict(color=clr), name='Team', textfont=dict( family="Courier New, monospace", size=15, color="#003300"), text=val, textposition="outside", # stream=stream_id,) data=[trace] layout = go.Layout( xaxis2=dict( domain=[0,1], anchor='y2', categoryorder= 'category ascending', tickfont=dict(size=16, family="Courier New, monospace", color="#7f7f7f"), automargin=True), yaxis2=dict( domain=[0,1], rangemode='nonnegative', autorange=True, dtick=1, anchor='x2', categoryorder= 'category ascending', tickfont=dict(size=16, family="Courier New, monospace", color="#7f7f7f") )) fig = go.Figure(data=data, layout=layout) url = py.plot(fig, filename='simple-inset-stream', auto_open=False) webbrowser.open_new(url+'.embed')

Обратите внимание, что в конце url-адреса нужно добавить строку ‘.embed’, это необходимо для корректной визуализации графика. Вариант без использования embed вас не порадует – подписи по оси х не отобразятся полностью (угол наклона = 90), также этот параметр растягивает график по размеру окна браузера и т.д.

Пора переходить к самой интересной части. Так как я хочу видеть изменения графика в режиме реального времени, мне нужно использовать стриминг в plotly. C интервалом в 1 секунду, я буду читать файл с диска и передавать новые массивы данных в plot. В ходе настройки графика я решила выделить самый большой столбец диаграммы другим цветом. Сделать это оказалось достаточно просто (в параметр color мы можем передать массив значений, сформированный в соответствии с необходимым условием).

if __name__ == '__main__': s.open() while True: data_set() labels = list(data_set().keys()) values = [x-1 for x in list(data_set().values())] clrs = ["#009933" if x == max(values) else '#66FFFF' for x in values] s.write(dict(x=labels, y=values,text=values, marker=dict(color=clrs), type='bar')) s.close()

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

В конечном счете получаем информативную сводку отзывов по направлениям и с удивлением узнаем зоны развития проекта.

{ "author_name": "NewTechAudit", "author_type": "editor", "tags": ["\u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435","\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f","7f7f7f","66ffff","009933","003300"], "comments": 0, "likes": 4, "favorites": 1, "is_advertisement": false, "subsite_label": "newtechaudit", "id": 113588, "is_wide": false, "is_ugc": false, "date": "Thu, 19 Mar 2020 18:36:59 +0300", "is_special": false }
0
Комментариев нет
Популярные
По порядку

Прямой эфир