221 lines
7.0 KiB
Python
221 lines
7.0 KiB
Python
#!/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
|
|
|