meu codigo
import pandas as pd
import dash
from dash import dcc, html, Input, Output
import plotly.graph_objects as go

# Carregar datasets
df1 = pd.read_csv("datasets/dataset-1.csv")
df2 = pd.read_csv("datasets/dataset-2.csv")
df3 = pd.read_csv("datasets/dataset-3.csv")
df4 = pd.read_csv("datasets/dataset-4.csv")
df5 = pd.read_csv("datasets/dataset-5.csv")

# Mapeamento de regiões
region_map = {
    'Sudeste': ['Minas Gerais', 'São Paulo', 'Rio de Janeiro', 'Espírito Santo'],
    'Nordeste': ['Bahia', 'Pernambuco', 'Ceará', 'Maranhão', 'Paraíba', 'Rio Grande do Norte', 'Alagoas', 'Piauí', 'Sergipe'],
    'Sul': ['Paraná', 'Rio Grande do Sul', 'Santa Catarina'],
    'Centro-Oeste': ['Goiás', 'Mato Grosso', 'Mato Grosso do Sul', 'Distrito Federal'],
    'Norte': ['Pará', 'Amazonas', 'Rondônia', 'Tocantins', 'Acre', 'Roraima', 'Amapá']
}

# Inicialização do Dash
app = dash.Dash(__name__)

# Layout do app
app.layout = html.Div([
    html.H1("Dashboard de Escolas"),
    html.Div([
        dcc.Dropdown(
            id='visualization-dropdown',
            options=[
                {'label': 'Escolas Públicas', 'value': 'public'},
                {'label': 'Escolas Particulares', 'value': 'private'},
                {'label': 'Ambas', 'value': 'both'}
            ],
            value='both'
        ),
    ], style={'width': '50%', 'margin': 'auto'}),
    dcc.Graph(id='school-graph'),
    dcc.Graph(id='libraries-pie'),
    dcc.Graph(id='schools-by-state')
])

# Callback para atualizar o gráfico de barras
@app.callback(
    Output('school-graph', 'figure'),
    [Input('visualization-dropdown', 'value')]
)
def update_graph(selected_option):
    fig = go.Figure()

    if selected_option in ['public', 'both']:
        for region, states in region_map.items():
            y_values = []
            for state in states:
                value = df1[df1['NO_UF'] == state]['Escolas_Publicas_Com_Biblioteca']
                y_values.append(value.iloc[0] if not value.empty else 0)
            fig.add_trace(go.Bar(name=f'Escolas Públicas - {region}', x=states, y=y_values))

    if selected_option in ['private', 'both']:
        for region, states in region_map.items():
            y_values = []
            for state in states:
                value = df2[df2['NO_UF'] == state]['Escolas_Particulares_Com_Biblioteca']
                y_values.append(value.iloc[0] if not value.empty else 0)
            fig.add_trace(go.Bar(name=f'Escolas Particulares - {region}', x=states, y=y_values))

    fig.update_layout(
        title='Escolas Públicas e Particulares com Biblioteca por Região',
        xaxis_title='Estado',
        yaxis_title='Número de Escolas',
        barmode='group',
        legend=dict(
            orientation="h",
            yanchor="bottom",
            y=1.02,
            xanchor="right",
            x=1
        )
    )

    return fig

# Callback para atualizar o gráfico de pizza
@app.callback(
    Output('libraries-pie', 'figure'),
    [Input('visualization-dropdown', 'value')]
)
def update_pie(selected_option):
    fig = go.Figure()
    fig.add_trace(go.Pie(labels=df5['Categoria'], values=df5['Total']))
    fig.update_layout(title='Quantidade de Bibliotecas Totais no Brasil')
    return fig

# Callback para atualizar o gráfico de barras por estado
@app.callback(
    Output('schools-by-state', 'figure'),
    [Input('visualization-dropdown', 'value')]
)
def update_schools_by_state(selected_option):
    fig = go.Figure()
    fig.add_trace(go.Bar(name='Escolas Públicas', x=df1['NO_UF'], y=df1['Escolas_Publicas_Com_Biblioteca']))
    fig.add_trace(go.Bar(name='Escolas Particulares', x=df2['NO_UF'], y=df2['Escolas_Particulares_Com_Biblioteca']))
    fig.update_layout(
        title='Escolas Públicas e Particulares por Estado',
        xaxis_title='Estado',
        yaxis_title='Número de Escolas',
        barmode='group',
        legend=dict(
            orientation="h",
            yanchor="bottom",
            y=1.02,
            xanchor="right",
            x=1
        )
    )
    return fig

