11
11
import json
12
12
import logging
13
13
import sys
14
+ from typing import Dict , List , Mapping , Tuple
14
15
15
16
import numpy as np
16
17
import requests
28
29
__status__ = "stable"
29
30
30
31
31
- def copyleft (descr ) :
32
+ def copyleft (descr : str ) -> str :
32
33
"""Print the Copyright message and License"""
33
34
return (
34
35
f"{ descr } v{ __version__ } ({ __status__ } )\n "
35
36
"{__copyright__} <{__email__}>\n License: {__license__}"
36
37
)
37
38
38
39
39
- def argparser (descr , examples ) :
40
+ def argparser (descr : str , examples : List [ str ]) -> argparse . ArgumentParser :
40
41
"""Return a new ArgumentParser object"""
41
42
return argparse .ArgumentParser (
42
43
formatter_class = argparse .RawDescriptionHelpFormatter ,
@@ -49,16 +50,16 @@ def argparser(descr, examples):
49
50
class HadCRUT5 :
50
51
"""Class for parsing and plotting HadCRUT5 datasets"""
51
52
52
- # current dataset version
53
53
_DATASET_VERSION = "5.0.2.0"
54
+ """current dataset version"""
54
55
55
- # list of all the available data types
56
56
_DEFAULT_DATATYPE = "annual"
57
57
_VALID_DATATYPES = [_DEFAULT_DATATYPE , "monthly" ]
58
+ """list of all the available data types"""
58
59
59
- # list of all the valid periods
60
60
_DEFAULT_PERIOD = "1961-1990"
61
61
_VALID_PERIODS = [_DEFAULT_PERIOD , "1850-1900" , "1880-1920" ]
62
+ """list of all the valid periods"""
62
63
63
64
GLOBAL_REGION = "Global"
64
65
NORTHERN_REGION = "Northern Hemisphere"
@@ -114,10 +115,10 @@ def datasets_download(self):
114
115
if self ._enable_southern :
115
116
self ._wget_dataset_file (self ._southern_hemisphere_filename )
116
117
117
- def datasets_load (self ):
118
+ def datasets_load (self ) -> None :
118
119
"""Load all the netCDFv4 datasets"""
119
120
120
- def dataset_load (dataset_filename ) :
121
+ def dataset_load (dataset_filename : str ) -> Dict :
121
122
"""Load the data provided by the netCDFv4 file 'dataset_filename'"""
122
123
dataset = nc_Dataset (dataset_filename )
123
124
return {
@@ -126,7 +127,7 @@ def dataset_load(dataset_filename):
126
127
"variables" : dataset .variables ,
127
128
}
128
129
129
- def dataset_metadata_dump (dataset_name , dataset ):
130
+ def dataset_metadata_dump (dataset_name : str , dataset ) -> None :
130
131
metadata = dataset ["metadata" ]
131
132
self .logging_debug (
132
133
(f'Metadata for "{ dataset_name } " dataset:\n { json .dumps (metadata , indent = 2 )} ' ),
@@ -145,14 +146,14 @@ def dataset_metadata_dump(dataset_name, dataset):
145
146
self ._datasets [region ] = dataset_load (self ._southern_hemisphere_filename )
146
147
dataset_metadata_dump (region , self ._datasets [region ])
147
148
148
- def datasets_normalize (self ):
149
+ def datasets_normalize (self ) -> None :
149
150
"""
150
151
Normalize the temperature means to the required time period.
151
152
Set _datasets_normalized with a tuple containing lower, mean, and upper
152
153
temperatures for every enabled region
153
154
"""
154
155
155
- def normalization_value (temperatures ) :
156
+ def normalization_value (temperatures : List [ float ]) -> float :
156
157
"""
157
158
Return the value to be substracted to temperatures in order to
158
159
obtain a mean-centered dataset for the required period
@@ -176,7 +177,7 @@ def normalization_value(temperatures):
176
177
raise ValueError (f'Unsupported period "{ self ._period } "' )
177
178
178
179
self .logging_debug ("The mean anomaly in {self._period} is about {norm_temp:.8f}°C" )
179
- return norm_temp
180
+ return float ( norm_temp )
180
181
181
182
for region , data in self ._datasets .items ():
182
183
mean = data ["variables" ]["tas_mean" ]
@@ -196,26 +197,26 @@ def normalization_value(temperatures):
196
197
f"normalized dataset ({ region } ): mean \\ \n { np .array (mean ) - norm_temp } "
197
198
)
198
199
199
- def datasets_regions (self ):
200
+ def datasets_regions (self ) -> Mapping [ str , object ] :
200
201
"""Return the dataset regions set by the user at command-line"""
201
202
return self ._datasets .keys ()
202
203
203
- def logging (self , message ) :
204
+ def logging (self , message : str ) -> None :
204
205
"""Print a message"""
205
206
logging .info (message )
206
207
207
- def logging_debug (self , message ) :
208
+ def logging_debug (self , message : str ) -> None :
208
209
"""Print a message when in verbose mode only"""
209
210
if self ._verbose :
210
211
logging .info (message )
211
212
212
- def _hadcrut5_data_url (self , filename ) :
213
+ def _hadcrut5_data_url (self , filename : str ) -> str :
213
214
site = "https://www.metoffice.gov.uk"
214
215
path = f"/hadobs/hadcrut5/data/HadCRUT.{ self ._DATASET_VERSION } /analysis/diagnostics/"
215
216
url = f"{ site } { path } { filename } "
216
217
return url
217
218
218
- def _wget_dataset_file (self , filename ) :
219
+ def _wget_dataset_file (self , filename : str ) -> None :
219
220
"""Download a netCDFv4 HadCRUT5 file if not already found locally"""
220
221
try :
221
222
with open (filename , encoding = "utf-8" ):
@@ -240,31 +241,31 @@ def _wget_dataset_file(self, filename):
240
241
handle .write (block )
241
242
242
243
@property
243
- def dataset_datatype (self ):
244
+ def dataset_datatype (self ) -> str :
244
245
"""Return the datatype string"""
245
246
return self ._datatype
246
247
247
248
@property
248
- def dataset_history (self ):
249
+ def dataset_history (self ) -> str :
249
250
"""Return the datatype history from metadata"""
250
251
# The datasets have all the same length so choose the first one
251
252
region = list (self ._datasets .keys ())[0 ]
252
253
metadata = self ._datasets [region ]["metadata" ]
253
254
return metadata .get ("history" )
254
255
255
- def dataset_normalized_data (self , region ):
256
+ def dataset_normalized_data (self , region ) -> Tuple [ List [ float ], List [ float ], List [ float ]] :
256
257
"""Return the dataset data normalized for the specified region"""
257
258
lower = self ._datasets_normalized [region ]["lower" ]
258
259
mean = self ._datasets_normalized [region ]["mean" ]
259
260
upper = self ._datasets_normalized [region ]["upper" ]
260
261
return (lower , mean , upper )
261
262
262
263
@property
263
- def dataset_period (self ):
264
+ def dataset_period (self ) -> str :
264
265
"""Return the dataset period as a string"""
265
266
return self ._period
266
267
267
- def dataset_years (self ):
268
+ def dataset_years (self ) -> List [ int | float ] :
268
269
"""
269
270
Return an array of years corresponding of the loaded datasets.
270
271
If the original dataset packages monthly data, the returning vector
@@ -279,7 +280,7 @@ def dataset_years(self):
279
280
return years
280
281
281
282
@property
282
- def is_monthly_dataset (self ):
283
+ def is_monthly_dataset (self ) -> bool :
283
284
"""
284
285
Return True if the loaded dataset provide monthly data,
285
286
False otherwise
0 commit comments