def calculate_assumed_expenses(client, project, expected_actuals_df, level, parent: dict = None): progress = collection.get_document("Data", client=client, project=project, data_set="progress") n_houses = float(progress.get("totaal")) if parent: parent_value = (parent.get("value") if parent.get("value") != "has" else "hpend") else: parent_value = None progress_percent = { k if k != "hpend" else "has": float(v) / n_houses for k, v in progress.items() if k in ([parent_value] if parent else ["schouwen", "montage", "civiel", "hpend"]) } if parent: assumed_expenses_df = (pd.Series({ v[level]: v["bedrag"] * progress_percent.get( "has" if parent_value == "hpend" else parent_value, 0) for k, v in expected_actuals_df.iterrows() }).dropna().to_frame().reset_index()) else: assumed_expenses_df = (( expected_actuals_df.set_index(level).bedrag * pd.Series(progress_percent)).dropna().to_frame().reset_index()) assumed_expenses_df.columns = [level, "bedrag"] return assumed_expenses_df
def financial_storage(dropdown_selection, client=client): if dropdown_selection: warnings = [ # dbc.Alert("Operationele voortgang voor civiel word berekend o.b.v. het status_civiel veld" # " i.p.v. de opleverstatus", color="info") ] finances = collection.get_document(collection="Finance", project=dropdown_selection, client=client) finance_document_names = { "expected_actuals": "Prognose einde werk", "budget": "Begroting", "actuals": "Realisatie", } missing_document_consequence = { "expected_actuals": "De begroting word nu als referentie gebruikt." "De prognose einde werk wordt gelijkgesteld aan de begroting." } for document, value in finances.items(): if not value: warnings.append( dbc.Alert( f"{dropdown_selection} heeft geen {finance_document_names[document]}. " f"{missing_document_consequence.get(document, '')}", color="warning", )) if document == "expected_actuals": finances[document] = finances["budget"] return [warnings] return [None]
def budget_bar_category(dropdown_selection, project, client=client): data = collection.get_document(collection="Finance", project=dropdown_selection, client=client) if data: fig = calculate_figure(client, project, data, "categorie") return [fig] return [no_graph("Barchart")]
def pie_chart(client, key="overview"): if key == "overview": fig = collection.get_document(collection="Data", client=client, graph_name="reden_na_overview")["figure"] else: fig = collection.get_document( collection="Data", client=client, graph_name="reden_na_projects", project="pie_na_" + key, )["figure"] data = fig["data"] trace = go.Pie(data) layout = fig["layout"] data = [trace] fig = go.Figure(data, layout=layout) return fig
def load_year_dropdown(dummy_data, reset, client=client): return [ [ {"label": year, "value": year} for year in collection.get_document( collection="Data", client=client, graph_name="List_of_years" ) ], str(datetime.now().year), ]
def fetch_data_for_status_redenna_piechart(project_name, client, click_filter=None): counts = pd.DataFrame( collection.get_document( collection="Indicators", graph_name="ActualStatusBarChartIndicator", project=project_name, client=client, ) ) if not counts.empty: clusters = config.client_config[client]["clusters_reden_na"] cluster_types = pd.CategoricalDtype( categories=list(clusters.keys()), ordered=True ) counts["cluster_redenna"] = counts["cluster_redenna"].astype(cluster_types) mask = pd.Series([True]).repeat(len(counts.index)).values if click_filter: for col, value in click_filter.items(): mask = mask & (counts[col] == value) cols_filter = list(click_filter.keys()) else: cols_filter = [] cols = list(dict.fromkeys(cols_filter + ["cluster_redenna"])) + ["laagbouw"] result = counts[mask][cols + ["count"]].groupby(cols).sum().reset_index() total = ( result.groupby("cluster_redenna") .sum() .reset_index()[["cluster_redenna", "count"]] ) laagbouw = ( result[result.laagbouw] .groupby("cluster_redenna") .sum() .reset_index()[["cluster_redenna", "count"]] ) hoogbouw = ( result[~result.laagbouw] .groupby("cluster_redenna") .sum() .reset_index()[["cluster_redenna", "count"]] ) else: total = pd.DataFrame() laagbouw = pd.DataFrame() hoogbouw = pd.DataFrame() return total, laagbouw, hoogbouw
def get_search_bar(client, project): return [ html.Div( [ dcc.Dropdown( id=f"project-dropdown-{client}", options=collection.get_document( collection="Data", client=client, graph_name="project_names").get("filters"), value=project if project else None, placeholder="Select a project", ) ], className="two-third column", ), html.Div( children=html.Div( children=[ dcc.Dropdown( id=f"year-dropdown-{client}", placeholder="Select a year", clearable=False, ), ], className="column", style={"width": "77px"}, ), className="container-display", ), html.Div([ dbc.Button( "Reset overzicht", id=f"overview-reset-{client}", n_clicks=0, style={ "margin-left": "10px", "margin-right": "55px", "background-color": colors["vwt_blue"], }, ) ]), html.Div( [ dbc.Button( "Terug naar overzicht alle projecten", id="overzicht-button-" + client, style={"background-color": colors["vwt_blue"]}, ) ], className="one-third column", ), ]
def clickbar_lb(drop_selectie, mask_all): fig = collection.get_document( collection="Data", graph_name="status_bar_chart", project=drop_selectie, filter=mask_all, )["bar"] bar = {} for key in fig: if "LB" in key: bar[key] = [int(fig[key])] labels = ["Schouwen", "BIS", "Montage-lasAP", "Montage-lasDP", "HAS"] barLB1HC = dict( x=labels, y=bar["SchouwenLB1"] + bar["BISLB1"] + bar["Montage-lasAPLB1"] + bar["Montage-lasDPLB1"] + bar["HASLB1"], name="Opgeleverd HC", type="bar", marker=dict(color=colors["green"]), ) barLB1HP = dict( x=labels, y=[0] + [0] + [0] + [0] + bar["HASLB1HP"], name="Opgeleverd zonder HC", type="bar", marker=dict(color=colors["yellow"]), ) barLB0 = dict( x=labels, y=bar["SchouwenLB0"] + bar["BISLB0"] + bar["Montage-lasAPLB0"] + bar["Montage-lasDPLB0"] + bar["HASLB0"], name="Niet opgeleverd", type="bar", marker=dict(color=colors["red"]), ) fig = dict( data=[barLB1HC, barLB1HP, barLB0], layout=dict( barmode="stack", clickmode="event+select", showlegend=True, height=350, plot_bgcolor=colors["plot_bgcolor"], paper_bgcolor=colors["paper_bgcolor"], title={ "text": "Status oplevering per fase (LB)<br>[selectie resets na 3x klikken]:", "x": 0.5, }, yaxis={"title": "[aantal woningen]"}, ), ) return fig
def budget_bar_sub_category(click, project, client=client): ctx = dash.callback_context if "budget-bar-category" in [ x["prop_id"].rpartition("-")[0] for x in ctx.triggered ]: for point in click.get("points", []): data = collection.get_document(collection="Finance", project=project, client=client) if data: parent = dict(level="categorie", value=point.get("label")) fig = calculate_figure(client, project, data, "sub_categorie", parent) return [fig, point.get("label")] break return [no_graph(text="Geen selectie"), ""]
def fetch_data_productionstatus(project, client, freq, phase_name, unit_type=""): indicator_values = {} timeseries = {} name_indicator = { "target": "Target", "poc_verwacht": "Gerealiseerd & verwacht verloop", "poc_ideal": "Gerealiseerd & ideaal verloop", "work_stock": "Totale productie voorafgaande fase", "work_stock_amount": "Hoeveelheid Werkvoorraad", } line_graph_bool = False for key in [ "target", "work_stock", "poc_verwacht", "poc_ideal", "work_stock_amount", ]: indicator_dict = collection.get_document( collection="Lines", line=key + "_indicator" + unit_type, project=project, client=client, phase=phase_name, ) if indicator_dict: line_graph_bool = True indicator_values[name_indicator[key]] = int(indicator_dict["next_" + freq]) timeseries[name_indicator[key]] = pd.Series( indicator_dict["series_" + freq] ) else: indicator_values[name_indicator[key]] = 0 timeseries[name_indicator[key]] = pd.Series() if indicator_values["Hoeveelheid Werkvoorraad"] < 0: indicator_values["Hoeveelheid Werkvoorraad"] = 0 if phase_name == "geulen": indicator_values["Hoeveelheid Werkvoorraad"] = None del timeseries["Hoeveelheid Werkvoorraad"] return indicator_values, timeseries, line_graph_bool
def info_table(): document = collection.get_document(collection="Graphs", client="kpn", graph_name="info_table") df = pd.read_json(document["table"], orient="records") df = df[document["col"]] fig = dash_table.DataTable( columns=[{ "name": i, "id": i } for i in df.columns], data=df.to_dict("rows"), filter_action="native", sort_action="native", style_table={"overflowX": "auto"}, style_header=table_styles["header"], style_cell=table_styles["cell"]["action"], style_filter=table_styles["filter"], css=[{ "selector": "table", "rule": "width: 100%;" }], ) return fig
def load_dropdown(dummy_data, client=client): return [ collection.get_document( collection="Data", client=client, graph_name="project_names" )["filters"] ]
def progress_over_time(click, project, client=client): ctx = dash.callback_context if "budget-bar-category" in [ x["prop_id"].rpartition("-")[0] for x in ctx.triggered ]: for point in click.get("points", []): finance_data = collection.get_document(collection="Finance", project=project, client=client) if finance_data: parent = dict(level="categorie", value=point.get("label")) actuals_df = pd.DataFrame( finance_data.get("actuals", { parent.get("level"): [], "bedrag": [] })) actuals_df = actuals_df[actuals_df[parent.get("level")] == parent.get("value")] time_series = (actuals_df.groupby("vastlegdatum") ["bedrag"].sum().sort_index().cumsum()) if "expected_actuals" in finance_data: expected_cost = pd.DataFrame( finance_data.get( "expected_actuals", { parent.get("level"): [], "bedrag": [] }, )) else: expected_cost = pd.DataFrame( finance_data.get("budget", { parent.get("level"): [], "bedrag": [] })) expected_cost = expected_cost[expected_cost[parent.get( "level")] == parent.get("value")].bedrag.sum() traces = [ go.Scatter( x=time_series.index, y=time_series, mode="lines+markers", name="Financieel", line=dict(color=config.colors_vwt["vwt_blue"]), ) ] if parent.get("value") in [ "has", "civiel", "montage", "schouwen" ]: progress_data = collection.get_document( collection="Data", project=project, client=client, data_set="progress_over_time", ) traces.append( get_progress_scatter( expected_cost, progress_data, parent.get("value"), color=config.colors_vwt["darkgray"], )) fig = go.Figure(data=traces) fig.update_layout( height=500, paper_bgcolor=config.colors_vwt["paper_bgcolor"], plot_bgcolor=config.colors_vwt["plot_bgcolor"], ) return [fig, parent.get("value")] break return [no_graph(text="Geen selectie"), ""]
def fetch_data_for_status_barchart(project_name, client, click_filter=None): counts = pd.DataFrame( collection.get_document( collection="Indicators", graph_name="ActualStatusBarChartIndicator", project=project_name, client=client, ) ) categories = [ "schouw_status", "bis_status", "lasAP_status", "lasDP_status", "HAS_status", ] phase_category = pd.CategoricalDtype(categories=categories) status_category = pd.CategoricalDtype( categories=[ "niet_opgeleverd", "ingeplanned", "opgeleverd", "opgeleverd_zonder_hc", ] ) if not counts.empty: mask = pd.Series([True]).repeat(len(counts.index)).values if click_filter: for col, value in click_filter.items(): mask = mask & (counts[col] == value) cols_filter = list(click_filter.keys()) else: cols_filter = [] laagbouw_matrix = [] hoogbouw_matrix = [] for category in categories: cols = list(dict.fromkeys(cols_filter + [category])) + ["laagbouw"] result = counts[mask][cols + ["count"]].groupby(cols).sum().reset_index() lb = result[result.laagbouw][[category, "count"]] for i, row in lb.iterrows(): laagbouw_matrix.append([category] + row.values.tolist()) hb = result[~result.laagbouw][[category, "count"]] for i, row in hb.iterrows(): hoogbouw_matrix.append([category] + row.values.tolist()) lb_df = pd.DataFrame(laagbouw_matrix, columns=["phase", "status", "count"]) lb_df["status"] = lb_df.status.astype(status_category) lb_df["phase"] = lb_df.phase.astype(phase_category) lb_df = lb_df.groupby(by=["phase", "status"]).sum().reset_index() if lb_df.empty: lb_df["count"] = 0 else: lb_df["count"] = lb_df["count"].fillna(0) data_laagbouw = lb_df hb_df = pd.DataFrame(hoogbouw_matrix, columns=["phase", "status", "count"]) hb_df["status"] = hb_df.status.astype(status_category) hb_df["phase"] = hb_df.phase.astype(phase_category) hb_df = hb_df.groupby(by=["phase", "status"]).sum().reset_index() if hb_df.empty: hb_df["count"] = 0 else: hb_df["count"] = hb_df["count"].fillna(0) data_hoogbouw = hb_df else: data_laagbouw = pd.DataFrame() data_hoogbouw = pd.DataFrame() return data_laagbouw, data_hoogbouw
def fetch_data_for_project_info_table(client): return collection.get_document( collection="ProjectInfo", graph_name="project_dates", client=client )