@@ -68,6 +68,48 @@ def sensor_analysis(sensor_parameters):
6868 return rd_analysis
6969
7070
71+ @pytest .fixture
72+ def sensor_analysis_nans (sensor_parameters ):
73+ def randomly_replace_with (series , replace_with = 0 , fraction = 0.1 , seed = None ):
74+ """
75+ Randomly replace a fraction of entries in a pandas Series with input value `replace_with`.
76+
77+ Parameters:
78+ series (pd.Series): The input pandas Series.
79+ fraction (float): The fraction of entries to replace with 0. Default is 0.1 (10%).
80+ seed (int, optional): Seed for the random number generator for reproducibility.
81+
82+ Returns:
83+ pd.Series: The modified pandas Series with some entries replaced by 0.
84+ """
85+ if seed is not None :
86+ np .random .seed (seed )
87+
88+ # Determine the number of entries to replace
89+ n_replace = int (len (series ) * fraction )
90+
91+ # Randomly select indices to replace
92+ replace_indices = np .random .choice (series .index , size = n_replace , replace = False )
93+
94+ # Replace selected entries with
95+ series .loc [replace_indices ] = replace_with
96+
97+ return series
98+
99+ sensor_parameters_zeros = sensor_parameters .copy ()
100+ sensor_parameters_nans = sensor_parameters .copy ()
101+
102+ sensor_parameters_zeros ["pv" ] = randomly_replace_with (sensor_parameters ["pv" ], seed = 0 )
103+ sensor_parameters_nans ["pv" ] = sensor_parameters_zeros ["pv" ].replace (0 , np .nan )
104+
105+ rd_analysis_zeros = TrendAnalysis (** sensor_parameters_zeros )
106+ rd_analysis_zeros .sensor_analysis (analyses = ["yoy_degradation" ])
107+
108+ rd_analysis_nans = TrendAnalysis (** sensor_parameters_nans )
109+ rd_analysis_nans .sensor_analysis (analyses = ["yoy_degradation" ])
110+ return rd_analysis_zeros , rd_analysis_nans
111+
112+
71113@pytest .fixture
72114def sensor_analysis_exp_power (sensor_parameters ):
73115 power_expected = normalization .pvwatts_dc_power (
@@ -209,6 +251,21 @@ def test_sensor_analysis(sensor_analysis):
209251 assert [- 1 , - 1 ] == pytest .approx (ci , abs = 1e-2 )
210252
211253
254+ def test_sensor_analysis_nans (sensor_analysis_nans ):
255+ rd_analysis_zeros , rd_analysis_nans = sensor_analysis_nans
256+
257+ yoy_results_zeros = rd_analysis_zeros .results ["sensor" ]["yoy_degradation" ]
258+ rd_zeros = yoy_results_zeros ["p50_rd" ]
259+ ci_zeros = yoy_results_zeros ["rd_confidence_interval" ]
260+
261+ yoy_results_nans = rd_analysis_nans .results ["sensor" ]["yoy_degradation" ]
262+ rd_nans = yoy_results_nans ["p50_rd" ]
263+ ci_nans = yoy_results_nans ["rd_confidence_interval" ]
264+
265+ assert rd_zeros == pytest .approx (rd_nans , abs = 1e-2 )
266+ assert ci_zeros == pytest .approx (ci_nans , abs = 1e-1 )
267+
268+
212269def test_sensor_analysis_filter_components (sensor_analysis ):
213270 columns = sensor_analysis .sensor_filter_components_aggregated .columns
214271 assert {'two_way_window_filter' } == set (columns )
0 commit comments