lpo_ai / dashboard.py
coulibaly-b
dash v2 and dataretrieve
7c8a308
import pandas as pd
import streamlit as st
import sqlite3
import plotly.express as px
from query.requetes import (query_zone_catg_prop,
query_mon_wise_prop,
query_practice_mon_wise,
query_zone_per_species
)
# Database connection
conn = sqlite3.connect("data/biodiv_sports.db")
def dashboard():
conn = sqlite3.connect("data/biodiv_sports.db")
# Read query results into Pandas DataFrames
df_zone_catg_prop = pd.read_sql_query(query_zone_catg_prop, conn)
df_mon_wise_prop = pd.read_sql_query(query_mon_wise_prop, conn)
df_practice_mon_wise = pd.read_sql_query(query_practice_mon_wise, conn)
df_zone_per_species = pd.read_sql_query(query_zone_per_species, conn)
# Map month names to their corresponding numbers
MONTHS = [
"janvier",
"fevrier",
"mars",
"avril",
"mai",
"juin",
"juillet",
"août",
"septembre",
"octobre",
"novembre",
"decembre",
]
MONTH_MAPPING = {k: v + 1 for v, k in enumerate(MONTHS)}
# Add a numeric_months column based on MONTH_MAPPING
df_practice_mon_wise["numeric_months"] = df_practice_mon_wise["months"].map(
MONTH_MAPPING
)
df_mon_wise_prop["numeric_months"] = df_mon_wise_prop["months"]
.map(MONTH_MAPPING)
# Sort by numeric_months and reset index before dropping it
df_practice_mon_wise = df_practice_mon_wise.sort_values(
["numeric_months", "species_id"]
).reset_index(drop=True)
df_practice_mon_wise.drop("numeric_months", axis=1, inplace=True)
df_mon_wise_prop = df_mon_wise_prop.sort_values(
["numeric_months", "proportion"]
).reset_index(drop=True)
df_mon_wise_prop.drop("numeric_months", axis=1, inplace=True)
st.markdown(
"""<h1 style='text-align: center'>Visualization of Biodiv-Sport
Database</h1>""",
unsafe_allow_html=True,
)
# Charts
fig_pie = px.pie(df_zone_catg_prop, values="proportion", names="zone_category")
fig_pie.update_layout(
paper_bgcolor="#002b36",
plot_bgcolor="#586e75",
font_color="#fafafa",
title={"text": "<b>Proportions of Zone Categories</b>", "x": 0.0, "y": 1},
)
fig_bar = px.bar(df_zone_per_species, x="name", y="number_of_zones")
fig_bar.update_layout(
paper_bgcolor="#002b36",
plot_bgcolor="#586e75",
font_color="#fafafa",
title={"text": "<b>Total Number of Zones Per Species</b>", "x": 0.0, "y": 1},
)
fig_line = px.line(df_mon_wise_prop, x="months", y="proportion", color="species_id")
fig_line.update_layout(
paper_bgcolor="#002b36",
plot_bgcolor="#586e75",
font_color="#fafafa",
title={
"text": "<b>Monthly Proportion Distribution Across Year</b>",
"x": 0.0,
"y": 1,
},
)
fig_heatmap = px.density_heatmap(
df_practice_mon_wise,
x="months",
y="practices",
z="nombre_zone",
color_continuous_scale="OrRd",
nbinsx=12, # Set the number of bins in the x direction (months)
nbinsy=10,
)
fig_heatmap.update_layout(
xaxis={
"tickmode": "array",
"tickvals": list(MONTH_MAPPING.keys()),
},
paper_bgcolor="#002b36",
plot_bgcolor="#586e75",
font_color="#fafafa",
title={
"text": "Number of Zones According to Activity Practiced and By Month",
"x": 0.0,
"y": 1.0,
},
)
st.plotly_chart(fig_pie)
st.plotly_chart(fig_bar)
st.plotly_chart(fig_line)
st.plotly_chart(fig_heatmap)