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

#python #jupyter-notebook #data-visualization #interactive #plotly-python

#python #jupyter-ноутбук #данные-визуализация #интерактивный #plotly-python

Вопрос:

Я пишу код интерактивной визуализации с использованием 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), который, похоже, делает то, что я хотел сделать: вы можете выбрать регион и отобразить данные из этого региона.

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

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

Возможно ли это?

РЕДАКТИРОВАТЬ: решение, предложенное gherka, работает отлично, но я хотел бы иметь решение внутри Plotly, используя его выпадающее меню.

Комментарии:

1. Ваши пользователи будут взаимодействовать с приложением на веб-странице или исключительно через jupyter notebook?

2. @gherka Только jupyter, все написано и «автономно» внутри моего ноутбука

3. Если вы используете, jupyter то использование ipywidgets (как указано в ответе ниже) может быть хорошим выбором, но если вы хотите вернуться к python и IDE позже, вы также можете использовать messagebox from tkinter .

Ответ №1:

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

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

Чтобы создать простой выпадающий список со статическим столбчатым графиком внизу, вам понадобятся три виджета — 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 , я нашел это руководство весьма полезным.

Комментарии:

1. Это здорово! Не могли бы вы, пожалуйста, привести пример функции generate_plot с помощью seaborn? Я пытался заставить это работать, но, к сожалению, у меня не получилось

2. Конечно. Отредактировано, чтобы включить пример функции.

3. Мне удается заставить это работать, работает отлично. Я подожду, чтобы принять ответ, так как я хотел бы также иметь альтернативу внутри Potly, используя ее выпадающее меню. Тем не менее, это решение довольно хорошее

Ответ №2:

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

 from tkinter.filedialog import askopenfilename
filename = askopenfilename()
  

после чего появляется стандартное окно проводника файлов.

Комментарии:

1. @MattiaSurricchio Да, это будет

2. на самом деле, я пропустил, что это было в jupyter. Это предложение может не работать в jupyter, но будет работать в стандартной среде python, запущенной на вашем компьютере