Skip to content

Commit

Permalink
Adjust DWD Mosmix and DMO kml reader to parse all parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
gutzbenj committed May 19, 2024
1 parent 9f34002 commit c81b360
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 34 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ Development
***********

- Fix `dropna` argument for DWD Mosmix and DMO
- Adjust DWD Mosmix and DMO kml reader to parse all parameters

0.84.0 (15.05.2024)
*******************
Expand Down
24 changes: 12 additions & 12 deletions wetterdienst/provider/dwd/dmo/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -1084,20 +1084,8 @@ def __init__(self, stations_result: StationsResult) -> None:
"""
super().__init__(stations_result=stations_result)

parameter_base = self.sr.stations._parameter_base
dataset_accessor = self.sr.stations._dataset_accessor

parameter_ = []
for parameter, dataset in self.sr.parameter:
if parameter == dataset:
parameter = [par.value for par in parameter_base[dataset_accessor][dataset_accessor]]
parameter_.extend(parameter)
else:
parameter_.append(parameter.value)

self.kml = KMLReader(
station_ids=self.sr.station_id.to_list(),
parameters=parameter_,
settings=self.sr.stations.settings,
)

Expand Down Expand Up @@ -1126,10 +1114,22 @@ def query(self) -> Iterator[ValuesResult]:
self.stations_counter = 0
self.stations_collected = []

parameter_base = self.sr.stations._parameter_base
dataset_accessor = self.sr.stations._dataset_accessor

parameter_names = set()
for parameter, dataset in self.sr.parameter:
if parameter == dataset:
parameter = [par.value for par in parameter_base[dataset_accessor][dataset_accessor]]
parameter_names.update(parameter)
else:
parameter_names.add(parameter.value)

for df in self._collect_station_parameter():
df = self._tidy_up_df(df)
station_id = df.get_column(Columns.STATION_ID.value).gather(0).item()
df = self._organize_df_columns(df, station_id, self.sr.stations.dmo_type)
df = df.filter(pl.col(Columns.PARAMETER.value).is_in(parameter_names))

if self.sr.humanize:
df = self._humanize(df, hpm)
Expand Down
18 changes: 8 additions & 10 deletions wetterdienst/provider/dwd/mosmix/access.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,8 @@
class KMLReader:
"""Read DWD XML Weather Forecast File of Type KML."""

def __init__(self, station_ids: list[str], parameters: list[str], settings: Settings) -> None:
def __init__(self, station_ids: list[str], settings: Settings) -> None:
self.station_ids = station_ids
self.parameters = parameters
self.metadata = {}
self.timesteps = []
self.nsmap = None
Expand Down Expand Up @@ -169,14 +168,13 @@ def get_forecasts(self) -> Iterator[pl.DataFrame]:

for measurement_item in measurement_list:
measurement_parameter = measurement_item.get(f"{{{self.nsmap['dwd']}}}elementName")
if measurement_parameter.lower() in self.parameters:
measurement_string = measurement_item.getchildren()[0].text
measurement_values = " ".join(measurement_string.split()).split(" ")
measurement_values = [None if i == "-" else float(i) for i in measurement_values]
assert len(measurement_values) == len( # noqa:S101
self.timesteps,
), "Number of time steps does not match number of measurement values"
data_dict[measurement_parameter.lower()] = measurement_values
measurement_string = measurement_item.getchildren()[0].text
measurement_values = " ".join(measurement_string.split()).split(" ")
measurement_values = [None if i == "-" else float(i) for i in measurement_values]
assert len(measurement_values) == len( # noqa:S101
self.timesteps,
), "Number of time steps does not match number of measurement values"
data_dict[measurement_parameter.lower()] = measurement_values

station_forecast.clear()
yield pl.DataFrame(data_dict)
24 changes: 12 additions & 12 deletions wetterdienst/provider/dwd/mosmix/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -1025,20 +1025,8 @@ def __init__(self, stations_result: StationsResult) -> None:
"""
super().__init__(stations_result=stations_result)

parameter_base = self.sr.stations._parameter_base
dataset_accessor = self.sr.stations._dataset_accessor

parameter_ = []
for parameter, dataset in self.sr.parameter:
if parameter == dataset:
parameter = [par.value for par in parameter_base[dataset_accessor][dataset_accessor]]
parameter_.extend(parameter)
else:
parameter_.append(parameter.value)

self.kml = KMLReader(
station_ids=self.sr.station_id.to_list(),
parameters=parameter_,
settings=self.sr.stations.settings,
)

Expand All @@ -1061,10 +1049,22 @@ def query(self) -> Iterator[ValuesResult]:
self.stations_counter = 0
self.stations_collected = []

parameter_base = self.sr.stations._parameter_base
dataset_accessor = self.sr.stations._dataset_accessor

parameter_names = set()
for parameter, dataset in self.sr.parameter:
if parameter == dataset:
parameter = [par.value for par in parameter_base[dataset_accessor][dataset_accessor]]
parameter_names.update(parameter)
else:
parameter_names.add(parameter.value)

for df in self._collect_station_parameter():
df = self._tidy_up_df(df)
station_id = df.get_column(Columns.STATION_ID.value).gather(0).item()
df = self._organize_df_columns(df, station_id, self.sr.stations.mosmix_type)
df = df.filter(pl.col(Columns.PARAMETER.value).is_in(parameter_names))

if self.sr.humanize:
df = self._humanize(df, hpm)
Expand Down

0 comments on commit c81b360

Please sign in to comment.