#!/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/>.
#
########################################################################
"""Incertitudes de modélisation - Projet OTAMIN v2018 - Fichier Abaque."""
import os.path
import pandas as pnd
from pyspc.convention.otamin18 import CAL_TDELTA
[docs]
class Table():
"""
Classe permettant la manipulation du csv OTAMIN v2018 (Abaque).
Attributes
----------
filename : str
Nom du fichier csv OTAMIN v2018 (Calage)
station : str
Code du lieu
model : str
Code du modèle selon la convention POM
method : str
Méthode d'estimation
error : str
Type d'erreur
datatype : str
Type de fichier
"""
[docs]
def __init__(self, filename=None):
"""
Initialiser l'instance de la classe Table (csv, Rdata) de Otamin v2018.
Parameters
----------
filename : str
Nom du fichier prv de OTAMIN v2018
"""
self.filename = filename
if self.filename is not None:
meta = self.split_basename(self.filename)
self.station = meta[0]
self.model = meta[1]
self.method = meta[2]
self.error = meta[3]
self.datatype = meta[4]
else:
self.station = None
self.model = None
self.method = None
self.error = None
self.datatype = None
def __str__(self):
"""Afficher des méta-données de l'instance."""
text = """
*************************************
***** OTAMIN 2018 - Table ***********
*************************************
* NOM FICHIER = {filename}
* STATION = {station}
* MODELE = {model}
* METHODE = {model}
* TYPE ERREUR = {error}
* TYPE FICHIER = {datatype}
*************************************
"""
return text.format(**vars(self))
[docs]
def read(self):
"""
Lire un fichier Abaque csv Otamin.
Returns
-------
data : pnd.DataFrame
Dataframe des données
Examples
--------
>>> from pyspc.verification.otamin18 import Table
>>> f = 'data/model/otamin18/A6701210_57gGRPd000_QUOIQUE_EM_INC_TAB.csv'
>>> d = Table(filename=f)
>>> print(d)
*************************************
***** OTAMIN 2018 - Table ***********
*************************************
* NOM FICHIER = data/model/otamin18/A6701210_57gGRPd000_QUOIQUE_EM_INC_TAB.csv
* STATION = A6701210
* MODELE = 57gGRPd000
* METHODE = 57gGRPd000
* TYPE ERREUR = EM
* TYPE FICHIER = TAB
*************************************
>>> df = d.read()
>>> df
HorPrevi df_val U10 ... U70 U80 U90
0 0 days 12:00:00 21.550 15.838 ... 23.821 25.361 27.947
1 0 days 12:00:00 22.662 16.654 ... 25.049 26.669 29.388
2 0 days 12:00:00 23.935 17.590 ... 26.457 28.167 31.040
3 0 days 12:00:00 25.481 18.727 ... 28.166 29.987 33.045
4 0 days 12:00:00 26.924 19.787 ... 29.761 31.685 34.915
5 0 days 12:00:00 28.791 21.159 ... 31.824 33.882 37.337
6 0 days 12:00:00 32.765 24.080 ... 36.217 38.559 42.490
7 0 days 12:00:00 38.384 28.209 ... 42.428 45.172 49.778
8 0 days 12:00:00 45.088 33.136 ... 49.839 53.061 58.471
9 0 days 12:00:00 123.543 90.794 ... 136.560 145.389 160.214
10 1 days 00:00:00 21.187 14.825 ... 23.404 25.384 29.113
11 1 days 00:00:00 22.076 15.446 ... 24.386 26.449 30.334
12 1 days 00:00:00 23.287 16.294 ... 25.724 27.901 31.999
13 1 days 00:00:00 24.542 17.172 ... 27.110 29.404 33.723
14 1 days 00:00:00 26.042 18.222 ... 28.767 31.201 35.784
15 1 days 00:00:00 27.819 19.465 ... 30.731 33.331 38.226
16 1 days 00:00:00 30.995 21.687 ... 34.238 37.135 42.589
17 1 days 00:00:00 36.257 25.369 ... 40.052 43.440 49.821
18 1 days 00:00:00 44.937 31.442 ... 49.640 53.839 61.747
19 1 days 00:00:00 138.550 96.944 ... 153.049 165.997 190.379
[20 rows x 11 columns]
"""
df = pnd.read_csv(self.filename, sep=';', index_col=False)
df['HorPrevi'] = df['HorPrevi'].apply(
lambda x: int(float(x[:-1])) * CAL_TDELTA[x[-1]])
return df
[docs]
def readr(self):
"""
Lire un fichier Abaque RData Otamin.
Returns
-------
data : pnd.DataFrame
Dataframe des données
Examples
--------
>>> from pyspc.verification.otamin18 import Table
>>> f = 'data/model/otamin18/A6701210_57gGRPdBRU_QUOIQUE_EM_INC_TAB.RData'
>>> d = Table(filename=f)
>>> print(d)
*************************************
***** OTAMIN 2018 - Table ***********
*************************************
* NOM FICHIER = data/model/otamin18/A6701210_57gGRPdBRU_QUOIQUE_EM_INC_TAB.RData
* STATION = A6701210
* MODELE = 57gGRPdBRU
* METHODE = 57gGRPdBRU
* TYPE ERREUR = EM
* TYPE FICHIER = TAB
*************************************
>>> df = d.readr()
>>> df
HorPrevi df_val U10 ... U50 ... U90
1 1 0.502 0.773 ... 0.973 ... 1.065
2 1 0.997 1.533 ... 1.930 ... 2.113
3 1 1.069 1.643 ... 2.070 ... 2.266
4 1 1.126 1.922 ... 2.233 ... 2.421
5 1 1.191 2.033 ... 2.362 ... 2.560
.. ... ... ... ... ... ... ...
198 2 27.357 20.029 ... 27.152 ... 37.804
199 2 30.762 22.522 ... 30.531 ... 42.510
200 2 35.969 26.334 ... 35.699 ... 49.704
201 2 43.556 31.889 ... 43.230 ... 60.190
202 2 134.682 98.606 ... 133.671 ... 186.115
[202 rows x 11 columns]
"""
from pyspc.binutils.captured_output import captured_output
with captured_output():
from rpy2.robjects import r
from rpy2.robjects import pandas2ri
r.load(self.filename)
df = pandas2ri.rpy2py_dataframe(r['out.temp'])
return df
[docs]
def write(self, data=None):
"""
Ecrire un fichier Abaque csv Otamin.
Raises
------
NotImplementedError
"""
raise NotImplementedError
[docs]
@staticmethod
def split_basename(filename=None):
"""
Extraire les informations depuis le nom du fichier csv.
Parameters
----------
filename : str
Fichier csv OTAMIN v2018 (Calage)
Returns
-------
station : str
Code du lieu
model : str
Code du modèle selon la convention POM
method : str
Méthode d'estimation
error : str
Type d'erreur
datatype : str
Type de fichier
"""
if filename is None:
return None, None, None, None, None
basename = os.path.basename(filename)
if basename.endswith('csv'):
basename = basename.replace('.csv', '')
else:
basename = basename.replace('.RData', '')
try:
[station, model, method, error, _, datatype] = basename.split('_')
except ValueError as ve:
raise ValueError("Le nom de fichier ne respecte pas le "
"nommage de OTAMIN") from ve
return station, model, method, error, datatype
[docs]
@staticmethod
def join_basename(station=None, model=None, leadtime=None):
"""
Extraire les informations depuis le nom du fichier.
Raises
------
NotImplementedError
"""
raise NotImplementedError