#!/usr/bin/env python3 # -*- coding: UTF-8 -*- #Nom : : ps.py #Description : #Copyright : 2021, CEN38 #Auteur : Colas Geier #Version : 1.0 from pandas.core.reshape.merge import merge from .pers.pers import _get_table from .sites.sites import _get_typ_milieux # from .params import con from .tools import _get_relation_tab,_set_geom schema = 'ps' milieu = 'Pelouses sèches' def get_param(): from .tools import _get_param return _get_param(schema=schema,param_table='param',type_table='type_param',type_court=False) def get_sitesInfos(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, milieu=milieu, statut=statut) df.drop(columns=['typo_sdage'], inplace=True) return df def get_listLegendePS(): from .params import con return _get_table(con,schema,'param_legende') def get_sitesGeom(id_site=None, nom_site=None, columns=None, last_update=False, with_nameOrga=False, params_col={}, statut='actif'): from .sites.sites import get_sitesGeom 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, milieu=milieu, statut=statut) # df.drop(columns=['typo_sdage'], inplace=True) return df def ps_r_site_param(id_site=None, nom_site=None, columns=None, last_update=False, geom=False, raw=False, idparam=False, pivot=True): from pandas import pivot_table from .pers.pers import _merge_relation, _merge_author table = 'r_site_param' r_tab_auteur = 'r_siteparam_auteur' df = _get_relation_tab(schema=schema,tab=table,id_site=id_site,nom_site=nom_site, last_update=last_update,geom=geom,milieu=milieu) if 'auteur' in df.columns: df.rename(columns={'auteur': 'auteur_geom'}, inplace=True) df = _merge_relation(df=df,table=r_tab_auteur,schema=schema, left_id='id',right_id='id_siteparam') df = _merge_author(df=df, col_aut='id_auteur') df.rename(columns={'auteur': 'auteur_param'}, inplace=True) dic = get_param() if not df.empty: df.date_geom = df.date_geom.astype(str) nval = 'param' ntyp = 'type' df = merge(df,dic, how='left', left_on='id_param', right_on='id', suffixes=(None,'_y'))\ .drop(['id_y','id_param'],1) \ .rename(columns={'description':'desc_param_ps', 'nom':nval}) if raw: df.drop(columns='desc_param_ps', inplace=True) else: df.drop(columns=nval, inplace=True) df.rename(columns={'desc_param_ps':nval}, inplace=True) df.taux.fillna(-999, inplace=True) if geom: dfgeom = df[['id_site', 'date_geom', 'geom']] print(dfgeom) dfgeom = dfgeom.drop_duplicates() df.drop(columns=['geom'], inplace=True) indexs = df.columns[~df.columns.isin(['taux',nval,'id','type'])].tolist() if pivot: df2 = pivot_table( df.fillna(''), values=['taux',nval,'id'], index=indexs, columns=['type'], # dropna=False, aggfunc={lambda x: ', '.join(x.astype(str))}) df2.columns = [ x[0].split('_')[0] + '_' + x[2][:6] for x in df2.columns ] date = [x for x in df2.index.names if x.startswith('date_par')] df2.reset_index(['auteur_param', *date], inplace=True) df = df2 else : df.set_index(indexs, inplace=True) if geom: idx = df.index.names df.reset_index(inplace=True) df = df.merge(dfgeom, how='left', on=['id_site', 'date_geom']) df.set_index(idx, inplace=True) df = _set_geom(df, hex=False) cols = df.columns[df.columns.str.startswith('param')].sort_values() rcol = dic.type.unique() rcol.sort() dicc = dict(zip(cols,rcol)) df.rename(columns=dicc, inplace=True) if not idparam: rmcol = df.columns[df.columns.str.startswith('id')] df.drop(columns=rmcol, inplace=True) df.replace(['-999',-999],[None, None],inplace=True, regex=True) df.dropna(how='all', axis=1, inplace=True) return df def ps_r_site_habitat(id_site=None, nom_site=None, columns=None, last_update=False, geom=False, raw=False, idhabitat=False, pivot=True): from pandas import pivot_table from .pers.pers import _merge_relation, _merge_author table = 'r_site_habitat' r_tab_auteur = 'r_sitehab_auteur' r_hab_cb = 'r_hab_cb' df = _get_relation_tab(schema=schema,tab=table,id_site=id_site, nom_site=nom_site,last_update=last_update,geom=geom,milieu=milieu) if 'auteur' in df.columns: df.rename(columns={'auteur': 'auteur_geom'}, inplace=True) df = _merge_relation(df=df,table=r_tab_auteur,schema=schema, left_id='id',right_id='id_sitehab') df = _merge_author(df=df, col_aut='id_auteur') df.rename(columns={'auteur': 'auteur_hab'}, inplace=True) indexs = df.columns[~df.columns.isin(['id','n_hab','geom','index'])].tolist() df = _merge_relation(df=df,table=r_hab_cb,schema=schema, left_id='id',right_id='id_sitehab') \ .drop(columns=['id_sitehab']) if not raw: from .zh import ref_hab cb = ref_hab().get_CB(cols=['id','lb_hab_fr','descriptif_cb_fr']) df = merge(df,cb, how='left', left_on='code_hab',right_on='id',suffixes=[None,'_y']) \ .drop(columns=['code_hab','id_y']) \ .rename(columns={'lb_hab_fr':'hab','descriptif_cb_fr':'desc_hab'}) if not df.empty: df.date_geom = df.date_geom.astype(str) if geom: dfgeom = df[['id_site', 'date_geom', 'geom']] print(dfgeom) dfgeom = dfgeom.drop_duplicates() df.drop(columns=['geom'], inplace=True) vals = df.columns[~df.columns.isin(['id',*indexs])].tolist() if pivot: df2 = pivot_table( df.fillna(''), values=vals, index=indexs, columns=['index'], # dropna=False, aggfunc={lambda x: ', '.join(x.astype(str)),}) df2.columns = [ x[0] + str(x[2]) for x in df2.columns ] date = [x for x in df2.index.names if x.startswith('date_hab')] df2.reset_index(['auteur_hab', *date], inplace=True) df = df2 else : df.set_index(indexs, inplace=True) if geom: idx = df.index.names df.reset_index(inplace=True) df = df.merge(dfgeom, how='left', on=['id_site', 'date_geom']) df.set_index(idx, inplace=True) df = _set_geom(df, hex=False) if not idhabitat: idx = df.columns[df.columns.str.startswith('id')] df.drop(columns=idx, inplace=True) return df def get_ps(id_site=None, nom_site=None, columns=None, last_update=False, geom=False, raw=[False,True], idparam=False, idhabitat=False): if isinstance(raw, bool): rawp = rawh = raw elif isinstance(raw, list): rawp = raw[0] rawh = raw[1] df = ps_r_site_param(id_site=id_site, nom_site=nom_site, columns=columns, last_update=last_update, geom=False, raw=rawp, idparam=idparam, pivot=True) df2 = ps_r_site_habitat(id_site=id_site, nom_site=nom_site, columns=columns, last_update=last_update, geom=geom, raw=rawh, idhabitat=idhabitat, pivot=True) df = merge(df, df2, on=df.index.names) return df