Skip to content

Commit

Permalink
Merge pull request #45 from MET-OM/fix-override-syntax
Browse files Browse the repository at this point in the history
Fix override syntax + test + dependencies
  • Loading branch information
KonstantinChri authored Oct 30, 2024
2 parents 03ae5f6 + dd537e0 commit e03f84d
Show file tree
Hide file tree
Showing 7 changed files with 24 additions and 49 deletions.
1 change: 1 addition & 0 deletions environment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,4 @@ dependencies:
- pytest-cov
- cdsapi
- cartopy
- setuptools
4 changes: 1 addition & 3 deletions metocean_api/ts/internal/ec/ec_products.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from __future__ import annotations
from typing import TYPE_CHECKING, override, Tuple, List
from typing import TYPE_CHECKING, Tuple, List
import os
import subprocess
import pandas as pd
Expand All @@ -24,7 +24,6 @@ def find_product(name: str) -> Product:

class ERA5(Product):

@override
def import_data(self, ts: TimeSeries, save_csv=True, save_nc=False, use_cache=False):
"""
Extract times series of the nearest gird point (lon,lat) from
Expand Down Expand Up @@ -152,7 +151,6 @@ def download_temporary_files(self, ts: TimeSeries, use_cache: bool = False) -> T

class GTSM(Product):

@override
def import_data(self, ts: TimeSeries, save_csv=True, save_nc=False, use_cache=False):
"""
Extract times series of the nearest grid point (lon, lat) from
Expand Down
4 changes: 1 addition & 3 deletions metocean_api/ts/internal/metno/met_product.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from __future__ import annotations
from typing import TYPE_CHECKING, override, Tuple, List
from typing import TYPE_CHECKING, Tuple, List
import os
from abc import abstractmethod
from tqdm import tqdm
Expand Down Expand Up @@ -35,12 +35,10 @@ def _get_near_coord(self, url: str, lon: float, lat: float):
def get_dates(self, start_date, end_date):
raise NotImplementedError(f"Not implemented for {self.name}")

@override
def import_data(self, ts: TimeSeries, save_csv=True, save_nc=False, use_cache=False):
tempfiles, lon_near, lat_near = self.download_temporary_files(ts, use_cache)
return self._combine_temporary_files(ts, save_csv, save_nc, use_cache, tempfiles, lon_near, lat_near, height=ts.height, depth=ts.depth)

@override
def download_temporary_files(self, ts: TimeSeries, use_cache: bool = False) -> Tuple[List[str], float, float]:
if ts.variable == [] or ts.variable is None:
ts.variable = self.get_default_variables()
Expand Down
44 changes: 6 additions & 38 deletions metocean_api/ts/internal/metno/met_products.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from __future__ import annotations
from typing import TYPE_CHECKING, override, Tuple,List
from typing import TYPE_CHECKING, Tuple,List
import os
from datetime import datetime
import xarray as xr
Expand Down Expand Up @@ -52,7 +52,6 @@ def find_product(name: str) -> Product:

class Nora3Wave(MetProduct):

@override
def get_default_variables(self):
return [
"hs",
Expand All @@ -71,7 +70,6 @@ def get_default_variables(self):
"thq_swell",
]

@override
def get_dates(self, start_date, end_date):
return pd.date_range(start=start_date, end=end_date, freq="D")

Expand Down Expand Up @@ -99,7 +97,6 @@ def _drop_variables(self):

class Nora3WaveSub(Nora3Wave):

