#!/usr/bin/env python3 # -*- coding: UTF-8 -*- #Nom : : zh.py #Description : #Copyright : 2021, CEN38 #Auteur : Colas Geier #Version : 1.0 import pandas as pd # import pandas_access as mdb # import numpy as np # from sqlalchemy.sql.expression import column from sqlalchemy import create_engine from geoalchemy2 import Geometry from .pers.pers import _get_table from .sites.sites import _get_typ_milieux from .tools import _get_relation_autor ##################################### ### schema personnes ### ##################################### # class pers: # def __init__(self): # from .params import con # self.schema = 'personnes' # self.con = con # # self._get_table = _get_table # def get_auteur(self, nom=None, prenom=None): # sql = 'SELECT * FROM %s.personne'%self.schema # if nom or prenom : sql = sql + ' WHERE ' # if nom : # sql = sql + 'nom IN %(nom)s' # nom = to_upper(nom) # if nom and prenom : sql = sql + ' AND ' # if prenom : # sql = sql + 'prenom IN %(prenom)s' # prenom = to_upperfirst(prenom) # df = pd.read_sql( # sql = sql, # con = self.con, # params = {'nom': to_tuple(nom), 'prenom': to_tuple(prenom) }) # return df # def get_organisme(self, ids=None, nom=None): # table = 'organisme' # return _get_table(self.con, self.schema, table, ids=ids, nom=nom) ##################################### ### schema sites ### ##################################### # class sites: # def __init__(self): # from .params import con # from .pers import pers # self.schema = 'sites' # self.con = con # self.typ_milieux = self._get_typ_milieux() # self.typo_sdage = self._get_typo_sdage() # self.typ_site = self._get_typ_site() # self.auteur = pers.get_auteur() # self.organisme = pers.get_organisme() # def _get_typ_milieux(self, ids=None, nom=None): # table = 'type_milieu' # df = _get_table(self.con, self.schema, table, ids=ids, nom=nom) # return df # def _get_typo_sdage(self, ids=None, nom=None): # table = 'typo_sdage' # df = _get_table(self.con, self.schema, table, ids=ids, nom=nom) # return df # def _get_typ_site(self, ids=None, nom=None): # table = 'type_site' # df = _get_table(self.con, self.schema, table, ids=ids, nom=nom) # return df # def _merge_orga(self, df, split_cols): # org = self.organisme # aut = self.auteur # df = df.copy() # for c in split_cols: # if not isinstance(df[c], int): df[c] = df[c].astype(float) # df[c].replace(aut.id.tolist(), aut.id_organisme.tolist(), inplace=True) # df[c].replace(org.id.tolist(), org.nom.tolist(), inplace=True) # df['organisme'] = None # for c in split_cols: # df.loc[df.organisme.isna(), 'organisme'] = df.loc[df['organisme'].isna(), c] # for c in split_cols: # comp = df.loc[~df[c].isna(),'organisme'].compare(df.loc[~df[c].isna(), c]) # if not comp.empty: # comp['test'] = comp.apply(lambda x: x['other'] in x['self'], axis=1) # comp = comp[~comp.test] # if not comp.empty: # df.loc[comp.index,'organisme'] = comp.self + ' & ' + comp.other # df.drop(columns=split_cols, inplace=True) # return df # def _merge_author(self, df, col_aut, orga=False): # # récupération des auteurs # aut = self.auteur.fillna('') # aut['nom_prenom'] = (aut['nom'] + ' ' + aut['prenom']).str.strip() # aut['id'] = aut['id'].astype(str) # # merge des auteurs # r_id = df[['id', col_aut]].copy() # r_idSplit = r_id[col_aut].str.split(' & ', expand=True) # r_id = r_id.join(r_idSplit) # cSplit = r_idSplit.shape[1] # cSplit = list(range(cSplit)) # if orga: # # récup des organismes # org = self._merge_orga(r_id, cSplit) # r_id[cSplit] = r_id[cSplit].replace(aut['id'].tolist(),aut['nom_prenom'].tolist()) # r_id = _aggr_cols(r_id,cSplit,' & ') \ # .rename(columns={'aggreg': 'auteur'}) \ # .drop(columns=cSplit) # if orga: # # merge des organismes # r_id = pd.merge(r_id,org, on=['id', col_aut]) # df = pd.merge(df,r_id, on=['id', col_aut]) \ # .drop(columns=[col_aut]) # return df # def _merge_relation(self, df, table, schema, id=None, left_id=None,right_id=None): # con = self.con # if id: # params = {id: df[id].tolist() } # elif left_id and right_id: # params = {right_id: df[left_id].tolist() } # mrg = _get_table(con, schema, table, params_col=params) # if table == 'r_sites_auteur' or table == 'r_geomsites_auteur': # mrg = mrg[[right_id,'id_auteur']].groupby( # [right_id])['id_auteur'].apply(lambda x: ' & '.join(x.astype(str))) # mrg = pd.DataFrame(data=mrg) # if id: # df = pd.merge(df,mrg, how='left', on=id) # elif left_id and right_id: # df = pd.merge(df,mrg, how='left', left_on=left_id, right_on=right_id) # return df # def get_sitesInfos(self, ids=None, nom=None, columns=None, with_nameOrga=False, details=False, params_col={}): # drop = [] # table = 'sites' # df = _get_table(self.con, self.schema, table, ids=ids, nom=nom, cols=columns, params_col=params_col) # # récupération des auteurs # if 'id_auteur' in df.columns: # df.drop(columns='id_auteur', inplace=True) # df = _merge_relation(df=df,table='r_sites_auteur',schema=self.schema, left_id='id',right_id='id_site') # df = _merge_author(df=df, col_aut='id_auteur', orga=with_nameOrga) # # merge type_site # if 'id_type_site' in df.columns: # df = pd.merge(df, self.typ_site, how='left', left_on='id_type_site', right_on='id', suffixes=('','_y') ) \ # .drop(columns=['id_type_site', 'id_y']) \ # .rename(columns={'nom_y': 'type_site', 'description': 'desc_type_site'}) # drop += ['desc_type_site'] # # merge typo_sdage # if 'id_typo_sdage' in df.columns: # df = pd.merge(df, self.typo_sdage, how='left', left_on='id_typo_sdage', right_on='id', suffixes=('','_y') ) \ # .drop(columns=['id_typo_sdage', 'id_y']) \ # .rename(columns={'nom_y': 'typo_sdage', 'description': 'desc_typo_sdage'}) # drop += ['desc_typo_sdage'] # # merge type_milieu # if 'id_type_milieu' in df.columns: # df = pd.merge(df, self.typ_milieux, how='left', left_on='id_type_milieu', right_on='id', suffixes=('','_y') ) \ # .drop(columns=['id_type_milieu', 'id_y']) \ # .rename(columns={'nom_y': 'type_milieu', 'description': 'desc_type_milieu', 'nom_court': 'nom_court_milieu'}) # drop += ['desc_type_milieu', 'nom_court_milieu'] # if not details: # df.drop(columns=drop, inplace=True) # return df.sort_values('id') # def get_sitesGeom(self, id_site=None, nom_site=None, columns=None, last_update=False, with_nameOrga=False, params_col={}): # # from shapely.wkb import loads # # import geopandas as gpd # set_geometry # if columns: # if not isinstance(columns, list): columns = [columns] # if 'id' not in columns: columns.insert(0,'id') # if 'id_site' not in columns: columns.insert(1,'id_site') # if 'geom' not in columns: columns.insert(2,'geom') # table = 'sites' # df = _get_table(self.con, self.schema, table, ids=id_site, nom=nom_site, cols='id', params_col=params_col) # idSite = df.id.tolist() # table = 'r_sites_geom' # df = _get_table(self.con, self.schema, table, params_col={'id_site':idSite}, cols=columns) # if last_update: # df.drop_duplicates(subset=['id_site'], keep='last', inplace=True) # df.reset_index(inplace=True, drop=True) # # df = _set_geom(df) # # df['geom'] = [(loads(geom, hex=True)) for geom in df['geom']] # # df = df.set_geometry('geom', crs='EPSG:2154') # # merge auteur # if 'id_auteur' in df.columns: # df.drop(columns='id_auteur', inplace=True) # df = _merge_relation(df=df,table='r_geomsites_auteur',schema=self.schema, left_id='id',right_id='id_geom_site') # df = _merge_author(df=df, col_aut='id_auteur', orga=with_nameOrga) # return df ##################################### ### schema zh ### ##################################### class zh(): def __init__(self): from .params import con from .tools import _get_relation_tab self.schema = 'zones_humides' self.con = con self.typ_milieux = _get_typ_milieux(nom='Tourbières et marais') self.id_milieux = self.typ_milieux.id.values[0] self._get_relation_tab = _get_relation_tab self.lst_tab = con.dialect.get_table_names(con,schema=self.schema) self.columns_rSiteFcts = con.dialect.get_columns(con,schema=self.schema,table_name='r_site_fctecosociopatri') self.columns_r_SiteCon = con.dialect.get_columns(con,schema=self.schema,table_name='r_site_type_connect') self.columns_rSiteCritDelim = con.dialect.get_columns(con,schema=self.schema,table_name='r_site_critdelim') self.columns_r_SiteHabs = con.dialect.get_columns(con,schema=self.schema,table_name='r_site_habitat') self.columns_rSiteRegHyd = con.dialect.get_columns(con,schema=self.schema,table_name='r_site_reghydro') self.columns_r_SiteSub = con.dialect.get_columns(con,schema=self.schema,table_name='r_site_sub') self.columns_r_SiteUsgPrss = con.dialect.get_columns(con,schema=self.schema,table_name='r_site_usageprocess') def _get_param(self, param_table, type_table=None, type_court=True): if type_table: typ = _get_table(self.con, self.schema, table=type_table) par = _get_table(self.con, self.schema, table=param_table, params_col={'id_type':typ.id.tolist()}) df = pd.merge(par, typ, left_on='id_type', right_on='id', how='left', suffixes=(None, '_typ')) \ .drop(columns=['id_type','id_typ']) if 'description_typ' in df.columns: del df['description_typ'] if type_court: df = df.drop(columns=['nom_typ']).rename(columns={'nom_court_typ':'type'}) else : df = df.drop(columns=['nom_court_typ'],errors='ignore').rename(columns={'nom_typ':'type'}) df = df.set_index(['id', 'type']).reset_index() else: df = _get_table(self.con, self.schema, table=param_table) return df # def _get_relation_tab(self, tab, id_site=None, nom_site=None, last_update=False, geom=False,params_col={}): # table = 'sites' # dfSG = get_sitesGeom(columns='date', id_site=id_site, nom_site=nom_site, last_update=last_update,params_col=params_col) # if not geom and not dfSG.empty: # dfSG.drop('geom',1,inplace=True) # ids = dfSG.id.tolist() # table = tab # if ids : # df = _get_table(self.con, self.schema, table, params_col={'id_geom_site':ids}) # # if not df.empty: # df = pd.merge(dfSG,df, how='left', left_on='id', right_on='id_geom_site', suffixes=('_x', None)) \ # .drop(['id_x','id_geom_site'],1) \ # .set_index('id').reset_index() # return df # else: # print('PAS de géometries de sites sélectionnées ...') def get_delim(self, id_site=None, nom_site=None, last_update=True, geom=False, nom_type_court=True,statut='actif'): table = 'r_site_critdelim' df = self._get_relation_tab( schema=self.schema,tab=table,id_site=id_site,nom_site=nom_site,last_update=last_update,geom=geom, params_col={'id_type_milieu':self.id_milieux.astype(str)}, statut=statut) dic = self._get_param(type_table='type_param_delim_fct', param_table='param_delim_fct', type_court=nom_type_court) if not df.empty: df = _get_relation_autor(df, relation_tab='r_rsitedelim_auteur', schema=self.schema, id_df='id', id_relation='id_sitedelim', id_rela_auth='id_auteur' ) df = pd.merge(df,dic, how='left', left_on='id_crit_delim', right_on='id', suffixes=(None,'_y')) \ .drop(['id_y','id_crit_delim'],1) \ .rename(columns={'description_y':'desc_param', 'nom_court':'nom_court_crit','nom':'nom_crit'}) \ .sort_values('id_site') if df.nom_court_crit.isnull().sum() == df.shape[0] : del df['nom_court_crit'] # typ = df.type.unique() # x = {} # for t in typ: # x[t] = df[df.type == t] # x[t] = x[t].rename(columns={'nom': t}) \ # .reset_index(drop=True) return df def get_fct(self, id_site=None, nom_site=None, last_update=True, geom=False, nom_type_court=True,statut='actif'): table = 'r_site_fctecosociopatri' df = self._get_relation_tab(schema=self.schema,tab=table,id_site=id_site,nom_site=nom_site,last_update=last_update,geom=geom, params_col={'id_type_milieu':self.id_milieux.astype(str)}, statut=statut) dic = self._get_param(type_table='type_param_fct', param_table='param_fct_eco_socio_patri', type_court=nom_type_court) if not df.empty: df = _get_relation_autor(df, relation_tab='r_rsitefct_auteur', schema=self.schema, id_df='id', id_relation='id_sitefct', id_rela_auth='id_auteur' ) df = pd.merge(df,dic, how='left', left_on='id_fct', right_on='id', suffixes=(None,'_y')) \ .drop(['id_y','id_fct'],1) \ .rename(columns={'description_y':'desc_param', 'nom_court':'nom_court_fct','nom':'nom_fct'}) \ .sort_values('id_site') if df.nom_court_fct.isnull().sum() == df.shape[0] : del df['nom_court_fct'] return df def get_connex(self, id_site=None, nom_site=None, last_update=True, geom=False,statut='actif'): table = 'r_site_type_connect' df = self._get_relation_tab(schema=self.schema,tab=table,id_site=id_site,nom_site=nom_site,last_update=last_update,geom=geom, params_col={'id_type_milieu':self.id_milieux.astype(str)}, statut=statut) dic = self._get_param(param_table='param_type_connect') if not df.empty: df = _get_relation_autor(df, relation_tab='r_rsiteconnect_auteur', schema=self.schema, id_df='id', id_relation='id_siteconnect', id_rela_auth='id_auteur' ) df = pd.merge(df,dic, how='left', left_on='id_param_connect', right_on='id', suffixes=(None,'_y')) \ .drop(['id_y','id_param_connect'],1) \ .rename(columns={'description_y':'desc_param', 'nom':'connexion'}) \ .sort_values('id_site') return df def get_sub(self, id_site=None, nom_site=None, last_update=True, geom=False,statut='actif'): table = 'r_site_sub' df = self._get_relation_tab(schema=self.schema,tab=table,id_site=id_site,nom_site=nom_site,last_update=last_update,geom=geom, params_col={'id_type_milieu':self.id_milieux.astype(str)}, statut=statut) dic = self._get_param(type_table='type_param_sub', param_table='param_sub', type_court=False) d1 = dic[dic.type == 'Submersion étendue'] d2 = dic[dic.type == 'Submersion fréquente'] if not df.empty: df = _get_relation_autor(df, relation_tab='r_rsitesub_auteur', schema=self.schema, id_df='id', id_relation='id_sitesub', id_rela_auth='id_auteur' ) df = pd.merge(df,d1, how='left', left_on='id_etendsub', right_on='id', suffixes=(None,'_y')) \ .drop(['id_y','id_etendsub', 'type'],1) \ .rename(columns={'description':'desc_param_etend', 'nom':'Submersion étendue'}) df = pd.merge(df,d2, how='left', left_on='id_freqsub', right_on='id', suffixes=(None,'_y')) \ .drop(['id_y','id_freqsub', 'type'],1) \ .rename(columns={'description':'desc_param_freq', 'nom':'Submersion fréquente'}) \ .sort_values('id_site') df.rename(columns={'id_origsub': 'origine_sub'}, inplace=True) if df['desc_param_etend'].isnull().sum() == df.shape[0] : del df['desc_param_etend'] if df['desc_param_freq'].isnull().sum() == df.shape[0] : del df['desc_param_freq'] return df def get_usageprocess(self, id_site=None, nom_site=None, last_update=True, geom=False,statut='actif'): table = 'r_site_usageprocess' df = self._get_relation_tab(schema=self.schema,tab=table,id_site=id_site,nom_site=nom_site,last_update=last_update,geom=geom, params_col={'id_type_milieu':self.id_milieux.astype(str)}, statut=statut) dic1 = self._get_param(param_table='param_activ_hum') dic2 = self._get_param(param_table='param_position') dic3 = self._get_param(param_table='param_impact') if not df.empty: df = _get_relation_autor(df, relation_tab='r_rsiteusage_auteur', schema=self.schema, id_df='id', id_relation='id_siteusage', id_rela_auth='id_auteur' ) df = pd.merge(df,dic1, how='left', left_on='id_activ_hum', right_on='id', suffixes=(None,'_y')) \ .drop(['id_y','id_activ_hum'],1) \ .rename(columns={'description':'desc_param_usag', 'nom':'activite_hum'}) df = pd.merge(df,dic2, how='left', left_on='id_position', right_on='id', suffixes=(None,'_y')) \ .drop(['id_y','id_position'],1) \ .rename(columns={'description':'desc_param_pos', 'nom':'position'}) \ .sort_values('id_site') df = pd.merge(df,dic3, how='left', left_on='id_impact', right_on='id', suffixes=(None,'_y')) \ .drop(['id_y','id_impact'],1) \ .rename(columns={'description':'desc_param_imp', 'nom':'impact'}) \ .sort_values('id_site') return df def _get_r_toponymie(self, ids=None): table = 'r_toponymie' df = _get_table(self.con, self.schema, table=table, ids=ids) dic1 = self._get_param(param_table='liste_table_topohydro') if not df.empty: df = pd.merge(df,dic1, how='left', left_on='id_orig', right_on='id', suffixes=(None,'_y')) \ .drop(['id_y','id_orig'],1) n_tab = df.nom_table.unique() for tab in n_tab: iids = df.loc[df.nom_table == tab, 'id_topo'].to_list() if tab == 'orig_hydro': dic = _get_table(self.con, self.schema, table='orig_hydro', ids=iids) if tab == 'troncon_hydro': dic = ref_hydro.get_troncon(cols=['id','nom'], ids=iids) df.loc[df.nom_table == tab, 'id_topo'] = df.loc[df.nom_table == tab, 'id_topo'].replace(dic.id.to_list(),dic.nom.to_list()) if tab == 'troncon_hydro': df = pd.merge(df, dic, how='left', left_on='id_topo', right_on='nom', suffixes=(None,'_y')) \ .drop(columns=['id_y', 'nom']) df.rename(columns={'id_topo':'toponymie'}) return df def get_regHydro(self, id_site=None, nom_site=None, last_update=True, geom=False,statut='actif'): table = 'r_site_reghydro' df = self._get_relation_tab(schema=self.schema,tab=table,id_site=id_site,nom_site=nom_site,last_update=last_update,geom=geom, params_col={'id_type_milieu':self.id_milieux.astype(str)}, statut=statut) dic1 = self._get_param(param_table='param_reg_hydro') dic2 = self._get_param(param_table='param_permanence') if not df.empty: df = _get_relation_autor(df, relation_tab='r_rsitehydro_auteur', schema=self.schema, id_df='id', id_relation='id_sitehydro', id_rela_auth='id_auteur' ) # dic3 = self._get_r_toponymie(ids=df.rmq_toponymie.unique().tolist()) df.in_out = df.in_out.replace([True,False],['entree','sortie']) df = pd.merge(df,dic1, how='left', left_on='id_reg_hydro', right_on='id', suffixes=(None,'_y')) \ .drop(['id_y','id_reg_hydro'],1) \ .rename(columns={'description':'desc_param_regHydri', 'nom':'regime_hydri'}) if df.id_permanence.isna().all() : df.rename(columns={'id_permanence':'permanence'}, inplace=True) df['desc_param_perm'] = None else: df = pd.merge(df,dic2, how='left', left_on='id_permanence', right_on='id', suffixes=(None,'_y')) \ .drop(['id_y','id_permanence'],1) \ .rename(columns={'description':'desc_param_perm', 'nom':'permanence'}) # df = pd.merge(df,dic3, left_on='rmq_toponymie', right_on='id', suffixes=(None,'_y')) \ # .drop(['id_y','rmq_toponymie'],1) \ # .rename(columns={'description':'desc_topo'}) \ # .sort_values('id_site') return df def get_habitat(self, id_site=None, nom_site=None, last_update=True, geom=False,statut='actif'): table = 'r_site_habitat' df = self._get_relation_tab(schema=self.schema,tab=table,id_site=id_site,nom_site=nom_site,last_update=last_update,geom=geom, params_col={'id_type_milieu':self.id_milieux.astype(str)}, statut=statut) if not df.empty: df = _get_relation_autor(df, relation_tab='r_rsitehab_auteur', schema=self.schema, id_df='id', id_relation='id_sitehab', id_rela_auth='id_auteur' ) ids = df[~df.id_cb.isna()].id_cb.unique().tolist() dic = ref_hab().get_CB(ids=ids,cols=['id','lb_hab_fr']) df = pd.merge(df,dic, how='left', left_on='id_cb', right_on='id', suffixes=(None,'_y')) \ .drop(['id_y'], 1) \ .rename(columns={'id_cb':'code_cb'}) \ .sort_values('id_site') return df def get_sitesInfos(self, id_site=None, nom_site=None, columns=None, with_nameOrga=False, statut='actif'): from .sites.sites import get_sitesInfos df = get_sitesInfos(ids=id_site, nom=nom_site, columns=columns, with_nameOrga=with_nameOrga, params_col={'id_type_milieu':self.id_milieux.astype(str)}, statut=statut) return df def get_sitesGeom(self, id_site=None, nom_site=None, columns=None, last_update=True, with_nameOrga=False, params_col={}, statut='actif'): from .sites.sites import get_sitesGeom if params_col: params_col = {**params_col, 'id_type_milieu':self.id_milieux.astype(str) } df = get_sitesGeom(id_site=id_site, nom_site=nom_site, columns=columns, with_nameOrga=with_nameOrga,last_update=last_update, params_col=params_col , statut=statut) drop_cols = ['link_pdf', 'rmq_fct_majeur', 'rmq_interet_patri', 'rmq_bilan_menace', 'rmq_orient_act', 'rmq_usage_process'] cols = df.columns c = cols[cols.isin(drop_cols)] if not c.empty: df.drop(columns=c, inplace=True) return df def get_evaluation(self, id_site=None, nom_site=None, columns=None, last_update=True, with_nameOrga=False, params_col={}, statut='actif'): from .sites.sites import get_sitesGeom if params_col: params_col = {**params_col, 'id_type_milieu':self.id_milieux.astype(str) } df = get_sitesGeom(id_site=id_site, nom_site=nom_site, columns=columns, with_nameOrga=with_nameOrga,last_update=last_update, params_col=params_col, statut=statut) df.drop(columns=['geom'], inplace=True) return df def get_bilan(self, code_site=None, nom_site=None, statut='actif',last_update=True): ''' :code_site: list,str. Code du site de la zh. :nom_site: list,str. Nom du site de la zh. ''' info = self.get_sitesInfos(id_site=code_site, nom_site=nom_site,statut=statut) CB = self.get_habitat(id_site=code_site, nom_site=nom_site,last_update=last_update,statut=statut) delim = self.get_delim(id_site=code_site, nom_site=nom_site,last_update=last_update,statut=statut) desc = self.get_usageprocess(id_site=code_site, nom_site=nom_site,last_update=last_update,statut=statut) rghyd = self.get_regHydro(id_site=code_site, nom_site=nom_site,last_update=last_update,statut=statut) subm = self.get_sub(id_site=code_site, nom_site=nom_site,last_update=last_update,statut=statut) conn = self.get_connex(id_site=code_site, nom_site=nom_site,last_update=last_update,statut=statut) fct = self.get_fct(id_site=code_site, nom_site=nom_site,last_update=last_update,statut=statut) evall = self.get_evaluation(id_site=code_site, nom_site=nom_site,last_update=last_update,statut=statut) print('subm : {}'.format(subm)) print('conn : {}'.format(conn)) if subm.empty: sub_con = conn.rename(columns={ 'description': 'desc_connex', 'valid': 'valid_cnx', }) elif conn.empty: sub_con = subm.rename(columns={'valid': 'valid_sub',}) else: sub_con = pd.merge(subm, conn, how='outer', on=['id', 'id_site', 'date_geom','auteur_geom']) \ .rename(columns={ 'description': 'desc_connex', 'valid_x': 'valid_sub', 'valid_y': 'valid_cnx', }) fctmt = { 'entree_eau': rghyd[rghyd.in_out == 'entree'].drop(columns=['in_out']), 'sortie_eau': rghyd[rghyd.in_out == 'sortie'].drop(columns=['in_out']), 'sub_connex': sub_con, } lst_df = { 'infos':info, 'corine_biotope': CB, 'delimitation': delim, 'description': desc, 'fonctionnement': fctmt, 'fonction': fct, 'evaluation': evall} for key in lst_df: if isinstance(lst_df[key], pd.DataFrame): lst_df[key].name = key if isinstance(lst_df[key], dict): for d in lst_df[key]: lst_df[key][d].name = d lst_df[key]['title'] = key return lst_df ##################################### ### schema ref_habitats ### ##################################### class ref_hab: def __init__(self): from .params import con self.schema = 'ref_habitats' self.con = con def get_CB(self, ids=None, cols=None, params_col={}): table = 'corine_biotope' df = _get_table(self.con, self.schema, table=table, ids=ids, cols=cols, params_col=params_col) return df ##################################### ### schema ref_hydro ### ##################################### class ref_hydro: def __init__(self): from .params import con self.schema = 'ref_hydro' self.con = con def get_troncon(self, ids=None, cols=None, params_col={}): table = 'troncon_hydro' df = _get_table(self.con, self.schema, table=table, ids=ids, cols=cols, params_col=params_col) # df = _set_geom(df) return df def get_coursEau(self, ids=None, cols=None, params_col={}): table = 'cours_eau' df = _get_table(self.con, self.schema, table=table, ids=ids, cols=cols, params_col=params_col) # df = _set_geom(df) return df def get_masseEau(self, ids=None, cols=None, params_col={}): table = 'masse_eau' df = _get_table(self.con, self.schema, table=table, ids=ids, cols=cols, params_col=params_col) # df = _set_geom(df) return df def get_planEau(self, ids=None, cols=None, params_col={}): table = 'plan_eau' df = _get_table(self.con, self.schema, table=table, ids=ids, cols=cols, params_col=params_col) # df = _set_geom(df) return df def get_ssbv(self, ids=None, cols=None, params_col={}): table = 'ssbv' df = _get_table(self.con, self.schema, table=table, ids=ids, cols=cols, params_col=params_col) # df = _set_geom(df) return df ##################################### ### Update ### ##################################### def update_to_sql(df, con, table_name, schema_name, key_name): a = [] b = [] table = table_name schema = schema_name primary_key = key_name if isinstance(primary_key, str): primary_key = [primary_key] for col in df.columns: if col in primary_key: b.append("t.{col}=f.{col}".format(col=col)) else: a.append("{col}=t.{col}".format(col=col)) df.to_sql( name = 'temp_table', con = con, schema = schema, if_exists = 'replace', index = False, method = 'multi' ) update_stmt_1 = "UPDATE {sch}.{final_table} f".format(sch=schema,final_table=table) update_stmt_2 = " FROM {sch}.temp_table t".format(sch=schema) update_stmt_6 = " WHERE %s"%' AND '.join(b) update_stmt_3 = " SET " update_stmt_4 = ", ".join(a) update_stmt_5 = update_stmt_1 + update_stmt_3 + update_stmt_4 + update_stmt_2 + update_stmt_6 + ";" drop_stmt = "DROP TABLE {sch}.temp_table ;".format(sch=schema) with con.begin() as cnx: cnx.execute(update_stmt_5) cnx.execute(drop_stmt) return print('END update') # [SQL: INSERT INTO zones_humides.r_site_reghydro (id, id_geom_site, id_reg_hydro, id_permanence, rmq_toponymie, in_out) # VALUES (%(id)s, %(id_geom_site)s, %(id_reg_hydro)s, %(id_permanence)s, %(rmq_toponymie)s, %(in_out)s)] # [parameters: ({'id': 0, 'id_geom_site': 5, 'id_reg_hydro': '0', 'id_permanence': '1', 'rmq_toponymie': '', 'in_out': True}, # {'id': 1, 'id_geom_site': 5, 'id_reg_hydro': '1', 'id_permanence': '1', 'rmq_toponymie': '', 'in_out': False}, # {'id': 2, 'id_geom_site': 6, 'id_reg_hydro': '0', 'id_permanence': '1', 'rmq_toponymie': '', 'in_out': True}, # {'id': 3, 'id_geom_site': 6, 'id_reg_hydro': '1', 'id_permanence': '1', 'rmq_toponymie': '', 'in_out': False}, # {'id': 4, 'id_geom_site': 7, 'id_reg_hydro': '2', 'id_permanence': '2', 'rmq_toponymie': 'plusieurs petites sources dans versant', 'in_out': True}, # {'id': 5, 'id_geom_site': 7, 'id_reg_hydro': '1', 'id_permanence': '2', 'rmq_toponymie': 'longe la route D209a', 'in_out': False}, # {'id': 6, 'id_geom_site': 8, 'id_reg_hydro': '0', 'id_permanence': '2', 'rmq_toponymie': '', 'in_out': True}, # {'id': 7, 'id_geom_site': 8, 'id_reg_hydro': '3', 'id_permanence': None, 'rmq_toponymie': '', 'in_out': False} # ... displaying 10 of 5779 total bound parameter sets ... # {'id': 5777, 'id_geom_site': 1951, 'id_reg_hydro': '0', 'id_permanence': None, 'rmq_toponymie': '', 'in_out': True}, # {'id': 5778, 'id_geom_site': 1951, 'id_reg_hydro': '3', 'id_permanence': None, 'rmq_toponymie': '', 'in_out': False})]