pycen/pycen/ps.py
2021-10-11 16:12:19 +02:00

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(columns=['id_y','id_param']) \
.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