Spaces:
Sleeping
Sleeping
File size: 6,561 Bytes
69bdfa7 78b881c 30c72a3 0bc7c94 78b881c 9e8bccb 07e36d3 a6c16f8 5d3002b 59b6e19 f2c755b 59b6e19 78b881c 43ad670 59b6e19 318d40d 43ad670 7772f06 43ad670 d9636f0 43ad670 74f47be d0941c6 ad8b113 963636b d0941c6 74f47be d0941c6 f7deedb d0941c6 963636b d9636f0 d0941c6 43ad670 59b6e19 43ad670 d35f073 43ad670 8308ced 43ad670 7ec2b84 d35f073 9699e83 7ec2b84 43ad670 7ec2b84 43ad670 144902b 43ad670 efe4f94 43ad670 d35f073 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | import panel as pn
import hvplot.pandas
import pandas as pd
import numpy as np
import duckdb as ddb
import geopandas as gpd
from datasets import load_dataset
data_files_csv = {"rp2020_logements_dict": "dictionnaire-variables-logemt-2020.csv",
"rp2020_individus_dict": "dictionnaire-variables-indcvi-2020.csv"}
dataset = load_dataset("alihmaou/DGVFR_RP2020", data_files=data_files_csv, sep=";")
df_dataset = dataset["rp2020_logements_dict"].to_pandas()
ddb.sql(f"""create or replace table ods_ins_rp2020_logements_dict as SELECT * FROM df_dataset""");
df_dataset = dataset["rp2020_individus_dict"].to_pandas()
ddb.sql(f"""create or replace table ods_ins_rp2020_individus_dict as SELECT * FROM df_dataset""");
#dataset = load_dataset("alihmaou/RP2020_LOGEMENTS_CSV")
#df_dataset = pd.DataFrame(dataset["RP2020_LOGEMT_csv.zip"])
#ddb.sql(f"""create or replace table ods_ins_rp2020_logements as SELECT * FROM df_dataset""");
dataset = load_dataset("alihmaou/AGR_RP2020_IND_DEPT")
df_dataset = pd.DataFrame(dataset['train'])
ddb.sql(f"""create or replace table selected_data_stats as SELECT * FROM df_dataset""");
def prepare_data( filtre_territoire="99", lib_territoire="", persistant_table_name="selected_data_stats_proportions"):
ddb.sql(f"""create or replace table {persistant_table_name} as \
select \
'{lib_territoire}' lib_territoire,\
'{filtre_territoire}' filtre_territoire,\
LIB_VAR caracteristique, \
LIB_MOD etat_caracteristique, \
nb_individus,
100 * nb_individus / (select max(nb_individus) from selected_data_stats) AS pc_correspondance, \
DENSE_RANK() over(partition by lib_var order by nb_individus desc) rang \
from selected_data_stats
where code_dept='{filtre_territoire}'""")
return ddb.sql(f"select * from {persistant_table_name}").to_df()
## Initialisation des référence nationales
agr_stats_nationales = prepare_data(lib_territoire="NATIONAL",filtre_territoire="99",persistant_table_name="ds_national")
def analyse_comparaison_territoires(table_territoire = "selected_data_stats_proportions" , table_territoire_reference = "ds_national"):
ddb.sql(f"""
create or replace table agr_comparaison_territoires as (\
select a.lib_territoire, a.filtre_territoire, c.COD_VAR code_variable,a.variable, a.modalite, a.nb_individus, a.proportion_locale, a.proportion_reference, \
DENSE_RANK() over (PARTITION by c.COD_VAR order by proportion_locale desc) rang_local, \
DENSE_RANK() over (PARTITION by c.COD_VAR order by proportion_reference desc) rang_reference \
from ( \
select a.lib_territoire, a.filtre_territoire, COALESCE (a.caracteristique, b.caracteristique ) variable , COALESCE (a.etat_caracteristique,b.etat_caracteristique ) modalite, \
a.nb_individus, a.pc_correspondance proportion_locale, b.pc_correspondance proportion_reference, \
from {table_territoire} a \
full outer join {table_territoire_reference} b on (a.caracteristique=b.caracteristique and a.etat_caracteristique = b.etat_caracteristique) \
) a \
left outer join ods_ins_rp2020_individus_dict c on (a.variable = c.lib_var and a.modalite=c.lib_mod) \
) order by 1,2,3,4,5 """)
return ddb.sql("select * from agr_comparaison_territoires order by 3, 5").to_df()
def label_inside(plot):
# Access the Bokeh plot from Holoviews
p = hv.render(plot)
# Adjust y-axis labels to be inside the plot
p.yaxis.major_label_text_font_size = "10pt" # Adjust font size if needed
p.yaxis.major_label_standoff = -10 # Negative standoff to move labels inside
p.yaxis.major_label_orientation = "horizontal"
return p
def plot_analyse_histogramme(code_variable = "NPERR"):
df = ddb.sql(f"""select 'Selection' territoire, code_variable, variable, modalite, proportion_locale pc_est from agr_comparaison_territoires where code_variable = '{code_variable}' \
union select 'National' territoire,code_variable, variable, modalite, proportion_reference pc_est from agr_comparaison_territoires where code_variable = '{code_variable}'
order by 5 """).to_df()
plot = df.hvplot.barh(
x='modalite',
y="pc_est",
legend=None, # Disable legend
height=400,
width=800,
group_label=None,
color='territoire', # Assign a color based on the 'modalite' field
cmap='Category20', # Use a categorical color map
hover_cols=['territoire', 'variable'] # Add more columns to hover tool
)
# Improve aesthetics
plot.opts(
xlabel="Modalité",
ylabel="Pourcentage de population estimé (%)",
tools=['hover'], # Enable hover tool
show_grid=True, # Show grid
fontscale=1.2, # Increase font scale for better readability
hooks=[lambda p: label_inside(p)] # Custom hook for label positioning
)
return plot
def run_territoire_histo(filtre_territoire="95", lib_territoire="Val Oise", code_variable="TYPL"):
prepare_data(filtre_territoire,lib_territoire)
agr_comparaison_territoires = analyse_comparaison_territoires()
return plot_analyse_histogramme(code_variable)
## Création d'une page Panel
# Listes de valeurs
options_vars = ddb.sql("select distinct cod_var, lib_var from ods_ins_rp2020_individus_dict order by 2").to_df()
options_vars_dict = dict(zip(options_vars["LIB_VAR"], options_vars["COD_VAR"]))
# Listes de valeurs
options_depts = ddb.sql("select distinct code_dept as lib_dept, code_dept from selected_data_stats order by 2").to_df()
options_depts_dict = dict(zip(options_depts["lib_dept"], options_depts["code_dept"]))
# Widgets
variable_widget = pn.widgets.Select(name="code_variable", options=options_vars_dict)
#territoire_widget = pn.widgets.TextInput(name="filtre_territoire")
territoire_widget = pn.widgets.Select(name="filtre_territoire", options=options_depts_dict)
lib_territoire_widget = pn.widgets.TextInput(name="lib_territoire")
# Bindings
bound_plot_histogramme = pn.bind(run_territoire_histo, code_variable=variable_widget, filtre_territoire=territoire_widget, lib_territoire=lib_territoire_widget)
# Instanciation de l'app
rp2020_app = pn.Column(pn.Column(territoire_widget, variable_widget), pn.Column( bound_plot_histogramme))
rp2020_app.servable() |