Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading