diff --git a/pyproject.toml b/pyproject.toml index c4450f4..53dc692 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "res-wind-up" -version = "0.4.4" +version = "0.4.5" authors = [ { name = "Alex Clerc", email = "alex.clerc@res-group.com" } ] diff --git a/uv.lock b/uv.lock index 546ea39..3c56752 100644 --- a/uv.lock +++ b/uv.lock @@ -3596,7 +3596,7 @@ wheels = [ [[package]] name = "res-wind-up" -version = "0.4.4" +version = "0.4.5" source = { editable = "." } dependencies = [ { name = "eval-type-backport" }, diff --git a/wind_up/interface.py b/wind_up/interface.py index 577c99e..ba189ab 100644 --- a/wind_up/interface.py +++ b/wind_up/interface.py @@ -13,7 +13,7 @@ from wind_up.constants import REANALYSIS_WD_COL from wind_up.northing import add_wf_yawdir, apply_northing_corrections from wind_up.optimize_northing import auto_northing_corrections -from wind_up.reanalysis_data import ReanalysisDataset, add_reanalysis_data +from wind_up.reanalysis_data import MastOrLiDARDataset, ReanalysisDataset, add_reanalysis_data from wind_up.scada_funcs import filter_scada_df, get_raw_scada_and_cfg_from_file from wind_up.scada_power_curve import calc_pc_and_rated_ws from wind_up.smart_data import add_smart_lat_long_to_cfg @@ -143,6 +143,7 @@ class AssessmentInputs: cfg: WindUpConfig plot_cfg: PlotConfig pre_post_splitter: PrePostSplitter + mast_or_lidar_datasets: list[MastOrLiDARDataset] | None = None @classmethod def from_cfg( @@ -155,6 +156,7 @@ def from_cfg( toggle_df: pd.DataFrame | None = None, reanalysis_datasets: list[ReanalysisDataset], cache_dir: Path | None = None, + mast_or_lidar_datasets: list[MastOrLiDARDataset] | None = None, ) -> AssessmentInputs: """Construct instance of AssessmentInputs from configuration objects and data. @@ -183,6 +185,7 @@ def from_cfg( cfg=cfg, plot_cfg=plot_cfg, pre_post_splitter=pre_post_splitter, + mast_or_lidar_datasets=mast_or_lidar_datasets, ) diff --git a/wind_up/main_analysis.py b/wind_up/main_analysis.py index 5e27dac..07c6cec 100644 --- a/wind_up/main_analysis.py +++ b/wind_up/main_analysis.py @@ -12,7 +12,6 @@ import wind_up from wind_up.circular_math import circ_diff from wind_up.constants import ( - PROJECTROOT_DIR, RANDOM_SEED, REANALYSIS_WD_COL, REANALYSIS_WS_COL, @@ -44,6 +43,7 @@ if TYPE_CHECKING: from wind_up.models import PlotConfig, Turbine, WindUpConfig + from wind_up.reanalysis_data import MastOrLiDARDataset logger = logging.getLogger(__name__) @@ -183,6 +183,7 @@ def _get_ref_df( test_wtg: Turbine, toggle_df: pd.DataFrame | None = None, keep_only_toggle_off: bool = True, + mast_or_lidar_datasets: list[MastOrLiDARDataset] | None = None, ) -> pd.DataFrame: if ref_name in [x.name for x in cfg.asset.wtgs]: ref_df = wf_df.loc[ref_name].copy() @@ -201,9 +202,10 @@ def _get_ref_df( original_wd_col = REANALYSIS_WD_COL elif ref_name in [x.name for x in cfg.asset.masts_and_lidars]: ref_obj = next(x for x in cfg.asset.masts_and_lidars if x.name == ref_name) - ref_df = pd.read_parquet( - PROJECTROOT_DIR / "input_data" / "masts_and_lidars" / cfg.asset.name / f"{ref_obj.data_file_name}", - ) + if mast_or_lidar_datasets is None: + msg = f"No mast or lidar datasets provided for {ref_name}" + raise ValueError(msg) + ref_df = next(x for x in mast_or_lidar_datasets if x.id == ref_name).data northing_df = wf_df.loc[cfg.test_wtgs[0].name, [REANALYSIS_WS_COL, REANALYSIS_WD_COL, WINDFARM_YAWDIR_COL]] ref_df = ref_df.merge(northing_df, how="left", left_index=True, right_index=True) original_ws_col = ref_obj.wind_speed_column @@ -449,6 +451,7 @@ def _calc_test_ref_results( plot_cfg: PlotConfig, random_seed: int, toggle_df: pd.DataFrame | None = None, + mast_or_lidar_datasets: list[MastOrLiDARDataset] | None = None, ) -> dict: test_name = test_wtg.name (plot_cfg.plots_dir / test_name / ref_name).mkdir(exist_ok=True, parents=True) @@ -478,6 +481,7 @@ def _calc_test_ref_results( test_wtg=test_wtg, toggle_df=toggle_df, keep_only_toggle_off=keep_only_toggle_off, + mast_or_lidar_datasets=mast_or_lidar_datasets, ) if len(ref_df) == 0: result_manager.warning(f"ref_df is empty for {ref_name}") @@ -925,6 +929,7 @@ def run_wind_up_analysis( cfg=cfg, plot_cfg=plot_cfg, random_seed=random_seed, + mast_or_lidar_datasets=inputs.mast_or_lidar_datasets, ) test_ref_results = test_ref_results | test_results logger.info(test_ref_results) diff --git a/wind_up/models.py b/wind_up/models.py index da39bbb..b408170 100644 --- a/wind_up/models.py +++ b/wind_up/models.py @@ -97,10 +97,6 @@ class MastOrLidar(BaseModel): name: str = Field(description="Object name", min_length=2) latitude: float = Field(default=np.nan, ge=-90, le=90) longitude: float = Field(default=np.nan, ge=-180, le=180) - data_file_name: str = Field( - min_length=2, - description="Name of data timeseries file", - ) wind_speed_column: str = Field(min_length=2, description="Name of wind speed column in data timeseries file") wind_direction_column: str = Field( min_length=2, diff --git a/wind_up/reanalysis_data.py b/wind_up/reanalysis_data.py index c7e599c..456153c 100644 --- a/wind_up/reanalysis_data.py +++ b/wind_up/reanalysis_data.py @@ -222,3 +222,11 @@ def add_reanalysis_data( if plot_cfg is not None: plot_wf_and_reanalysis_sample_timeseries(wf_df=wf_and_reanalysis_df, plot_cfg=plot_cfg) return wf_and_reanalysis_df + + +@dataclass +class MastOrLiDARDataset: + """Class to store mast or LiDAR data.""" + + id: str + data: pd.DataFrame