Интерактивная визуализация — выберите CSV-файл для визуализации

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

Моя папка данных имеет следующую структуру:

+-- it_features
|   +-- it_2017-01-20--2017-01-27.csv
|   +-- it_2017-01-27--2017-02-03.csv
|   +-- it_2017-02-03--2017-02-10.csv

и так далее (есть еще много файлов, я просто сообщаю некоторые из них для простоты).

Пока я могу получить доступ и получить все данные, содержащиеся в папке:

import os
import pandas as pd
path = os.getcwd()
file_folder = os.path.join(path,'it_features')


for csv_file in os.listdir(file_folder): 
    print(csv_file)
    file = os.path.join(file_folder,csv_file)
    df = pd.read_csv(file)
    #following code....

  

Я хотел бы создать интерактивную визуализацию, которая позволяет пользователю выбирать имя файла (например, it_2017-02-03--2017-02-10.csv) и отображать данные этого файла.

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

Мой простой код:

import os
import pandas as pd
path = os.getcwd()
file_folder = os.path.join(path,'it_features')
file = os.path.join(file_folder,'it_2020-02-07--2020-02-14.csv') # Here I insert my filename
df=pd.read_csv(file)
ax=df.value_counts(subset=['Artist']).head(10).plot(y='number of songs',kind='bar', figsize=(15, 7), title="7-14 February 2020")
ax.set_xlabel("Artist")
ax.set_ylabel("Number of Songs Top 200")

Что генерирует следующий сюжет: Барплот

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

Я видел, что с помощью Plotly можно создавать выпадающие меню, но в различных примерах (https://plotly.com/python/dropdowns/), похоже, он не выбирает, а затем загружает данные.

Я также видел этот код (Kaggle code), который, кажется, делает то, что Я хотел сделать: вы можете выбрать регион и построить данные из этого региона.

Основная проблема в том, что он просто создает большой уникальный фрейм данных со штатами США, а затем создает трассировку для каждого из них.

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

Является ли это возможным?

EDIT: решение, предложенное gherka, работает отлично, но я хотел бы иметь решение внутри Plotly, используя его раскрывающееся меню.


person Mattia Surricchio    schedule 26.08.2020    source источник
comment
Будут ли ваши пользователи взаимодействовать с приложением на веб-странице или исключительно через блокнот Jupyter?   -  person gherka    schedule 26.08.2020
comment
@gherka Только jupyter, в моем блокноте все записано и самодостаточно   -  person Mattia Surricchio    schedule 26.08.2020
comment
Если вы используете jupyter, то использование ipywidgets (как указано в ответе ниже) может быть хорошим выбором, но если вы хотите вернуться к python и IDE позже, вы также можете использовать messagebox из tkinter.   -  person Cool Cloud    schedule 26.08.2020


Ответы (2)


Поскольку вы работаете в Jupyter Notebook, у вас есть несколько вариантов.

Некоторые библиотеки визуализации будут иметь встроенные виджеты которые вы можете использовать, однако они часто требуют от вас запуска сервера или предоставления обратного вызова javascript. Для независимого от библиотеки подхода вы можете использовать ipywidgets. Эта библиотека предназначена специально для создания виджетов для использования в Jupyter Notebooks. Документация находится здесь.

Чтобы создать простое раскрывающееся меню со статической гистограммой под ним, вам понадобятся три виджета — Label для описания раскрывающегося списка, Dropdown и Output. VBox для их размещения.

from ipywidgets import VBox, Label, Dropdown, Output

desc = Label("Pick a .csv to plot:")

dropdown = Dropdown(
    options=['None', 'csv1', 'csv2', 'csv3'],
    value='None',
    disabled=False)

output = Output()

dropdown.observe(generate_plot, names="value")

VBox([desc, dropdown, output])

введите здесь описание изображения

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

Вот функция для создания базовой гистограммы seaborn с настраиваемым источником данных. Обратите внимание, что мне пришлось явно указать plt.show() — иначе графики не будут отображаться.

def generate_plot(change):
    with output:
        output.clear_output() # reset the view
        if change["new"] != "None":
            data = pd.read_csv(...) # your custom code based on dropdown selection
            sns.catplot(x="Letters", y="Numbers", kind="bar", data=data)
            fig = plt.figure()
            plt.show(fig)

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

Для более подробного ознакомления с тем, как добавить интерактивность на matplotlib графики с помощью ipywidgets, я нашел это руководство весьма полезно.

person gherka    schedule 26.08.2020
comment
Это круто! Не могли бы вы привести пример функции generate_plot с Seaborn? Я пытался сам заставить это работать, но, к сожалению, у меня не получилось - person Mattia Surricchio; 26.08.2020
comment
Конечно. Отредактировано, чтобы включить образец функции. - person gherka; 26.08.2020
comment
Мне удается заставить его работать, работает отлично. Я подожду, чтобы принять ответ, так как я хотел бы также иметь альтернативу внутри Potly, используя его раскрывающееся меню. Тем не менее, это решение довольно хорошо - person Mattia Surricchio; 27.08.2020

tkinter — это очень распространенный фреймворк пользовательского интерфейса для Python, который является частью стандартной библиотеки. Основываясь на ответах на аналогичный вопрос, вы можете использовать это:

from tkinter.filedialog import askopenfilename
filename = askopenfilename()

который открывает стандартное окно файлового менеджера.

person Warlax56    schedule 26.08.2020
comment
@MattiaSurricchio Да, это будет - person Cool Cloud; 26.08.2020
comment
на самом деле, я пропустил, что это было в jupyter. Это предложение может не работать в jupyter, но будет работать в стандартной среде python, работающей на вашем компьютере. - person Warlax56; 26.08.2020