#!/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 v2016 - Fichier Abaque
"""
import os.path
import pandas as pnd
from pyspc.convention.otamin16 import CAL_TDELTA
[docs]
class Table():
"""
Classe permettant la manipulation du csv OTAMIN v2016 (Abaque)
Attributes
----------
filename : str
Nom du fichier csv OTAMIN v2016 (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 v2016
Parameters
----------
filename : str
Nom du fichier prv de OTAMIN v2016
"""
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 Table (csv) de Otamin v2016
"""
text = """
*************************************
***** OTAMIN 2016 - 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.otamin16 import Table
>>> f = 'data/model/otamin16/K0403010_45gGRPd000_QUOIQUE_EM_TAB.csv'
>>> d = Table(filename=f)
>>> print(d)
*************************************
***** OTAMIN 2016 - Table ***********
*************************************
* NOM FICHIER = data/model/otamin16/K0403010_45gGRPd000_QUOIQUE_EM_TAB.csv
* STATION = K0403010
* MODELE = 45gGRPd000
* METHODE = 45gGRPd000
* TYPE ERREUR = EM
* TYPE FICHIER = TAB
*************************************
>>> df = d.read()
>>> df
HorPrevi df_val U05 ... U85 U90 U95
0 0 days 12:00:00 10.141 4.670 ... 13.237 13.680 14.786
1 0 days 12:00:00 11.359 5.142 ... 14.786 15.289 16.466
2 0 days 12:00:00 13.272 5.905 ... 17.229 17.824 19.126
3 0 days 12:00:00 16.353 7.148 ... 21.169 21.912 23.428
4 0 days 12:00:00 23.790 10.213 ... 30.711 31.806 33.881
5 0 days 12:00:00 25.404 10.707 ... 32.704 33.888 35.964
6 0 days 12:00:00 27.260 11.490 ... 35.094 36.365 38.592
7 0 days 12:00:00 29.701 12.519 ... 38.235 39.620 42.047
8 0 days 12:00:00 32.246 13.591 ... 41.512 43.015 45.651
9 0 days 12:00:00 36.502 15.385 ... 46.991 48.693 51.676
10 0 days 12:00:00 41.721 17.585 ... 53.710 55.655 59.064
11 0 days 12:00:00 47.707 20.108 ... 61.416 63.640 67.539
12 0 days 12:00:00 56.642 23.874 ... 72.918 75.559 80.188
13 0 days 12:00:00 70.745 29.818 ... 91.074 94.372 100.153
14 0 days 12:00:00 325.899 137.363 ... 419.546 434.738 461.372
15 1 days 00:00:00 9.746 3.579 ... 13.750 14.759 16.482
16 1 days 00:00:00 11.045 3.934 ... 15.308 16.483 18.504
17 1 days 00:00:00 12.980 4.479 ... 17.665 19.086 21.541
18 1 days 00:00:00 16.452 5.495 ... 21.980 23.830 27.043
19 1 days 00:00:00 24.706 7.978 ... 32.391 35.242 40.220
20 1 days 00:00:00 26.171 8.161 ... 33.660 36.758 42.193
21 1 days 00:00:00 27.890 8.697 ... 35.870 39.171 44.963
22 1 days 00:00:00 30.254 9.434 ... 38.910 42.491 48.774
23 1 days 00:00:00 33.949 10.586 ... 43.663 47.682 54.732
24 1 days 00:00:00 38.268 11.933 ... 49.218 53.748 61.695
25 1 days 00:00:00 44.059 13.739 ... 56.666 61.881 71.032
26 1 days 00:00:00 51.186 15.961 ... 65.832 71.891 82.522
27 1 days 00:00:00 59.604 18.586 ... 76.658 83.714 96.092
28 1 days 00:00:00 73.324 22.864 ... 94.304 102.983 118.211
29 1 days 00:00:00 326.951 101.950 ... 420.502 459.202 527.104
[30 rows x 21 columns]
"""
df = pnd.read_csv(self.filename, sep=';', index_col=False)
df['HorPrevi'] = CAL_TDELTA * df['HorPrevi']
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 OTAMIN v2016 (Abaque)
Parameters
----------
filename : str
Fichier csv OTAMIN v2016 (Abaque)
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.upper().endswith('RDATA'):
raise NotImplementedError('Fichier RData pas implémenté')
basename = basename.replace('.csv', '')
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
csv OTAMIN v2016 (Abaque)
Raises
------
NotImplementedError
"""
raise NotImplementedError