def html_table_update(*sdv):
  sdv[0].insert(0, "Murder")
  formula_ ,_,_ = formula_builder(sdv)
  lmod = smf.ols(formula = formula_, data = df)
  results = lmod.fit()
  coef_df = signif(results.summary().tables).reset_index(drop = False)
  return df_to_table(coef_df)
def residsonly(*sdv):
  sdv[0].insert(0, "Murder")
  _,_, formula_ = formula_builder(sdv)
  lmod = smf.ols(formula = formula_, data = df)
  results = lmod.fit()
  resids = results.resid
  np.random.seed(45)
  norm = np.random.normal(np.mean(resids), np.std(resids), 3*len(resids))
  x_axis = np.arange(0,len(resids))
  residsonly =  go.Scatter({ "y": resids,
                              "x": x_axis,
                              "mode": "markers",
                              "marker": {"color": "#ff0000"},
                              "hoverinfo": "skip"})
  norms =  go.Scatter({       "y": norm,
                              "x": x_axis,
                              "mode": "markers",
                              "marker": {"color": "#C8C8C8"},
                              "hoverinfo": "skip"})
  plot_layout = {'title': "Residuals",
                 'xaxis': {"title": "observations"},
                 'yaxis': {"title": "residuals"},
                 'height': '500',
                 'width' : '500'
                 }

  return {"data": [residsonly, norms], "layout": plot_layout}
def residvsfttd(*sdv):
  sdv[0].insert(0, "Murder")
  _,_, formula_ = formula_builder(sdv)
  lmod = smf.ols(formula = formula_, data = df)
  results = lmod.fit()
  resids = results.resid
  ftd    = results.fittedvalues
  residvsfttd =  go.Scatter({ "y": resids,
                              "x": ftd,
                              "mode": "markers",
                              "hoverinfo": "skip"})

  plot_layout = {'title': "Residuals vs fitted-values",
                 'xaxis': {"title": "fitted-values"},
                 'yaxis': {"title": "residuals"},
                 'height': '500',
                 'width' : '500'
                 }

  return {"data": [residvsfttd], "layout": plot_layout}
def update_formula(*sdv):
  sdv[0].insert(0, "Murder")
  frmla, _,_ = formula_builder(sdv)

  return "Statsmodels formula: {}".format(frmla)

#@app.callback(
#    Output("bare_formula","children"),
#    [Input("select_inputs",   "value"),
#     Input("murder_radio",    "value"),
#     Input("population_radio","value"),
#     Input("income_radio",    "value"),
#     Input("illiteracy_radio","value"),
#     Input("life_exp_radio",  "value"),
#     Input("hs_grad_radio",   "value"),
#     Input("frost_radio",     "value"),
#     Input("area_radio",      "value")]
#     )
#def update_formula(*sdv):
#  sdv[0].insert(0, "Murder")
#  _,_,frmla = formula_builder(sdv)

  return "Bare formula: {}".format(frmla)
def update_formula(*sdv):
  sdv[0].insert(0, "Murder")
  _, disp, _ = formula_builder(sdv)

  return "Regression formula: {}".format(disp)