# Executa o app
if __name__ == '__main__':
    app.run_server(debug=False)

th@1TL-23TI01:~/dev/joana/chart$ tree
.
├── app.py
├── assets
│   └── style.css
├── data.py
├── datasets
│   ├── dataset-1.csv
│   ├── dataset-2.csv
│   ├── dataset-3.csv
│   ├── dataset-4.csv
│   └── dataset-5.csv
└── requirements.txt

2 directories, 9 files

ao tentar fazer o deploy no render, estou com o eror
oading build...
INFO==> Build uploaded in 7s
INFO==> Build successful 🎉
INFO==> Deploying...
INFO==> Using Node version 20.12.2 (default)
INFO==> Docs on specifying a Node version: https://render.com/docs/node-version
INFO==> Using Bun version 1.1.0 (default)
INFO==> Docs on specifying a bun version: https://render.com/docs/bun-version
INFO==> Running 'gunicorn app:app'
INFOTraceback (most recent call last):
INFO  File "/opt/render/project/src/.venv/bin/gunicorn", line 8, in <module>
INFO    sys.exit(run())
INFO             ^^^^^
INFO  File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py", line 67, in run
INFO    WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]", prog=prog).run()
INFO  File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/app/base.py", line 236, in run
INFO    super().run()
INFO  File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/app/base.py", line 72, in run
INFO    Arbiter(self).run()
INFO    ^^^^^^^^^^^^^
INFO  File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/arbiter.py", line 58, in __init__
INFO    self.setup(app)
INFO  File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/arbiter.py", line 118, in setup
INFO    self.app.wsgi()
INFO  File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/app/base.py", line 67, in wsgi
INFO    self.callable = self.load()
INFO                    ^^^^^^^^^^^
INFO  File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py", line 58, in load
INFO    return self.load_wsgiapp()
INFO           ^^^^^^^^^^^^^^^^^^^
INFO  File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py", line 48, in load_wsgiapp
INFO    return util.import_app(self.app_uri)
INFO           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INFO  File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/util.py", line 442, in import_app
INFO    raise AppImportError("Application object must be callable.")
INFOgunicorn.errors.AppImportError: Application object must be callable.
INFO==> Common ways to troubleshoot your deploy: https://docs.render.com/troubleshooting-deploys
INFO    self.setup(app)
INFO  File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/arbiter.py", line 118, in setup
INFO    self.app.wsgi()
INFO  File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/app/base.py", line 67, in wsgi
INFO    self.callable = self.load()
INFO                    ^^^^^^^^^^^
INFO  File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py", line 58, in load
INFO    return self.load_wsgiapp()
INFO           ^^^^^^^^^^^^^^^^^^^
INFO  File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py", line 48, in load_wsgiapp
INFO    return util.import_app(self.app_uri)
INFO           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INFO  File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/util.py", line 442, in import_app
INFO    raise AppImportError("Application object must be callable.")
INFOgunicorn.errors.AppImportError: Application object must be callable.
INFO==> No open ports detected, continuing to scan...
INFO==> Docs on specifying a port: https://render.com/docs/web-services#port-binding
INFO==> Using Node version 20.12.2 (default)
INFO==> Docs on specifying a Node version: https://render.com/docs/node-version
INFO==> Using Bun version 1.1.0 (default)
INFO==> Docs on specifying a bun version: https://render.com/docs/bun-version
INFO==> Running 'gunicorn app:app'
INFOTraceback (most recent call last):
INFO  File "/opt/render/project/src/.venv/bin/gunicorn", line 8, in <module>
INFO    sys.exit(run())
INFO             ^^^^^
INFO  File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py", line 67, in run
INFO    WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]", prog=prog).run()
INFO  File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/app/base.py", line 236, in run
INFO    super().run()
INFO  File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/app/base.py", line 72, in run
INFO    Arbiter(self).run()
INFO    ^^^^^^^^^^^^^
INFO  File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/arbiter.py", line 58, in __init__
INFO    self.setup(app)
INFO  File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/arbiter.py", line 118, in setup
INFO    self.app.wsgi()
INFO  File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/app/base.py", line 67, in wsgi
INFO    self.callable = self.load()
INFO                    ^^^^^^^^^^^
INFO  File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py", line 58, in load
INFO    return self.load_wsgiapp()
INFO           ^^^^^^^^^^^^^^^^^^^
INFO  File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py", line 48, in load_wsgiapp
INFO    return util.import_app(self.app_uri)
INFO           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INFO  File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/util.py", line 442, in import_app
INFO    raise AppImportError("Application object must be callable.")
INFOgunicorn.errors.AppImportError: Application object must be callable.