Как правильно сделать обратный вызов и функционировать для веб-приложения Da sh - PullRequest
0 голосов
/ 12 апреля 2020

Буду очень признателен за помощь в правильном обратном вызове для моего веб-приложения Da sh. У меня есть следующий код ниже. Предполагается вернуть график с различными строками о финансовых результатах акций. Он берет данные из API. Но я не уверен, как определить мою функцию для обратного вызова приложения. Я пробовал следовать онлайн-учебникам, но добился успеха. Я прошу прощения, если это слишком грязно или неэффективно, я новичок в этом.

'' '

#!/usr/bin/env python
import pandas as pd
import requests
import json
import plotly
import chart_studio.plotly as py
import plotly.graph_objs as go
import plotly.express as px
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Output, Input


ticker = input("Insert company ticker: ")
qoy = input("QUARTERLY or YEARLY: ")
if qoy == "Yearly" or qoy == "yearly" or qoy == "YEARLY":
    IS = requests.get("https://financialmodelingprep.com/api/v3/financials/income-statement/" + ticker)
elif qoy == "Quarterly" or qoy == "quarterly" or qoy == "QUARTERLY":
    IS = requests.get(
        "https://financialmodelingprep.com/api/v3/financials/income-statement/" + ticker + "?period=quarter")

IS = IS.json()
IS = IS['financials']
IS = pd.DataFrame.from_dict(IS)
IS = IS.set_index("date")

if qoy == "Yearly" or qoy == "yearly" or qoy == "YEARLY":
    BS = requests.get("https://financialmodelingprep.com/api/v3/financials/balance-sheet-statement/" + ticker)
elif qoy == "Quarterly" or qoy == "quarterly" or qoy == "QUARTERLY":
    BS = requests.get(
        "https://financialmodelingprep.com/api/v3/financials/balance-sheet-statement/" + ticker + "?period=quarter")

BS = BS.json()
BS = BS['financials']
BS = pd.DataFrame.from_dict(BS)
BS = BS.set_index("date")

if qoy == "Yearly" or qoy == "yearly" or qoy == "YEARLY":
    CF = requests.get("https://financialmodelingprep.com/api/v3/financials/cash-flow-statement/" + ticker)
elif qoy == "Quarterly" or qoy == "quarterly" or qoy == "QUARTERLY":
    CF = requests.get(
        "https://financialmodelingprep.com/api/v3/financials/cash-flow-statement/" + ticker + "?period=quarter")

CF = CF.json()
CF = CF['financials']
CF = pd.DataFrame.from_dict(CF)
CF = CF.set_index("date")

df_FS = pd.concat([IS, BS, CF], axis=1, sort=True)
Date = df_FS.index
df_FS.fillna(0, inplace=True)
print(df_FS)

from plotly.subplots import make_subplots

# EARNINGS & REVENUE
fig = make_subplots(specs=[[{"secondary_y": True}]])
fig.add_trace(go.Scatter(x=Date, y=df_FS['Revenue'],
                         mode='lines+markers',
                         name='Revenue'), secondary_y=False, )
fig.add_trace(go.Bar(x=Date, y=df_FS['Profit Margin'],
                     opacity=0.2,
                     name='Profit Margin'), secondary_y=True, )

fig.add_trace(go.Scatter(x=Date, y=df_FS['Consolidated Income'],
                         mode='lines+markers',
                         name='Earnings'), secondary_y=False, )
fig.add_trace(go.Scatter(x=Date, y=df_FS['Operating Cash Flow'],
                         mode='lines+markers',
                         name='Operating Cash Flow'), secondary_y=False, )
fig.add_trace(go.Scatter(x=Date, y=df_FS['Free Cash Flow'],
                         mode='lines+markers',
                         name='Free Cash Flow'), secondary_y=False, )
fig.add_trace(go.Scatter(x=Date, y=df_FS['Operating Expenses'],
                         mode='lines+markers',
                         name='Operating Expenses'), secondary_y=False, )

fig.update_layout(title="EARNINGS & REVENUE", barmode='group', hovermode='x')
fig.update_yaxes(title_text="in USD", secondary_y=False)
fig.update_yaxes(title_text="Profit Margin", secondary_y=True)
fig.update_xaxes(rangeslider_visible=True)

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

app.layout = html.Div([
    # Input the stock ticker
    html.Div([
        dcc.Input(id="stock-input", value=ticker, type="text"),
        dcc.RadioItems(
            id="quarterlyoryearly",
            options=[
                {'label': 'Quarterly', 'value': 'quarterly'},
                {'label': 'Yearly', 'value': 'yearly'}
            ],
            value=qoy
        )
    ]),


    # Banner of app
    html.Div([
        html.H2("Stock App")
    ], className="banner"),

    # Graphs
    html.Div([

        # Earnings & Revenue Graph
        html.Div([
            dcc.Graph(
                id="Earnings & Revenue",
                figure=fig
            )
        ], className="six columns"),
    ], className="row")

])

app.css.append_css({"external_url": "https://codepen.io/chriddyp/pen/bWLwgP.css"})


@app.callback(dash.dependencies.Output("Earnings & Revenue","figure"),
              [dash.dependencies.Input("stock-input","value"),
               dash.dependencies.Input("quarterlyoryearly","value")]
              )


#def update_fig(ticker,qoy):


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

' ''

1 Ответ

1 голос
/ 12 апреля 2020

