Dash не работает (раскрывающийся список и гистограмма)

Кажется, я не могу создать свою панель инструментов, и основная проблема заключается в раскрывающемся списке и графике (гистограмма). Я пробовал большинство продуктов, но я все еще не могу понять, в чем проблема. Кто-нибудь знает, что не так с моим кодом? «Население» — это в основном «родная страна».

Я загрузил свои данные здесь: https://github.com/standatagithub/cpsdata/blob/main/cpsdata.csv

Это мой код:

import dash
from jupyter_dash import JupyterDash  # pip install dash
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
import plotly.graph_objs as go
from dash.dependencies import Input, Output

df = pd.read_csv(r'C:\Users\mrsta\OneDrive\Desktop\cpsdata.csv')

app = JupyterDash()


#AppLayout
app.layout = html.Div([
    
            html.H1("Population in a city", style = {'text-align': 'center'}),
    
            dcc.Dropdown(
                id='population-dropdown',
                options=[{'label': i, 'value': i} for i in list(df.Native_Country_of_Father.unique())],
                placeholder = "Please select..",
                searchable=True
            ),
           
            dcc.Slider(
                id='year-slider',
                min=df['Year'].min(),
                max=df['Year'].max(),
                value=df['Year'].min(),
                step=None,
                marks = {str(Year): str(Year) for Year in df['Year'].unique()}
            ),
    
            dcc.Graph(id='graph-with-slider'),
            
     
        ],
        style = {'width': '48%', 'display': 'inline-block'})


#App CallBack

@app.callback(
    Output('graph-with-slider', 'figure'),
    [Input('year-slider', 'value'),
     Input('population-dropdown','value')])

#Figure Update

def update_figure(selected_year, selected_population):
    filtered_df = df[df['Native_Country_of_Father']] == selected_population
    filtered_df = filtered_df[filtered_df.Year == selected_year]
    traces = []
    for i in df.Native_Country_of_Father.unique():
        df_by_population = filtered_df[filtered_df['selected_population'] == i]
        traces.append(go.Bar(
             x=df_by_population['City'],
             y=df_by_population['Native_Country_of_Father'], #Numberofpopulation
             text=df_by_continent['City'],
             barmode='stack'),
            name=i
        )
                     
    return {
        'data': traces,
        'layout': go.Layout(
            margin = {'l': 40, 'b': 40, 't': 10, 'r': 10},
            legend = {'x': 0, 'y': 1},
            hovermode='closest'
        )
    }


if __name__ =='__main__':
    app.run_server(mode = "external")

Это мой фрейм данных и сообщение об ошибке, которое я получил:

Dash не работает (раскрывающийся список и гистограмма)

Dash не работает (раскрывающийся список и гистограмма)

Расширенное первое сообщение об ошибкеDash не работает (раскрывающийся список и гистограмма)

Dash не работает (раскрывающийся список и гистограмма)

Расширенное второе сообщение об ошибкеDash не работает (раскрывающийся список и гистограмма)

Dash не работает (раскрывающийся список и гистограмма)

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

Dash не работает (раскрывающийся список и гистограмма)

Каково значение оси Y? В представленных данных нет числового столбца для населения.

r-beginners 03.05.2022 04:37

@ r-beginners, разве он не подсчитает количество населения по оси Y самостоятельно? Хорошо .. Я думаю, вы правы, я только что посмотрел на свою сюжетную книгу, и у меня была функция groupby.count(), которая сделала это. Как бы вы добавили эту функцию обратного вызова приложения?

dspassion 03.05.2022 04:41

Он не будет подсчитываться автоматически, поэтому вам нужно будет сгруппировать их вместе и подвести итоги.

r-beginners 03.05.2022 04:47

@r-beginners Я добавил это filtered_df = filtered_df.groupby('City').count().reset_index(), чтобы сгруппировать их, но, похоже, это не работает.

dspassion 03.05.2022 04:55

