diff --git a/0_FONCIER/grant_table.py b/0_FONCIER/grant_table.py index f482b9b..d2e83e4 100644 --- a/0_FONCIER/grant_table.py +++ b/0_FONCIER/grant_table.py @@ -46,7 +46,7 @@ def revoke_all_table(con,sch): if __name__ == "__main__": - sch_cad = '38_202501' - sch_old = '42_202207' + sch_cad = '26_202504' + sch_old = '38_202501' grant_all_table(con_cad,sch_cad) # revoke_all_table(con_cad,sch_old) \ No newline at end of file diff --git a/3_AZALEE/insert_ps.py b/3_AZALEE/insert_ps.py index 23e58ed..76c419b 100644 --- a/3_AZALEE/insert_ps.py +++ b/3_AZALEE/insert_ps.py @@ -106,7 +106,7 @@ def format_date(df): df.date = pd.to_datetime(df.date,format='%d%b%Y') if table == '"PS_BIEVRE_CEN38_2016"': - df.date = df.date.astype(str).replace('\.','',regex=True) + df.date = df.date.astype(str).replace(r'\.','',regex=True) df.date = df.date.str.rsplit(' ',1).str[0]\ .replace(['avr','mai','juin','juil'],['apr','may','jun','jul'],regex=True) df.date = pd.to_datetime(df.date,format='%d %b %Y') @@ -541,7 +541,7 @@ def normalize_formatIdsite(id_site): import re df = pd.DataFrame({'id_site':id_site}) df['dept'] = '38' - df[['org','num','other']] = [re.split('(\d+)',s) for s in [*df.id_site]] + df[['org','num','other']] = [re.split(r'(\d+)',s) for s in [*df.id_site]] del df['other'] df.loc[df.num.str.len() == 1,'num'] = '000'+ df.loc[df.num.str.len() == 1,'num'] df.loc[df.num.str.len() == 2,'num'] = '00' + df.loc[df.num.str.len() == 2,'num'] @@ -601,7 +601,7 @@ def normalize_pratiques(prat): p = normalize_paturage(p) p = p.replace(dic) p.fillna('N.D', inplace=True) - p[p.str.contains('\?| ou ',na=False)] = 'incertain' + p[p.str.contains(r'\?| ou ',na=False)] = 'incertain' pp = p.str.split(',',expand=True) pp.columns = 'p' + pp.columns.astype(str) for c in pp.columns: @@ -903,7 +903,7 @@ def insert_attrsPS(df,ps_statut='actif'): del df['pratiques'] for col in params: - df[col] = df[col].astype(str).replace(['\.0'],[''],regex=True) + df[col] = df[col].astype(str).replace([r'\.0'],[''],regex=True) if 'niv_embrous' in df.columns: df.niv_embrous.replace(['nan'],['N.D'],inplace=True) @@ -971,9 +971,9 @@ def insert_attrsPS(df,ps_statut='actif'): def split_codehab(lst_codehab): lst = lst_codehab.copy() - lst = lst.str.split('x|X|,|&|/|\(|et',expand=True) \ + lst = lst.str.split(r'x|X|,|&|/|\(|et',expand=True) \ .stack().str.strip() \ - .str.replace('\)','',regex=True)\ + .str.replace(r'\)','',regex=True)\ .droplevel(-1).reset_index(drop=False) return lst @@ -994,7 +994,7 @@ def format_codehab2insert(lst_codehab): suspect = lst.code_hab.str.split('(',expand=True) if suspect.shape[1] > 1: suspect[0] = suspect[0].str.strip() - suspect[1] = suspect[1].str.replace('\)','',regex=True) + suspect[1] = suspect[1].str.replace(r'\)','',regex=True) suspect.columns = ['code_hab','suspect'] del lst['code_hab'] # raise Exception('habitat suspecté en développement') @@ -1011,7 +1011,7 @@ def insert_cbPS(df): drop_col = ['auteur','structure'] df = df.copy() df.date = df.date.astype(str) - df.code_hab = df.code_hab.replace(['\*'],[''],regex=True).str.strip() + df.code_hab = df.code_hab.replace([r'\*'],[''],regex=True).str.strip() df.code_hab = df.code_hab.replace(['None','nan','0'],[None,None,None]) df.dropna(subset=['code_hab'],inplace=True) ids = select_ID(df[df.columns.drop(['code_hab',*drop_col])],sch=pycen.ps.schema,tab='r_site_habitat') @@ -1061,7 +1061,7 @@ def insert_habPS(df,ps_statut='actif'): # df[t] = df[t].astype(str) df = df.stack().reset_index(-1) df.columns = ['param','value'] - df[['param','index','other']] = [re.split('(\d+)',s) for s in [*df.param]] + df[['param','index','other']] = [re.split(r'(\d+)',s) for s in [*df.param]] del df['other'] df['index'] = df['index'].astype(int) df['value'] = df['value'].replace(['-'],[None]) @@ -1137,7 +1137,7 @@ def filter_saisierror(df): tmp.set_index([*cc], inplace=True) tmp = tmp.stack().reset_index(-1) tmp.columns = ['param','value'] - tmp[['param','index','other']] = [re.split('(\d+)',s) for s in [*tmp.param]] + tmp[['param','index','other']] = [re.split(r'(\d+)',s) for s in [*tmp.param]] del tmp['other'] tmp['index'] = tmp['index'].astype(int) tmp['value'] = tmp['value'].replace(['-'],[None]) @@ -1180,7 +1180,7 @@ def filter_saisierror(df): cb = pycen.ref_hab().get_CB() - tmp.code_hab = tmp.code_hab.replace(['\*'],[''],regex=True).str.strip() + tmp.code_hab = tmp.code_hab.replace([r'\*'],[''],regex=True).str.strip() tmp.code_hab = tmp.code_hab.replace(['0'],[None]) tmp.dropna(subset=['code_hab'], inplace=True) tmpp = tmp[['id_site','index','code_hab']].copy() @@ -1303,8 +1303,9 @@ if __name__ == "__main__": ] # from_table = '"cr_ECRIN_habitats_CBNA_2014"' from_table = None - from_file = 'PS38_modifs_AG_2024.gpkg' - path0 = '/home/colas/Documents/9_PROJETS/2_PS/TO IMPORT/2024/' + from_file = 'PS prioritaire.geojson' + from_tab = 'Tableau_saisie_PS_2026.xlsx' + path0 = '/home/colas/Documents/9_PROJETS/2_PS/TO IMPORT/2026/' # org = from_file.split('/')[1] tutu = pd.DataFrame() diff --git a/5_GEONATURE/EXPORT/v_synthese_zones_humides.py b/5_GEONATURE/EXPORT/v_synthese_zones_humides.py index 1ee990a..5e0db58 100644 --- a/5_GEONATURE/EXPORT/v_synthese_zones_humides.py +++ b/5_GEONATURE/EXPORT/v_synthese_zones_humides.py @@ -1,9 +1,6 @@ from pycen import con_gn -sql = ''' -DROP VIEW IF EXISTS gn_exports.v_synthese_zones_humides; - -CREATE VIEW gn_exports.v_synthese_zones_humides AS +sql0 = ''' with habitats as ( SELECT zh_uuid, @@ -25,8 +22,7 @@ with habitats as ( FROM pr_zh.t_zh LEFT JOIN pr_zh.cor_zh_lim_fs USING (id_zh) group by 1 order by 1 -), activ_hum AS ( - WITH v_activity AS ( +), v_activity AS ( SELECT id_zh, json_agg(ref_nomenclatures.get_nomenclature_label(cor_impact_types.id_impact)) impacts @@ -34,38 +30,60 @@ with habitats as ( LEFT JOIN pr_zh.cor_impact_list USING (id_impact_list) LEFT JOIN pr_zh.cor_impact_types USING (id_cor_impact_types) group by 1 order by 1 - ) +), activ_hum AS ( SELECT zh_uuid, - json_agg(json_build_object( - 'activite', ref_nomenclatures.get_nomenclature_label(t_activity.id_activity), - 'position', ref_nomenclatures.get_nomenclature_label(t_activity.id_position), - 'impact', v_activity.impacts, - 'rmq_activ', t_activity.remark_activity - )) AS activ_hum + json_agg(CASE WHEN t_activity.id_activity IS NULL + THEN NULL + ELSE json_build_object( + 'activite', ref_nomenclatures.get_nomenclature_label(t_activity.id_activity), + 'position', ref_nomenclatures.get_nomenclature_label(t_activity.id_position), + 'impact', v_activity.impacts, + 'rmq_activ', t_activity.remark_activity + ) + END) AS activ_hum FROM pr_zh.t_zh LEFT JOIN pr_zh.t_activity USING (id_zh) LEFT JOIN v_activity USING (id_zh) group by zh_uuid order by 1 +--), activ_hum_test AS ( +-- SELECT +-- zh_uuid, +-- CASE WHEN t_activity.id_activity IS NOT NULL +-- THEN jsonb_build_object( +-- ref_nomenclatures.get_nomenclature_label(t_activity.id_activity), v_activity.impacts +-- ) +-- ELSE NULL +-- END AS activ_hum_test +-- FROM pr_zh.t_zh +-- LEFT JOIN pr_zh.t_activity USING (id_zh) +-- LEFT JOIN v_activity USING (id_zh) +-- --group by zh_uuid order by 1 ), inflow as ( SELECT zh_uuid, - json_agg(json_build_object( + json_agg(CASE WHEN t_inflow.id_inflow IS NULL + THEN NULL + ELSE json_build_object( 'entree_eau', ref_nomenclatures.get_nomenclature_label(t_inflow.id_inflow), 'perm', ref_nomenclatures.get_nomenclature_label(t_inflow.id_permanance), 'topo', t_inflow.topo - )) AS entree_eau + ) + END) AS entree_eau FROM pr_zh.t_zh LEFT JOIN pr_zh.t_inflow USING (id_zh) group by zh_uuid ), outflow as ( SELECT zh_uuid, - json_agg(json_build_object( - 'sortie_eau', ref_nomenclatures.get_nomenclature_label(t_outflow.id_outflow), - 'perm', ref_nomenclatures.get_nomenclature_label(t_outflow.id_permanance), - 'topo', t_outflow.topo - )) AS sortie_eau + json_agg(CASE WHEN t_outflow.id_outflow IS NULL + THEN NULL + ELSE json_build_object( + 'sortie_eau', ref_nomenclatures.get_nomenclature_label(t_outflow.id_outflow), + 'perm', ref_nomenclatures.get_nomenclature_label(t_outflow.id_permanance), + 'topo', t_outflow.topo + ) + END) AS sortie_eau FROM pr_zh.t_zh LEFT JOIN pr_zh.t_outflow USING (id_zh) group by zh_uuid @@ -247,11 +265,13 @@ SELECT zh_uuid, code, main_name, - CONCAT(crea_role.nom_role, ' ', crea_role.prenom_role) crea_author, - CONCAT(updt_role.nom_role, ' ', updt_role.prenom_role) updt_author, - bib_org.name organisme, + --concat(crea_role.nom_role, ' ', crea_role.prenom_role) AS crea_author, + --bib_org.name AS organisme, + --concat(updt_role.nom_role, ' ', updt_role.prenom_role) AS updt_author, + bib_org_user_updt.nom_organisme as org_updt, create_date crea_date, update_date updt_date, + --ST_TRANSFORM(geom,2154)::geometry(geometry,2154) geom, geom, area surface, rb.river_bassin, @@ -259,27 +279,43 @@ SELECT zh_area_com.commune, ref_nomenclatures.get_nomenclature_label(id_sdage) sdage, ref_nomenclatures.get_nomenclature_label(id_sage) sage, - habitats.habitats, + CASE WHEN habitats.habitats::text = '[null]' + THEN NULL + ELSE habitats.habitats + END AS habitats, remark_pres descript, crit_delim.crit_delim, remark_lim rmq_delilm, - esp_fs.crit_esp_fs, + CASE WHEN esp_fs.crit_esp_fs::text = '[null]' + THEN NULL + ELSE esp_fs.crit_esp_fs + END AS crit_esp_fs, remark_lim_fs rmq_esp_fs, - ef_area, - v_habref v_hab, - activ_hum.activ_hum, + --ef_area, + --v_habref v_hab, + CASE WHEN activ_hum.activ_hum::text = '[null]' + THEN NULL + ELSE activ_hum.activ_hum::text + END AS activ_hum, +-- activ_hum_test.activ_hum_test, ref_nomenclatures.get_nomenclature_label(id_thread) bilan_menace, - inflow.entree_eau, - outflow.sortie_eau, + CASE WHEN inflow.entree_eau::text = '[null]' + THEN NULL + ELSE inflow.entree_eau::text + END AS entree_eau, + CASE WHEN outflow.sortie_eau::text = '[null]' + THEN NULL + ELSE outflow.sortie_eau::text + END AS sortie_eau, ref_nomenclatures.get_nomenclature_label(id_frequency) freq_sub, ref_nomenclatures.get_nomenclature_label(id_spread) extend_sub, ref_nomenclatures.get_nomenclature_label(id_connexion) connex, ref_nomenclatures.get_nomenclature_label(id_diag_hydro) diag_hydro, ref_nomenclatures.get_nomenclature_label(id_diag_bio) diag_bio, - functions.hydro, - functions.bio, - functions.int_patrim, - functions.val_socio, + functions.hydro::text, + functions.bio::text, + functions.int_patrim::text, + functions.val_socio::text, remark_eval_functions eval_fcts, remark_eval_heritage eval_heritage, remark_eval_thread eval_menace, @@ -293,19 +329,21 @@ SELECT especes.nb_flora nb_flora_sp, especes.nb_vertebrates nb_vertebrate_sp, especes.nb_invertebrates nb_invertebrate_sp, - inventaire.inventaire, - actions.prio_actions, - instrument.instrument, - urba.docs_urba + inventaire.inventaire::text, + actions.prio_actions::text, + instrument.instrument::text, + urba.docs_urba::text --remark_is_other_inventory FROM pr_zh.t_zh JOIN utilisateurs.t_roles crea_role ON t_zh.create_author = crea_role.id_role LEFT JOIN utilisateurs.t_roles updt_role ON t_zh.update_author = updt_role.id_role +LEFT JOIN utilisateurs.bib_organismes bib_org_user_updt on updt_role.id_organisme = bib_org_user_updt.id_organisme LEFT JOIN pr_zh.bib_organismes bib_org USING (id_org) LEFT JOIN habitats USING (zh_uuid) LEFT JOIN crit_delim USING (zh_uuid) LEFT JOIN esp_fs USING (zh_uuid) LEFT JOIN activ_hum USING (zh_uuid) +--LEFT JOIN activ_hum_test USING (zh_uuid) LEFT JOIN inflow USING (zh_uuid) LEFT JOIN outflow USING (zh_uuid) LEFT JOIN functions USING (zh_uuid) @@ -317,11 +355,37 @@ LEFT JOIN actions USING (id_zh) LEFT JOIN zh_area_com USING (id_zh) LEFT JOIN dep USING (id_zh) LEFT JOIN inventaire USING (id_zh) +''' + +sql_zh_all = ''' +DROP VIEW IF EXISTS gn_exports.v_synthese_zones_humides; + +CREATE VIEW gn_exports.v_synthese_zones_humides AS +''' + sql0 + ''' --group BY zh_uuid -WHERE code not like '38CENIS%%' +WHERE code not like '38CENIS%%' + AND ref_nomenclatures.get_cd_nomenclature(id_sdage)::int > 0 + --id_sdage > 0 order by code ; ''' with con_gn.begin() as cnx: - cnx.execute(sql) + cnx.execute(sql_zh_all) + + +sql_zh_38 = ''' +DROP VIEW IF EXISTS gn_exports.v_synthese_zones_humides_isere; + +CREATE VIEW gn_exports.v_synthese_zones_humides_isere AS +''' + sql0 + ''' +--group BY zh_uuid +WHERE code not like '38CENIS%%' + AND dep.departement::jsonb @> '"Isère"' + AND ref_nomenclatures.get_cd_nomenclature(id_sdage)::int > 0 +order by code +; +''' + +with con_gn.begin() as cnx: + cnx.execute(sql_zh_38) \ No newline at end of file diff --git a/5_GEONATURE/pivot_bdc_status_v2.py b/5_GEONATURE/pivot_bdc_status_v2.py index 347fafe..e793005 100644 --- a/5_GEONATURE/pivot_bdc_status_v2.py +++ b/5_GEONATURE/pivot_bdc_status_v2.py @@ -24,6 +24,7 @@ def get_status(lst,con): t.nom_valide, t.lb_nom, --s.* + s.cd_sig, s.rq_statut, s.code_statut, s.cd_type_statut, @@ -202,12 +203,65 @@ def get_taxon_status(lst,api): } return pd.DataFrame({**phylo,**cd_status}) + +def filter_bio_geo(df,zone_bio): + idNotBioGeo = [] + # Filtre du dommaine biogeographique sur la plaine Rhodanienne et Alpine + test_rhod = df.rq_statut.str.contains('rhodanienne : Non déterminante',na=False) + test_alpi = df.rq_statut.str.contains('Alpine : Non déterminante',na=False) + + if zone_bio == 'rhod': + idNotBioGeo = df[test_rhod].index + elif zone_bio == 'alpi': + idNotBioGeo = df[test_alpi].index + elif zone_bio == 'all': + idNotBioGeo = df[test_rhod&test_alpi].index + + if not idNotBioGeo.empty: + df.drop(idNotBioGeo, inplace=True) + + return df + + +def form_territoire(df,terr): + is_dep = df.cd_sig.str.contains('INSEED') + dep = ( + ['38','42','07','26'] if terr == 'platiere' else + ['38','69','01'] if terr == 'negria' else ['38'] + ) + keep_not = df[is_dep&(~df.cd_sig.str[-2:].isin(dep))].index + df.drop(keep_not,inplace=True) + + is_dep = df.cd_sig.str.contains('INSEED') + is_38 = df.cd_sig=='INSEED38' + + if terr == 'isere': + filter_id = df[is_dep&(~is_38)].index + df.drop(filter_id,inplace=True) + else: + lst_stat = df[is_dep&(~is_38)].cd_type_statut.unique() + # is_lst = df.cd_type_statut.isin(lst_stat) + df.loc[is_dep&(~is_38),'cd_type_statut'] = ( df[is_dep&(~is_38)] + .cd_type_statut + '_' + df[is_dep&(~is_38)].cd_sig.str.strip('INSEED') + ) + df.loc[is_38,'cd_type_statut'] = ( df[is_38] + .cd_type_statut + '_38' + ) + + return df + + dict_dep = { '38':'Isère', '42':'Loire', '07':'Ardèche', '26':'Drôme', } + + +cols_rename = { + 'nom_vernaculaire': 'nom_vern' +} if __name__ == "__main__": @@ -219,19 +273,33 @@ if __name__ == "__main__": # Paramètres de chargement du fichier des taxons PATH0 = '/home/cgeier/Téléchargements' PATH = '' - file = 'CHASS_synthese_observations_2026-01-28.xlsx' - sheet = 'liste sp' + file = 'synthese_observations_2026-04-23.xlsx' + sheet = 'observations' + zone_bio_znieff = 'rhod' # ['rhod', 'alpi', 'all'] + territoire = 'negria' # ['isere', 'platiere','negria'] + # [GEOMETRY PARAMS] + keep_geomtype = None # ['polygon', 'point', 'ligne', None] + geom_col = 'geometrie_wkt_4326' # Liste des CD_NOM en entrée - cd_col = 'cd_ref' # Nom de la colonne à utiliser dans le feuillet ``sheet`` + cd_col = 'cd_nom' # Nom de la colonne à utiliser dans le feuillet ``sheet`` + # Lecture des données taxlist = pd.read_excel(os.path.join(PATH0,PATH,file),sheet,usecols=[cd_col],header=0) tab_sp = pd.read_excel(os.path.join(PATH0,PATH,file),sheet,index_col=cd_col) + tab_sp.rename(columns=cols_rename,inplace=True) + + # Exclusion d'un type de géométrie + if keep_geomtype is not None: + as_geom = tab_sp[geom_col].str.contains(keep_geomtype.upper(),na=False) + tab_sp = tab_sp[as_geom] + taxlist = taxlist[taxlist.cd_nom.isin(tab_sp.index.tolist())] + lst = taxlist[cd_col] # Récupération des statuts - df = get_status(taxlist[cd_col].astype(str),con_gn) + df = get_status(taxlist[cd_col].astype(str).unique(),con_gn) typ = get_type_status(con_gn) typ = typ[typ.cd_type_statut.isin(df.cd_type_statut.unique())] @@ -241,32 +309,70 @@ if __name__ == "__main__": df.loc[is_lrr & (df.niveau_admin == 'Ancienne région'),'cd_type_statut'] = 'LRR_RA' del df['niveau_admin'] - for c in ['cd_ref','cd_nom','lb_nom']: - if c in tab_sp.columns: - # if 'cd_nom' not in df.columns and c == 'cd_ref': continue - tab_sp.drop(c,axis=1,inplace=True) + # Filtre du dommaine biogeographique sur la plaine Rhodanienne et Alpine + df = filter_bio_geo(df,zone_bio_znieff) - pivot = pd.pivot_table( + # Filtre des statuts vis à vis du territoire d'intérêts + # Conservation des statuts Adrèche, Drôme et Loire pour la Platière + df = form_territoire(df,territoire) + + # for c in ['cd_ref','cd_nom','lb_nom']: + # if c in tab_sp.columns: + # # if 'cd_nom' not in df.columns and c == 'cd_ref': continue + # tab_sp.drop(c,axis=1,inplace=True) + + keep_cols = same_col = df.columns[df.columns.isin(tab_sp.reset_index(drop=False).columns)] + as_vern = keep_cols.str.contains('vern').any() + as_numb = keep_cols.str.contains('nombre').any() + if not as_vern: + keep_cols = [*keep_cols,'nom_vern'] + if not as_numb: + keep_cols = [*keep_cols,'nombre_min','nombre_max'] + else: + same_col = [x for x in keep_cols if x not in ['nombre_min','nombre_max']] + + piv = pd.pivot_table( df, values='code_statut', - index=['cd_nom', 'cd_ref','lb_nom'#,'niveau_admin','lb_adm_tr' + index=['cd_nom', 'cd_ref','lb_nom','nom_vern'#,'niveau_admin','lb_adm_tr' ], columns=['cd_type_statut'], aggfunc=list,fill_value=None) - for c in pivot.columns: - pivot[c] = [x[0] if x is not np.NaN and len(x)==1 else x for x in pivot[c]] - if 'DH' in pivot.columns: - pivot['DH'] = [','.join(x) if (x is not np.NaN) and (len(x)==2) else x for x in pivot['DH']] - pivot.DH.replace({'CDH':''},regex=True,inplace=True) + for c in piv.columns: + piv[c] = [x[0] if x is not np.NaN and len(x)==1 else x for x in piv[c]] + if 'DH' in piv.columns: + piv['DH'] = [','.join(x) if (x is not np.NaN) and (len(x)==2) else x for x in piv['DH']] + piv.DH.replace({'CDH':''},regex=True,inplace=True) + # piv.reset_index(-1, inplace=True) - pivot = tab_sp.merge(pivot,on=[cd_col],how='left') + # tabsp_nb = tab_sp.reset_index(drop=False)[[*same_col,'nombre_min','nombre_max']].groupby([*same_col]).sum() + tabsp_nb = ( + tab_sp.reset_index(drop=False)[same_col] + .drop_duplicates() + .merge( + tab_sp.reset_index(drop=False)[[cd_col,'nombre_min','nombre_max','date_debut','date_fin']] + .groupby([cd_col]) + .agg({ + 'nombre_min':'sum', + 'nombre_max':'sum', + 'date_debut':'min', + 'date_fin':'max' + }), + on = cd_col + ) + ) + tabsp_nb.set_index(cd_col,inplace=True) + tabsp_nb.sort_index(inplace=True) + + # pivot = tab_sp.merge(piv,on=[cd_col],how='left') + pivot = tabsp_nb.merge(piv,on=[cd_col],how='left') pivlib = pd.pivot_table( df, values='label_statut', index=[ - 'cd_nom', 'cd_ref','lb_nom'#,'niveau_admin','lb_adm_tr' + 'cd_nom', 'cd_ref','lb_nom','nom_vern'#,'niveau_admin','lb_adm_tr' ], columns=['cd_type_statut'], aggfunc=list,fill_value=None) @@ -276,10 +382,18 @@ if __name__ == "__main__": pivlib['DH'] = [','.join(x) if (x is not np.NaN) and (len(x)==2) else x for x in pivlib['DH']] pivlib.DH.replace({'CDH':''},regex=True,inplace=True) - pivlib = tab_sp.merge(pivlib,on=[cd_col],how='left') + # pivlib = tab_sp.merge(pivlib,on=[cd_col],how='left') + pivotlib = tabsp_nb.merge(pivlib,on=[cd_col],how='left') + + tx_nb_missing = df[~df.cd_nom.isin(tabsp_nb.index)].shape[0] + if tx_nb_missing > 0: + print('WARNING : %i taxon(s) is MISING !! \n'%tx_nb_missing) print('INIT writer') NAME_OUT = os.path.join('~/',sheet+'_status.xlsx') + if keep_geomtype is not None: + NAME_OUT = NAME_OUT[:-5]+' (%s only).xlsx'%keep_geomtype.lower() + with pd.ExcelWriter(NAME_OUT) as writer: df.to_excel( writer,sheet_name='v_bdc_status',index=False @@ -291,7 +405,7 @@ if __name__ == "__main__": ) # writer.save() print('pivot_table OK !') - pivlib.to_excel( + pivotlib.to_excel( writer,sheet_name='pivot_libel' ) # writer.save() @@ -301,3 +415,5 @@ if __name__ == "__main__": ) # writer.save() print('dic_type_statut OK !') + print('END writing %s'%NAME_OUT) +