Вы должны выполнить всю обработку данных в обратном вызове, поскольку они требуют ввода и значений кнопок. Существуют различные способы go об этом, в зависимости от того, как вы хотите, чтобы приложение реагировало на входные данные. Одним из способов является это. Здесь основным входом является qoy, а обратный вызов использует состояние stock input. Таким образом, ввод ввода на складе не будет обновлять приложение, пока вы не выберете qoy.

#!/usr/bin/env python
from plotly.subplots import make_subplots
import pandas as pd
import requests
import json
import plotly
import chart_studio.plotly as py
import plotly.graph_objs as go
import plotly.express as px
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Output, Input, State
from dash.exceptions import PreventUpdate

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

app.layout = html.Div([
    # Input the stock ticker
    html.Div([
        dcc.Input(id="stock-input",
                  placeholder='Please insert stock', type="text"),
        dcc.RadioItems(
            id="quarterlyoryearly",
            options=[
                {'label': 'Quarterly', 'value': 'quarterly'},
                {'label': 'Yearly', 'value': 'yearly'}
            ]
        )
    ]),


    # Banner of app
    html.Div([
        html.H2("Stock App")
    ], className="banner"),

    # Graphs
    html.Div([

        # Earnings & Revenue Graph
        html.Div([
            dcc.Graph(
                id="Earnings & Revenue",
                # figure=fig
            )
        ], className="six columns"),
    ], className="row")

])

@app.callback(Output("quarterlyoryearly", "value"),
              [Input("stock-input", "n_submit")],
              [State("quarterlyoryearly", "value")])
def enter_key(n_sub, qoy):
    if n_sub:
        return qoy

@app.callback(dash.dependencies.Output("Earnings & Revenue", "figure"),
              [dash.dependencies.Input("quarterlyoryearly", "value")],
              [dash.dependencies.State("stock-input", "value")]
              )
def update_fig(*args):

    if not any(args):
        raise PreventUpdate
    else:
        qoy, ticker = args

        if qoy.lower() == "yearly":
            IS = requests.get(
                "https://financialmodelingprep.com/api/v3/financials/income-statement/" + ticker)
        elif qoy.lower() == "quarterly":
            IS = requests.get(
                "https://financialmodelingprep.com/api/v3/financials/income-statement/" + ticker + "?period=quarter")

        IS = IS.json()
        IS = IS['financials']
        IS = pd.DataFrame.from_dict(IS)
        IS = IS.set_index("date")

        if qoy == "Yearly" or qoy == "yearly" or qoy == "YEARLY":
            BS = requests.get(
                "https://financialmodelingprep.com/api/v3/financials/balance-sheet-statement/" + ticker)
        elif qoy == "Quarterly" or qoy == "quarterly" or qoy == "QUARTERLY":
            BS = requests.get(
                "https://financialmodelingprep.com/api/v3/financials/balance-sheet-statement/" + ticker + "?period=quarter")

        BS = BS.json()
        BS = BS['financials']
        BS = pd.DataFrame.from_dict(BS)
        BS = BS.set_index("date")

        if qoy == "Yearly" or qoy == "yearly" or qoy == "YEARLY":
            CF = requests.get(
                "https://financialmodelingprep.com/api/v3/financials/cash-flow-statement/" + ticker)
        elif qoy == "Quarterly" or qoy == "quarterly" or qoy == "QUARTERLY":
            CF = requests.get(
                "https://financialmodelingprep.com/api/v3/financials/cash-flow-statement/" + ticker + "?period=quarter")

        CF = CF.json()
        CF = CF['financials']
        CF = pd.DataFrame.from_dict(CF)
        CF = CF.set_index("date")

        df_FS = pd.concat([IS, BS, CF], axis=1, sort=True)
        Date = df_FS.index
        df_FS.fillna(0, inplace=True)

        # EARNINGS & REVENUE
        fig = make_subplots(specs=[[{"secondary_y": True}]])
        fig.add_trace(go.Scatter(x=Date, y=df_FS['Revenue'],
                                 mode='lines+markers',
                                 name='Revenue'), secondary_y=False, )
        fig.add_trace(go.Bar(x=Date, y=df_FS['Profit Margin'],
                             opacity=0.2,
                             name='Profit Margin'), secondary_y=True, )

        fig.add_trace(go.Scatter(x=Date, y=df_FS['Consolidated Income'],
                                 mode='lines+markers',
                                 name='Earnings'), secondary_y=False, )
        fig.add_trace(go.Scatter(x=Date, y=df_FS['Operating Cash Flow'],
                                 mode='lines+markers',
                                 name='Operating Cash Flow'), secondary_y=False, )
        fig.add_trace(go.Scatter(x=Date, y=df_FS['Free Cash Flow'],
                                 mode='lines+markers',
                                 name='Free Cash Flow'), secondary_y=False, )
        fig.add_trace(go.Scatter(x=Date, y=df_FS['Operating Expenses'],
                                 mode='lines+markers',
                                 name='Operating Expenses'), secondary_y=False, )

        fig.update_layout(title="EARNINGS & REVENUE",
                          barmode='group', hovermode='x')
        fig.update_yaxes(title_text="in USD", secondary_y=False)
        fig.update_yaxes(title_text="Profit Margin", secondary_y=True)
        fig.update_xaxes(rangeslider_visible=True)
        return fig


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

Вы можете поиграть с параметрами ввода и состояния и посмотреть, как приложение реагирует. Ура!

PS: я добавил еще один обратный вызов, поэтому после первых значений qoy и ticker вы можете просто изменить ticker в поле ввода и нажать кнопку ввода (так как qoy был бы уже выбран) чтобы обновить приложение. Надеемся, что это даст вам более полное представление о том, как работают обратные вызовы.

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