@override
def get_dates(self, start_date, end_date):
return pd.date_range(
start=datetime.strptime(start_date, "%Y-%m-%d").strftime("%Y-%m"),
Expand All @@ -113,31 +110,26 @@ def _get_url_info(self, date: str):

class NORA3WindSub(MetProduct):

@override
def get_default_variables(self):
return ["wind_speed", "wind_direction"]

@override
def get_dates(self, start_date, end_date):
return pd.date_range(
start=datetime.strptime(start_date, "%Y-%m-%d").strftime("%Y-%m"),
end=datetime.strptime(end_date, "%Y-%m-%d").strftime("%Y-%m"),
freq="MS",
)

@override
def _get_url_info(self, date: str):
return "https://thredds.met.no/thredds/dodsC/nora3_subset_atmos/wind_hourly/arome3kmwind_1hr_" + date.strftime("%Y%m") + ".nc"

@override
def _get_near_coord(self, url: str, lon: float, lat: float):
with xr.open_dataset(url) as ds:
x, y = aux_funcs.find_nearest_cart_coord(ds.longitude, ds.latitude, lon, lat)
lon_near = ds.longitude.sel(y=y, x=x).values[0][0]
lat_near = ds.latitude.sel(y=y, x=x).values[0][0]
return {"x": x.values[0], "y": y.values[0]}, lon_near, lat_near

@override
def _alter_temporary_dataset_if_needed(self, dataset: xr.Dataset):
for var_name in dataset.variables:
# The encoding of the fill value is not always correct in the netcdf files on the server
Expand All @@ -146,7 +138,6 @@ def _alter_temporary_dataset_if_needed(self, dataset: xr.Dataset):
var.encoding["_FillValue"] = var.attrs["fill_value"]
return dataset

@override
def _flatten_data_structure(self, ds: xr.Dataset, **flatten_dims):
variables_to_flatten = ["wind_speed", "wind_direction"]
height = self._get_values_for_dimension(ds, flatten_dims, "height")
Expand All @@ -161,23 +152,18 @@ def _flatten_data_structure(self, ds: xr.Dataset, **flatten_dims):

class NORA3WindWaveCombined(MetProduct):

@override
def get_default_variables(self):
raise NotImplementedError("This method should not be called")

@override
def _get_url_info(self, date: str):
raise NotImplementedError("This method should not be called")

@override
def _get_near_coord(self, url: str, lon: float, lat: float):
raise NotImplementedError("This method should not be called")

@override
def get_dates(self, start_date, end_date):
raise NotImplementedError("This method should not be called")

@override

def import_data(self, ts: TimeSeries, save_csv=True, save_nc=False, use_cache=False):
product = ts.product

Expand Down Expand Up @@ -240,8 +226,7 @@ def import_data(self, ts: TimeSeries, save_csv=True, save_nc=False, use_cache=Fa
self._clean_cache(tempfiles)

return df

@override

def download_temporary_files(self, ts: TimeSeries, use_cache: bool = False) -> Tuple[List[str], float, float]:
raise NotImplementedError(f"Not implemented for product {self.name}")

Expand All @@ -266,19 +251,16 @@ def get_default_variables(self):
"pdir1",
]

@override
def get_dates(self, start_date, end_date):
return pd.date_range(
start=datetime.strptime(start_date, "%Y-%m-%d").strftime("%Y-%m"),
end=datetime.strptime(end_date, "%Y-%m-%d").strftime("%Y-%m"),
freq="MS",
)

@override
def _get_url_info(self, date: str):
return "https://thredds.met.no/thredds/dodsC/norac_wave/field/ww3." + date.strftime("%Y%m") + ".nc"

@override
def _get_near_coord(self, url: str, lon: float, lat: float):
with xr.open_dataset(url) as ds:
node_id = aux_funcs.distance_2points(ds.latitude.values, ds.longitude.values, lat, lon).argmin()
Expand All @@ -289,7 +271,6 @@ def _get_near_coord(self, url: str, lon: float, lat: float):

class NORA3AtmSub(MetProduct):

@override
def get_default_variables(self):
return [
"air_pressure_at_sea_level",
Expand All @@ -301,7 +282,6 @@ def get_default_variables(self):
"fog",
]

@override
def get_dates(self, start_date, end_date):
return pd.date_range(
start=datetime.strptime(start_date, "%Y-%m-%d").strftime("%Y-%m"),
Expand All @@ -325,7 +305,6 @@ def _drop_variables(self):

class NORA3Atm3hrSub(MetProduct):

@override
def get_default_variables(self):
return [
"wind_speed",
Expand All @@ -336,7 +315,6 @@ def get_default_variables(self):
"tke",
]

@override
def get_dates(self, start_date, end_date):
return pd.date_range(
start=datetime.strptime(start_date, "%Y-%m-%d").strftime("%Y-%m"),
Expand Down Expand Up @@ -368,11 +346,9 @@ def _flatten_data_structure(self, ds: xr.Dataset, **flatten_dims):

class NORA3StormSurge(MetProduct):

@override
def get_default_variables(self):
return ["zeta"]

@override
def get_dates(self, start_date, end_date):
return pd.date_range(start=start_date, end=end_date, freq="YS")

Expand All @@ -390,7 +366,6 @@ def _alter_temporary_dataset_if_needed(self, dataset: xr.Dataset):
dataset = dataset.rename_dims({"ocean_time": "time"})
return dataset.rename_vars({"ocean_time": "time"})

@override
def import_data(self, ts: TimeSeries, save_csv=False, save_nc=False, use_cache=False):
"""
Extract times series of the nearest gird point (lon,lat) from
Expand Down Expand Up @@ -433,11 +408,9 @@ def _drop_variables(self):

class Norkyst800(MetProduct):

@override
def get_default_variables(self):
return ["salinity", "temperature", "u", "v", "zeta"]

@override
def get_dates(self, start_date, end_date):
return pd.date_range(start=start_date, end=end_date, freq="D")

Expand Down Expand Up @@ -489,6 +462,9 @@ def import_data(self, ts: TimeSeries, save_csv=True, save_nc=False, use_cache=Fa
dataset = dataset[ts.variable]
dataset = dataset.sel(selection).squeeze(drop=True)
dataset.to_netcdf(tempfiles[i])

ts.lat_data = lat_near
ts.lon_data = lon_near

return self._combine_temporary_files(ts, save_csv, save_nc, use_cache, tempfiles, lon_near, lat_near, height=ts.height)

Expand Down Expand Up @@ -570,7 +546,6 @@ def _get_near_coord(self, url: str, lon: float, lat: float):
lat_near = ds.lat.sel(y=y, x=x).values[0][0]
return {"x": x.values[0], "y": y.values[0]}, lon_near, lat_near

@override
def _flatten_data_structure(self, ds: xr.Dataset, **flatten_dims):
depth = self._get_values_for_dimension(ds, flatten_dims, "depth")
variables_to_flatten = ["u", "v", "temp", "salt", "AKs"]
Expand Down Expand Up @@ -598,11 +573,9 @@ def _flatten_data_structure(self, ds: xr.Dataset, **flatten_dims):

class NORA3WaveSpectrum(MetProduct):

@override
def get_default_variables(self):
return ["SPEC"]

@override
def get_dates(self, start_date, end_date):
return pd.date_range(start=start_date, end=end_date, freq="D")

Expand All @@ -626,7 +599,6 @@ def _get_near_coord(self, url: str, lon: float, lat: float):
station += 1 # station labels are 1-indexed
return {"x": station}, lon_near, lat_near

@override
def import_data(self, ts: TimeSeries, save_csv=True, save_nc=False, use_cache=False):
"""
Extract NORA3 wave spectra timeseries.
Expand Down Expand Up @@ -669,11 +641,9 @@ def import_data(self, ts: TimeSeries, save_csv=True, save_nc=False, use_cache=Fa

class NORACWaveSpectrum(MetProduct):

@override
def get_default_variables(self):
return ["efth"]

@override
def get_dates(self, start_date, end_date):
return pd.date_range(
start=datetime.strptime(start_date, "%Y-%m-%d").strftime("%Y-%m"),
Expand Down Expand Up @@ -733,11 +703,9 @@ def import_data(self, ts: TimeSeries, save_csv=True, save_nc=False, use_cache=Fa

class E39Observations(MetProduct):

@override
def get_default_variables(self):
return ["Hm0"]

@override
def get_dates(self, start_date, end_date):
return pd.date_range(start=start_date, end=end_date, freq="MS")

Expand Down
4 changes: 1 addition & 3 deletions metocean_api/ts/internal/tudelft/tudelft_products.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from __future__ import annotations
import os
from typing import TYPE_CHECKING,override
from typing import TYPE_CHECKING
from datetime import datetime
import pandas as pd
import xarray as xr
Expand All @@ -20,7 +20,6 @@ def find_product(name: str) -> Product:

class EchoWave(Product):

@override
def import_data(self, ts: TimeSeries, save_csv=True, save_nc=False, use_cache=False):
"""
Extract times series of the nearest gird point (lon,lat) from
Expand Down Expand Up @@ -52,7 +51,6 @@ def import_data(self, ts: TimeSeries, save_csv=True, save_nc=False, use_cache=Fa
self.__clean_cache(tempfiles)
return df

@override
def download_temporary_files(self, ts: TimeSeries, use_cache: bool = False):
ts.variable = [ 'ucur', 'vcur', 'uwnd', 'vwnd', 'wlv', 'ice', 'hs', 'lm', 't02', 't01', 'fp', 'dir', 'spr', 'dp', 'phs0', 'phs1', 'phs2', 'ptp0', 'ptp1', 'ptp2', 'pdir0', 'pdir1']
dates = self.__get_dates(start_date=ts.start_time, end_date=ts.end_time)
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
'dask',
'pip',
'netcdf4',
'cdsapi',
'cartopy',
],
packages = setuptools.find_packages(),
include_package_data = True,
Expand Down
Loading

0 comments on commit e03f84d

Please sign in to comment.