Используется ли ползунок для выбора одного года? В основном возвращаются начальное и конечное значения.

r-beginners 03.05.2022 05:08

@r-beginners Да, это выбор за один год, но я не могу понять, что вы имели в виду, когда возвращаются начальные и конечные значения.

dspassion 03.05.2022 05:18

Давайте продолжить обсуждение в чате.

dspassion 03.05.2022 08:01
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Было несколько факторов, которые мешали ему работать. Во-первых, выпадающие списки не появляются. Причина этого в том, что данные содержат nan и должны быть удалены. В результате был удален список dd_list. Затем ползунок меняется на ползунок диапазона. Значение по умолчанию — минимум и минимум года плюс 1. Здесь это 2005 год. Далее, поскольку мы просматриваем график, не рисуя все данные сразу, мы отображаем отфильтрованные кадры данных. Тип гистограммы сгруппирован, но ожидаемый результат не в групповом режиме, поэтому он отключен. Возврат функции обновления графика переписан только на рис. График обновляется путем изменения значения с правой стороны ползунка. selected_yaer1 — это значение справа. Эта спецификация была сделана, чтобы понять возвращаемое значение ползунка. Если ползунок используется как есть, код необходимо будет изменить, поскольку условие состоит в том, что ползунок должен быть больше или равен начальному году и меньше или равен конечному значению. Если выбор года должен быть одним годом, его нужно будет изменить на раскрывающийся список или переключатель.

import dash
from jupyter_dash import JupyterDash
from dash import html
from dash import dcc
import pandas as pd
import plotly.graph_objs as go
from dash.dependencies import Input, Output

url = 'https://raw.githubusercontent.com/standatagithub/cpsdata/main/cpsdata.csv'
df = pd.read_csv(url, sep=',')
dd_list = df.Native_Country_of_Father.dropna().unique()

app = JupyterDash()

#AppLayout
app.layout = html.Div([
    
            html.H1("Population in a city", style = {'text-align': 'center'}),
    
            dcc.Dropdown(
                id='population-dropdown',
                options=[{'label': i, 'value': i} for i in dd_list],
                placeholder = "Please select..",
                #value='United States',
                searchable=True
            ),
           
            dcc.RangeSlider(
                id='year-slider',
                min=df['Year'].min(),
                max=df['Year'].max(),
                value=[df['Year'].min(),df['Year'].min()+1],
                step=1,
                marks = {str(Year): str(Year) for Year in df['Year'].unique()}
            ),
    
            dcc.Graph(id='graph-with-slider'),
            
     
        ],
        style = {'width': '100%', 'display': 'inline-block'})


#App CallBack
@app.callback(
    Output('graph-with-slider', 'figure'),
    [Input('year-slider', 'value'),
     Input('population-dropdown','value')])

#Figure Update
def update_figure(selected_year, selected_population):
    print(selected_year, selected_population)
    filtered_df = df[df['Native_Country_of_Father'] == selected_population]
    filtered_df = filtered_df[filtered_df.Year == selected_year[1]]
    filtered_df = filtered_df.groupby('City').count().reset_index()
    print(filtered_df.head())
    traces = []
    #for i in dd_list:
    #    df_by_population = filtered_df[filtered_df['Native_Country_of_Father'] == i]
        #traces.append(
            #name=i
    fig = go.Figure(go.Bar(
        x=filtered_df['City'],
        y=filtered_df['Native_Country_of_Father'], #Numberofpopulation
        text=filtered_df['City'],
        #barmode='stack'
    ))
    fig.update_layout(
        margin = {'l': 40, 'b': 40, 't': 10, 'r': 10},
        legend = {'x': 0, 'y': 1},
        hovermode='closest'
    )  
                     
    return fig

if __name__ =='__main__':
    app.run_server(debug=True, mode = "inline")

Я очень ценю тебя!

dspassion 03.05.2022 07:54

Другие вопросы по теме