Интерактивный блокнот с пандами и блокнотом Jupyter

У меня есть данные в пандах DataFrame, и я хочу создать интерактивную диаграмму, которая позволяет мне выбирать количество дней, а также строить диаграмму для значений в каждой из категорий в столбце «категория».

Вот как выглядит мой код/данные:

import numpy as np
import pandas as pd

categories=('A','B','C')

data = {
            'days':      np.random.randint(120, size=100), 
            'category':  np.random.choice(categories, 100),
            'value':     100.0 * np.random.random_sample(100)
       }

df = pd.DataFrame(data)

print(df)

   category  days      value
0         A     4  77.383981
1         A    31  63.011934
2         A     5   1.165061
3         C    59  23.588979
4         A    57  14.906734
5         C   106  33.366634
6         A    29  90.658570
7         B    25  16.137490
8         A   118  34.526302
9         C    76   4.111797
10        A    11  30.195917
..      ...   ...        ...
90        A    64  37.529774
91        A    76   3.771360
92        C   112  93.948775
93        C    14  34.855189
94        B    64  83.106007
95        A    10  78.346319
96        B    86  66.645889
97        A    46  12.969012
98        C    29  57.925427
99        A    59  34.526146

[100 rows x 3 columns]

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

Как мне это сделать с помощью pandas (или matplotlib)?


person Homunculus Reticulli    schedule 15.01.2017    source источник
comment
(1) Не могли бы вы рассказать подробнее, что означает интерактивный сюжет в jupyter? Насколько я понимаю, jupyter уже довольно интерактивен, так что вызов ячейки с новым значением создает другой график. (2) Сколько дней? Одно значение, например 42? Как бы выбрать количество дней?   -  person ImportanceOfBeingErnest    schedule 16.01.2017
comment
@ImportanceOfBeingErnest: (1) Я впервые столкнулся с этой функцией в Jupyter, посмотрев это видео: youtube. com/watch?v=ZrRpN_IrcBA (концепция была введена примерно в 24:50). (2) Количество дней — целое число. Интерактивные виджеты позволяют выбрать значение из раскрывающегося списка.   -  person Homunculus Reticulli    schedule 16.01.2017
comment
Это была бы часть информации, которую можно было бы включить в вопрос. См. обновленный ответ о том, как реализовать это раскрывающееся меню.   -  person ImportanceOfBeingErnest    schedule 16.01.2017


Ответы (2)


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

numer_of_days = 42
df_filtered= df.loc[df['days'] < numer_of_days]  # use operators like ==, >=, <, etc.
df_filtered[["category", "value"]].boxplot( by="category", return_type='axes')

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


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

import numpy as np
import pandas as pd
from ipywidgets import interact
%matplotlib notebook

categories=('A','B','C')

data = {
            'days':      np.random.randint(12, size=100), 
            'category':  np.random.choice(categories, 100),
            'value':     100.0 * np.random.random_sample(100)
       }

df = pd.DataFrame(data)

def select_days(number_of_days):
    df_filtered= df.loc[df['days'] == int(number_of_days)] 
    ax = df_filtered[["category", "value"]].boxplot( by="category", return_type='axes')
    ax["value"].set_title("Day " + number_of_days)
    print df_filtered

days = [str(day) for day in np.arange(12)]

interact(select_days, number_of_days=days)

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

person ImportanceOfBeingErnest    schedule 16.01.2017

Как отобразить коробку, раздачу и скрипичный сюжет

f, axes = plt.subplots(5, 3, figsize=(20, 20))
colors = ["r", "g", "b", "m", "c"]

count = 0
for i in houseNumData:
    sb.boxplot(houseNumData[i], orient = "h", color = colors[count], ax = axes[count,0])
    sb.distplot(houseNumData[i], color = colors[count], ax = axes[count,1])
    sb.violinplot(houseNumData[i], color = colors[count], ax = axes[count,2])
    count += 1
person Terence Hwang    schedule 18.10.2020
comment
Я рекомендую вам объяснить свой код, чтобы ОП мог понять, как внедрить решение в постановку задачи ОП. - person Joe Ferndz; 18.10.2020