Code source de pyspc.io.grp20.reader

#!/usr/bin/python3
# -*- coding: utf-8 -*-
########################################################################
#
# This file is part of python module <pyspc>.
# Copyright (C) 2013-2021  R. Marty
#   (renaud.marty@developpement-durable.gouv.fr)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program (see COPYING.txt).
# If not, see <http://www.gnu.org/licenses/>.
#
########################################################################
"""
Bibliothèque pyspc du projet pyspc - IO - GRP version 2020 - read
"""
from datetime import timedelta as td
import os.path
import pandas as pnd

from pyspc.convention.grp20 import (
    DATATYPES, CAL_EVENT_HEADERS, RT_FCST_LINEPREFIX, RT_FCST_VARNAMES)
from pyspc.core.convention import EXTERNAL_VARNAMES
import pyspc.core.exception as _exception
from pyspc.core.keyseries import str2tuple, tuple2str
from pyspc.core.parameter import Parameter
from pyspc.core.serie import Serie
from pyspc.core.series import Series
from pyspc.model.grp20 import (
    str2td, GRP_Data, GRP_Event, GRP_Fcst, GRPRT_Archive, GRPRT_Basin,
    GRPRT_Data, GRPRT_Metscen, GRPRT_Fcst, GRPRT_Intern)


