Использование Ipywidgets с фреймами данных - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь научиться создавать взаимодействия с фреймворком данных. Я уже читал Ipywidget do c, пытаясь получить как можно больше, плюс несколько блогов с практическими рекомендациями, но когда дело доходит до реального мира, почему-то я не могу воспроизвести те же результаты. Хотя я знаю, что это обычное дело.

В любом случае, пока я пробовал это сделать:

week = [value for value in canali_weekly.index.get_level_values(level=1).unique()]
values = [value for value in canali_weekly.columns]

@widgets.interact(
    
    x = widgets.IntSlider(min=0, max=canali_weekly["Self"].max(), step=10, description='N. Self minime vendute:'),
    
    s = widgets.IntRangeSlider(
        value = [max(week)-1, max(week)],
        min=min(week),
        max=max(week),
        step=1,
        description='Confronto settimane:'        
    ),
    
    m = widgets.SelectMultiple(
        options=values,
        #rows=10,
        description='Metriche:',
        disabled=False
    )
)

def filtra(x,s,m):
    
    return canali_weekly.loc[ (canali_weekly["Self"] > x,s), m]

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

first try

So I started with this new code :

week = [value for value in canali_weekly.index.get_level_values(level=1).unique()]

s = widgets.IntRangeSlider(
        value = [max(week)-1, max(week)],
        min=min(week),
        max=max(week),
        step=1,
        description='Confronto settimane:'        
    )

def filtra(s):
    display(canali_weekly.loc[ (slice(None),s), ["Spending"]])

s.observe(filtra, 'value')

display(s)

The problem is that in this case the dataframe is not shown.

enter image description here

ADDENDUM:

Here a repr of how is the dataframe:

channel = ["A", "B", "C", "D"] 
week = [1,2,3,4,5,6,7,8,9]
columns = ["col1","col2","col3"]

index = pd.MultiIndex.from_product([channel,week], names=('channel', 'week'))
df = pd.DataFrame(np.random.randn(36, 3), columns=columns, index=index)

UPDATE:

I tried with this new code, very similar to second one I pasted here:

def crea_opzioni(array):
    unique = array.unique().tolist()
    unique.sort()
    unique.insert(0, "ALL")
    return unique

dropdown_week = widgets.Dropdown(options = crea_opzioni(canali_weekly.index.get_level_values(level=1)))


def filtra_dati(change):
    if (change.new == "ALL"):
        display(canali_weekly)
    else:
        display(canali_weekly.loc[(slice(None), change.new), ["Spending"]])

dropdown_week.observe(filtra_dati, names='value')

display(dropdown_week)

Even though the dataframe is not rendered in the noteboook, I can see it in the log tab

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

1 Ответ

0 голосов
/ 06 августа 2020

Вот мое решение:

output = w`enter code here`idgets.Output()

def crea_opzioni(array):
    unique = array.unique().tolist()
    unique.sort()
    unique.insert(0, "ALL")
    return unique

week = [value for value in canali_weekly.index.get_level_values(level=1).unique()]

intRange_week = widgets.IntRangeSlider(value = [max(week)-1, max(week)], min=min(week), max=max(week), step=1, description='Confronto settimane:')
#widgets.Dropdown(options = crea_opzioni(canali_weekly.index.get_level_values(level=1)))
#dropdown_canali = widgets.Dropdown(options = crea_opzioni(canali_weekly.index.get_level_values(level=0)))


def filtra_dati(selezione):
    output.clear_output()
    df = canali_weekly.loc[(slice(None), slice(selezione[0],selezione[1])), ["Spending"]]  
    with output:
        display(df)
        
def dropdown_week_eventhandler(change):
    filtra_dati(change.new)       

intRange_week.observe(dropdown_week_eventhandler, names='value')

display(intRange_week`enter code here`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...