[docs] def read_GRP20(datatype=None, dirname='.', filename=None, stations=None, varnames=None, warning=False): """ Créer une instance Series à partir de données GRP20 Parameters ---------- filename : str Fichier GRP datatype : str Type de données GRP warning : bool Afficher les avertissements ? défaut: False Other Parameters ---------------- dirname : str Répertoire des fichiers GRP, si filename n'est pas défini stations : list Identifiants des stations, si filename n'est pas défini varnames : list Noms des variables, si filename n'est pas défini Returns ------- series : pyspc.core.series.Series Collection de séries de données Notes ----- Les colonnes ne contenant que des valeurs manquantes ne sont pas exportées Examples -------- >>> from pyspc.io.grp20 import read_GRP20 CALAGE - Cas de données d'observation >>> d = 'grp20_cal_data' >>> f = 'data/model/grp20/cal/90065003_P_00J01H00M.txt' >>> series = read_GRP20(filename=f, datatype=d) >>> series ************************************* ********** SERIES ******************* ************************************* * NOM DE LA COLLECTION = GRP20 * TYPE DE COLLECTION = obs * NOMBRE DE SERIES = 1 * ---------------------------------- * SERIE #1 * - CODE = 90065003 * - VARNAME = PH * - META = None ************************************* CALAGE - Cas de données d'événements horaires >>> d = 'grp20_cal_fcst' >>> f = 'data/model/grp20/cal/RH10585x-EVhor1.DAT' >>> series = read_GRP20(filename=f, datatype=d) >>> series ************************************* ********** SERIES ******************* ************************************* * NOM DE LA COLLECTION = GRP20 * TYPE DE COLLECTION = obs * NOMBRE DE SERIES = 2 * ---------------------------------- * SERIE #1 * - CODE = RH10585x * - VARNAME = PH * - META = EVhor1 * ---------------------------------- * SERIE #2 * - CODE = RH10585x * - VARNAME = QH * - META = EVhor1 ************************************* CALAGE - Cas de données d'événements journaliers >>> d = 'grp20_cal_fcst' >>> f = 'data/model/grp20/cal/RH10585x-EVjour1.DAT' >>> series = read_GRP20(filename=f, datatype=d) >>> series ************************************* ********** SERIES ******************* ************************************* * NOM DE LA COLLECTION = GRP20 * TYPE DE COLLECTION = obs * NOMBRE DE SERIES = 2 * ---------------------------------- * SERIE #1 * - CODE = RH10585x * - VARNAME = PJ * - META = EVjour1 * ---------------------------------- * SERIE #2 * - CODE = RH10585x * - VARNAME = QJ * - META = EVjour1 ************************************* CALAGE - Cas de données de prévision >>> d = 'grp20_cal_fcst' >>> f = 'data/model/grp20/cal/H_RH10585x_GRP_SMN_TAN_HOR_00J03H00M_PDT_00J01H00M_PP_P0P0.TXT' >>> series = read_GRP20(filename=f, datatype=d) >>> series ************************************* ********** SERIES ******************* ************************************* * NOM DE LA COLLECTION = GRP20 * TYPE DE COLLECTION = obs * NOMBRE DE SERIES = 19 * ---------------------------------- * SERIE #1 * - CODE = RH10585x * - VARNAME = QH * - META = OBS00J00H00M * ---------------------------------- * SERIE #2 * - CODE = RH10585x * - VARNAME = QH * - META = OBS00J01H00M * ---------------------------------- * SERIE #3 * - CODE = RH10585x * - VARNAME = QH * - META = PRV00J01H00M * ---------------------------------- * SERIE #4 * - CODE = RH10585x * - VARNAME = QH * - META = OBS00J03H00M * ---------------------------------- * SERIE #5 * - CODE = RH10585x * - VARNAME = QH * - META = PRV00J03H00M * ---------------------------------- * SERIE #6 * - CODE = RH10585x * - VARNAME = QH * - META = OBS00J06H00M * ---------------------------------- * SERIE #7 * - CODE = RH10585x * - VARNAME = QH * - META = PRV00J06H00M * ---------------------------------- * SERIE #8 * - CODE = RH10585x * - VARNAME = QH * - META = OBS00J12H00M * ---------------------------------- * SERIE #9 * - CODE = RH10585x * - VARNAME = QH * - META = PRV00J12H00M * ---------------------------------- * SERIE #10 * - CODE = RH10585x * - VARNAME = QH * - META = OBS01J00H00M * ---------------------------------- * SERIE #11 * - CODE = RH10585x * - VARNAME = QH * - META = PRV01J00H00M * ---------------------------------- * SERIE #12 * - CODE = RH10585x * - VARNAME = QH * - META = OBS01J12H00M * ---------------------------------- * SERIE #13 * - CODE = RH10585x * - VARNAME = QH * - META = PRV01J12H00M * ---------------------------------- * SERIE #14 * - CODE = RH10585x * - VARNAME = QH * - META = OBS02J00H00M * ---------------------------------- * SERIE #15 * - CODE = RH10585x * - VARNAME = QH * - META = PRV02J00H00M * ---------------------------------- * SERIE #16 * - CODE = RH10585x * - VARNAME = QH * - META = OBS03J00H00M * ---------------------------------- * SERIE #17 * - CODE = RH10585x * - VARNAME = QH * - META = PRV03J00H00M * ---------------------------------- * SERIE #18 * - CODE = RH10585x * - VARNAME = QH * - META = OBS05J00H00M * ---------------------------------- * SERIE #19 * - CODE = RH10585x * - VARNAME = QH * - META = PRV05J00H00M ************************************* TEMPS-REEL - Cas de données d'observation (Q) >>> d = 'grp20_rt_data' >>> f = 'data/model/grp20/rt/Debit.txt' >>> series = read_GRP20(filename=f, datatype=d) >>> series ************************************* ********** SERIES ******************* ************************************* * NOM DE LA COLLECTION = GRP20 * TYPE DE COLLECTION = obs * NOMBRE DE SERIES = 1 * ---------------------------------- * SERIE #1 * - CODE = RH10585x * - VARNAME = QI * - META = None ************************************* TEMPS-REEL - Cas de données d'observation (P) >>> d = 'grp20_rt_data' >>> f = 'data/model/grp20/rt/Pluie_00J01H00M.txt' >>> series = read_GRP20(filename=f, datatype=d) >>> series ************************************* ********** SERIES ******************* ************************************* * NOM DE LA COLLECTION = GRP20 * TYPE DE COLLECTION = obs * NOMBRE DE SERIES = 2 * ---------------------------------- * SERIE #1 * - CODE = 90052002 * - VARNAME = PH * - META = None * ---------------------------------- * SERIE #2 * - CODE = 90065003 * - VARNAME = PH * - META = None ************************************* TEMPS-REEL - Cas de scénarios météorologiques >>> d = 'grp20_rt_metscen' >>> f = 'data/model/grp20/rt/Scen_006_PluMA.txt' >>> series = read_GRP20(filename=f, datatype=d) >>> series ************************************* ********** SERIES ******************* ************************************* * NOM DE LA COLLECTION = GRP20 * TYPE DE COLLECTION = fcst * NOMBRE DE SERIES = 1 * ---------------------------------- * SERIE #1 * - CODE = RH10585x * - VARNAME = PH * - META = 2021-05-31 01:00:00, grp20, 001, None ************************************* TEMPS-REEL - Cas d'export d'observation >>> d = 'grp20_rt_obs_diff' >>> f = 'data/model/grp20/rt/GRP_D_Obs.txt' >>> series = read_GRP20(filename=f, datatype=d) >>> series ************************************* ********** SERIES ******************* ************************************* * NOM DE LA COLLECTION = GRP20 * TYPE DE COLLECTION = obs * NOMBRE DE SERIES = 5 * ---------------------------------- * SERIE #1 * - CODE = RH10585x * - VARNAME = QH * - META = grp20 * ---------------------------------- * SERIE #2 * - CODE = RH10585x * - VARNAME = PH * - META = grp20 * ---------------------------------- * SERIE #3 * - CODE = RH10585x * - VARNAME = QJ * - META = grp20 * ---------------------------------- * SERIE #4 * - CODE = RH10585x * - VARNAME = PJ * - META = grp20 * ---------------------------------- * SERIE #5 * - CODE = RH10585x * - VARNAME = TJ * - META = grp20 ************************************* TEMPS-REEL - Cas de prévision sans assimilation >>> d = 'grp20_rt_sim_diff' >>> f = 'data/model/grp20/rt/GRP_D_Simu_2001.txt' >>> series = read_GRP20(filename=f, datatype=d) >>> series ************************************* ********** SERIES ******************* ************************************* * NOM DE LA COLLECTION = GRP20 * TYPE DE COLLECTION = fcst * NOMBRE DE SERIES = 5 * ---------------------------------- * SERIE #1 * - CODE = RH10585x * - VARNAME = QH * - META = 2007-01-19 00:00:00, grp20-sim, 2001, None * ---------------------------------- * SERIE #2 * - CODE = RH10585x * - VARNAME = PH * - META = 2007-01-19 00:00:00, grp20-sim, 2001, None * ---------------------------------- * SERIE #3 * - CODE = RH10585x * - VARNAME = QJ * - META = 2007-01-19 00:00:00, grp20-sim, 2001, None * ---------------------------------- * SERIE #4 * - CODE = RH10585x * - VARNAME = PJ * - META = 2007-01-19 00:00:00, grp20-sim, 2001, None * ---------------------------------- * SERIE #5 * - CODE = RH10585x * - VARNAME = TJ * - META = 2007-01-19 00:00:00, grp20-sim, 2001, None ************************************* TEMPS-REEL - Cas de prévision avec assimilation >>> d = 'grp20_rt_fcst_diff' >>> f = 'data/model/grp20/rt/GRP_D_Prev_2001.txt' >>> series = read_GRP20(filename=f, datatype=d) >>> series ************************************* ********** SERIES ******************* ************************************* * NOM DE LA COLLECTION = GRP20 * TYPE DE COLLECTION = fcst * NOMBRE DE SERIES = 5 * ---------------------------------- * SERIE #1 * - CODE = RH10585x * - VARNAME = QH * - META = 2007-01-19 00:00:00, grp20, 2001, None * ---------------------------------- * SERIE #2 * - CODE = RH10585x * - VARNAME = PH * - META = 2007-01-19 00:00:00, grp20, 2001, None * ---------------------------------- * SERIE #3 * - CODE = RH10585x * - VARNAME = QJ * - META = 2007-01-19 00:00:00, grp20, 2001, None * ---------------------------------- * SERIE #4 * - CODE = RH10585x * - VARNAME = PJ * - META = 2007-01-19 00:00:00, grp20, 2001, None * ---------------------------------- * SERIE #5 * - CODE = RH10585x * - VARNAME = TJ * - META = 2007-01-19 00:00:00, grp20, 2001, None ************************************* TEMPS-REEL - Cas de données d'archive >>> d = 'grp20_rt_archive' >>> f = 'data/model/grp20/rt/PV_10A.DAT' >>> series = read_GRP20(filename=f, datatype=d) >>> series ************************************* ********** SERIES ******************* ************************************* * NOM DE LA COLLECTION = GRP20 * TYPE DE COLLECTION = obs * NOMBRE DE SERIES = 1 * ---------------------------------- * SERIE #1 * - CODE = 90065003 * - VARNAME = PH * - META = None ************************************* TEMPS-REEL - Cas de données internes au modèle >>> d = 'grp20_rt_intern_diff' >>> f = 'data/model/grp20/rt/intern/PQE_1A_D.DAT' >>> series = read_GRP20(filename=f, datatype=d) >>> series ************************************* ********** SERIES ******************* ************************************* * NOM DE LA COLLECTION = GRP20 * TYPE DE COLLECTION = obs * NOMBRE DE SERIES = 4 * ---------------------------------- * SERIE #1 * - CODE = RH10585x * - VARNAME = QH * - META = grp20 * ---------------------------------- * SERIE #2 * - CODE = RH10585x * - VARNAME = QH * - META = None * ---------------------------------- * SERIE #3 * - CODE = RH10585x * - VARNAME = PH * - META = None * ---------------------------------- * SERIE #4 * - CODE = RH10585x * - VARNAME = EH * - META = None ************************************* """ # ------------------------------------------------------------------------- # 0- Contrôles # ------------------------------------------------------------------------- _exception.raise_valueerror( datatype not in DATATYPES, f"Type de données GRP20 '{datatype}' incorrect") # ------------------------------------------------------------------------- # 1.1- CALAGE - Cas de données d'observation # ------------------------------------------------------------------------- if datatype == "grp20_cal_data": return _grp20_cal_data( dirname=dirname, filename=filename, stations=stations, varnames=varnames, warning=warning) # ------------------------------------------------------------------------- # 1.2- CALAGE - Cas de données d'événement # ------------------------------------------------------------------------- if datatype == "grp20_cal_event": return _grp20_cal_event(filename=filename, warning=warning) # ------------------------------------------------------------------------- # 1.3- CALAGE - Cas de données de prévision # ------------------------------------------------------------------------- if datatype == "grp20_cal_fcst": return _grp20_cal_fcst(filename=filename, warning=warning) # ------------------------------------------------------------------------- # 2.1- TEMPS-REEL - Cas de données d'archive # ------------------------------------------------------------------------- if datatype.startswith('grp20_rt_archive'): return _grp20_rt_archive(filename=filename, warning=warning) # ------------------------------------------------------------------------- # 2.2- TEMPS-REEL - Cas de données d'observation # TEMPS-REEL - Cas de scénarios météorologiques # ------------------------------------------------------------------------- if datatype.startswith('grp20_rt_data'): return _grp20_rt_data(filename=filename, warning=warning) if datatype.startswith('grp20_rt_metscen'): return _grp20_rt_metscen(filename=filename, warning=warning) # ------------------------------------------------------------------------- # 2.3- TEMPS-REEL - Cas d'export d'observation # TEMPS-REEL - Cas de prévision sans assimilation # TEMPS-REEL - Cas de prévision avec assimilation # ------------------------------------------------------------------------- if (datatype.startswith('grp20_rt_obs') or datatype.startswith('grp20_rt_sim') or datatype.startswith('grp20_rt_fcst')): return _grp20_rt_fcst( filename=filename, datatype=datatype.replace('grp20_rt_', ''), warning=warning) # ------------------------------------------------------------------------- # 2.4- TEMPS-REEL - Cas de données internes au modèle # ------------------------------------------------------------------------- if datatype.startswith('grp20_rt_intern'): return _grp20_rt_intern(filename=filename, warning=warning) # return _grp20_rt_intern( # filename=filename, datatype=datatype.replace('grp20_rt_', ''), # warning=warning) # ------------------------------------------------------------------------- # 3- Cas inconnu # ------------------------------------------------------------------------- raise NotImplementedError
def _grp20_cal_data(dirname='.', filename=None, stations=None, varnames=None, warning=False): """ CALAGE - Cas de données d'observation """ # ------------------------------------------------------------------------- # 0- Initialisation # ------------------------------------------------------------------------- if stations is None or varnames is None: _exception.check_str(filename) filenames = [filename] else: _exception.check_str(dirname) if isinstance(stations, str): stations = [stations] if isinstance(varnames, str): varnames = [varnames] external = {v: k[1] for k, v in EXTERNAL_VARNAMES.items() if k[0] == 'GRP20'} varnames = [external[v] for v in varnames if v in external] filenames = [os.path.join( dirname, GRP_Data.join_basename( station=s, varname=v[0], timestep=v[1])) for s in stations for v in varnames] series = Series(datatype='obs', name='GRP20') # ------------------------------------------------------------------------- # 1- Lecture # ------------------------------------------------------------------------- for f in filenames: if not os.path.exists(f): if warning: _exception.Warning( __file__, f"Fichier inconnu '{f}'") continue reader = GRP_Data(filename=f) ts = str2td(reader.timestep) df = reader.read() # ------------------------------------------------------------------------- # 2- Collection de séries # ------------------------------------------------------------------------- serie = Serie( datval=df, code=reader.station, varname=(reader.varname, ts), provider='GRP20', warning=warning) series.add(serie) return series def _grp20_cal_event(filename=None, warning=False): """ CALAGE - Cas de données d'événements """ # ------------------------------------------------------------------------- # 0- Initialisation # ------------------------------------------------------------------------- series = Series(datatype='obs', name='GRP20') # ------------------------------------------------------------------------- # 1- Lecture # ------------------------------------------------------------------------- reader = GRP_Event(filename=filename) df = reader.read() df = df.set_index('Date', drop=True) # ------------------------------------------------------------------------- # 2- Collection de séries # ------------------------------------------------------------------------- assoc = {v: k for k, v in CAL_EVENT_HEADERS.items()} for c in df.columns: try: v = assoc[c] except KeyError: continue ts = Parameter.infer_timestep(index=df.index, prefix=v) serie = Serie( datval=df[c].to_frame(), code=reader.station, varname=(v, ts), provider='GRP20', warning=warning) series.add(serie, meta=reader.event) return series def _grp20_cal_fcst(filename=None, warning=False): """ CALAGE - Cas de données de prévision """ # ------------------------------------------------------------------------- # 0- Initialisation # ------------------------------------------------------------------------- series = Series(datatype='obs', name='GRP20') # ------------------------------------------------------------------------- # 1- Lecture # ------------------------------------------------------------------------- reader = GRP_Fcst(filename=filename) df = reader.read() ts = str2td(reader.timestep) # ------------------------------------------------------------------------- # 2- Collection de séries # ------------------------------------------------------------------------- for c in df.columns: dv = df[c].to_frame() try: dts = str2td(c[3:]) except ValueError: dts = td(0) dv.index = dv.index + dts serie = Serie( datval=dv, code=reader.station, varname=('Q', ts), provider='GRP20', warning=warning) series.add(serie, meta=c.strip()) return series def _grp20_rt_archive(filename=None, warning=False): """ TEMPS-REEL - Cas de données d'archive """ # ------------------------------------------------------------------------- # 0- Initialisation # ------------------------------------------------------------------------- series = Series(datatype='obs', name='GRP20') # ------------------------------------------------------------------------- # 1- Lecture # ------------------------------------------------------------------------- reader = GRPRT_Archive(filename=filename) df = reader.read() ts = str2td(reader.timestep) # ------------------------------------------------------------------------- # 2- Collection de séries # ------------------------------------------------------------------------- for c in df.columns: serie = Serie( datval=df[c].to_frame(), code=c.strip(), varname=(reader.varname[0], ts), provider='GRP20', warning=warning) series.add(serie) # , meta='archive' return series def _grp20_rt_data(filename=None, warning=None): """ TEMPS-REEL - Cas de données d'observation """ # ------------------------------------------------------------------------- # 0- Initialisation # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- # 1- Lecture # ------------------------------------------------------------------------- reader = GRPRT_Data(filename=filename) df = reader.read() # Nettoyer la colonne superflue df = df.dropna(how="all", axis=1) # Nettoyer les lignes != prefix df.drop(df[df.PREFIX != reader.lineprefix].index, inplace=True) # Supprimer la colonne PREFIX df.drop(columns=['PREFIX'], inplace=True) # Créer l'index Datetime à partir des colonnes DATE et HOUR df.index = pnd.to_datetime(df['DATE'].astype(str) + ' ' + df['HOUR'], format='%Y%m%d %H:00') # Supprimer les colonne 'DATE', 'HOUR' df.drop(columns=['DATE', 'HOUR'], inplace=True) # Colonne 'CODE' -> Multi-Index (None, CODE) avec None: ['VALUE', 'CODE'] df = df.pivot(columns='CODE') # Retirer VALUE en trop dans columns df.columns = df.columns.droplevel(0) ts = str2td(reader.timestep) # ------------------------------------------------------------------------- # 2.1- Collection de séries OBS # ------------------------------------------------------------------------- series = Series(datatype='obs', name='GRP20') for c in df.columns: serie = Serie( datval=df[c].to_frame(), code=str(c), varname=(reader.varname, ts), provider='GRP20', warning=warning) series.add(serie) return series def _grp20_rt_metscen(filename=None, warning=None): """ TEMPS-REEL - Cas de scénarios météorologiques """ # ------------------------------------------------------------------------- # 0- Initialisation # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- # 1- Lecture # ------------------------------------------------------------------------- reader = GRPRT_Metscen(filename=filename) df = reader.read() # Nettoyer les lignes != prefix df.drop(df[df.PREFIX != reader.lineprefix].index, inplace=True) # Supprimer la colonne PREFIX df.drop(columns=['PREFIX'], inplace=True) # Créer l'index Datetime à partir des colonnes DATE et HOUR df.index = pnd.to_datetime(df['DATETIME'].astype(str), format='%Y%m%d%H%M') # Supprimer les colonne 'DATE', 'HOUR' df.drop(columns=['DATETIME'], inplace=True) # Colonne 'CODE' -> Multi-Index (None, CODE) avec None: ['VALUE', 'CODE'] df = df.pivot(columns='CODE') # Retirer VALUE en trop dans columns df.columns = df.columns.droplevel(0) ts = str2td(reader.timestep) # ------------------------------------------------------------------------- # 2.2- Collection de séries SIM/PRV # ------------------------------------------------------------------------- series = Series(datatype='fcst', name='GRP20') for c in df.columns: runtime = df[c].first_valid_index().to_pydatetime() param = Parameter(varname=(reader.varname, ts), provider='GRP20') key = (c, param.spc_varname, (runtime, 'grp20', reader.scen, None)) keystr = str2tuple(tuple2str(key), forceobs=True)[0] serie = Serie( datval=df[c].to_frame(), code=keystr, varname=param.spc_varname, provider='GRP20', warning=warning) series.add(serie, code=c, meta=key[2]) return series def _grp20_rt_fcst(filename=None, datatype=None, warning=None): """ TEMPS-REEL - Cas d'export d'observation TEMPS-REEL - Cas de prévision sans assimilation TEMPS-REEL - Cas de prévision avec assimilation """ # ------------------------------------------------------------------------- # 0- Initialisation # ------------------------------------------------------------------------- # Préfixe de la ligne lineprefix = RT_FCST_LINEPREFIX[datatype.split('_')[0]] # ------------------------------------------------------------------------- # 1- Lecture # ------------------------------------------------------------------------- # Lecture du contenu reader = GRPRT_Fcst(filename=filename, datatype=datatype) df = reader.read() # Nettoyer les labels des colonnes df.columns = [c.strip() for c in df.columns] # Nettoyer les lignes != lineprefix df = df.drop(df[df.TYP != lineprefix].index) df = df.dropna(axis=1, how='all') # Supprimer la colonne TYP df.drop(columns=['TYP'], inplace=True) # Nettoyer les CODE df['CODE'] = df['CODE'].map(lambda x: x.strip()) df['PDT'] = df['PDT'].map(lambda x: x.strip()) # Colonne 'DATE' -> Index df = df.set_index(keys='DATE(TU)', drop=True) # Colonne 'Code' -> Multi-Index (None, Code) avec None: ['Debit (l/s)'] df['CODE_PDT'] = df['CODE'] + '_' + df['PDT'] # Supprimer les colonne 'DATE', 'HOUR' df.drop(columns=['CODE', 'PDT'], inplace=True) # ------------------------------------------------------------------------- # 2.2- Collection de séries SIM/PRV # ------------------------------------------------------------------------- if datatype.startswith('obs'): series = Series(datatype='obs', name='GRP20') else: series = Series(datatype='fcst', name='GRP20') model = f'grp20-{lineprefix.lower()}'.replace('-prv', '') for _, x in df.groupby(df['CODE_PDT']): # Nettoyer les lignes != lineprefix x = x.dropna(axis=1, how='all') x = x.pivot(columns='CODE_PDT') # MultiIndex : (CODE, VAR) x.columns = x.columns.swaplevel() x.columns = [(c[0], RT_FCST_VARNAMES[c[1].split('(')[0]]) for c in x.columns] for c in x.columns: [code, ts] = c[0].split('_') ts = str2td(ts) varname = EXTERNAL_VARNAMES[('GRP20', (c[1], ts))] if series.datatype == 'obs': serie = Serie( datval=x[c].to_frame(), code=code, varname=varname, provider='GRP20', warning=warning) series.add(serie, meta='grp20') else: runtime = x.index[0] - ts runtime = runtime.to_pydatetime() key = (code, varname, (runtime, model, reader.scen, None)) keystr = str2tuple(tuple2str(key), forceobs=True)[0] serie = Serie( datval=x[c].to_frame(), code=keystr, varname=varname, provider='GRP20', warning=warning) series.add(serie, code=code, meta=key[2]) return series def _grp20_rt_intern(filename=None, warning=False): """ TEMPS-REEL - Cas de données internes au modèle """ # ------------------------------------------------------------------------- # 0- Initialisation # ------------------------------------------------------------------------- series = Series(datatype='obs', name='GRP20') varnames = {'Qsim(mm)': 'Q', 'Qobs(mm)': 'Q', 'P(mm)': 'P', 'T(C)': 'T', 'ETP(mm)': 'E'} # ------------------------------------------------------------------------- # 1- Lecture # ------------------------------------------------------------------------- reader = GRPRT_Intern(filename=filename) # reader.check_datatype(datatype) df = reader.read() df = df.reindex(varnames.keys(), axis=1).dropna(how='all', axis=1) basin = GRPRT_Basin( filename=os.path.join(os.path.dirname(filename), 'BASSIN.DAT')) basin.read() code = basin['Q'] area = float(basin['S']) # ------------------------------------------------------------------------- # 2- Collection de séries # ------------------------------------------------------------------------- for c in df.columns: v = varnames[c] target = Parameter.infer_timestep(index=df.index, prefix=v) param = Parameter.find(prefix=v, timedelta=target) if v.startswith('Q'): df[c] = df[c] * area / param.timestep.total_seconds() * 1000 if 'sim' in c: meta = 'grp20' else: meta = None serie = Serie( datval=df[c].to_frame(), code=code, varname=param.spc_varname, provider='GRP20', warning=warning) series.add(serie, meta=meta) return series