@@ -103,10 +103,10 @@ def get_higher_lows_index(data, order=5, K=2):
103103
104104
105105def detect_peaks (
106- data : Union [pd .DataFrame , pl .DataFrame ],
107- source_column : str ,
108- number_of_neighbors_to_compare : int = 5 ,
109- min_consecutive : int = 2
106+ data : Union [pd .DataFrame , pl .DataFrame ],
107+ source_column : str ,
108+ number_of_neighbors_to_compare : int = 5 ,
109+ min_consecutive : int = 2
110110) -> Union [pd .DataFrame , pl .DataFrame ]:
111111 """
112112 Detects local peak structures in a time series column
@@ -153,20 +153,46 @@ def detect_peaks(
153153 data [f"{ source_column } _highs" ] = np .nan
154154 data [f"{ source_column } _lows" ] = np .nan
155155
156- data .loc [data .index [hh_idx ], f"{ source_column } _highs" ] = 1
157- data .loc [data .index [lh_idx ], f"{ source_column } _highs" ] = - 1
158- data .loc [data .index [ll_idx ], f"{ source_column } _lows" ] = 1
159- data .loc [data .index [hl_idx ], f"{ source_column } _lows" ] = - 1
156+ # Fix: Filter indices to ensure they're within bounds and convert to list
157+ valid_hh_idx = [i for i in hh_idx if 0 <= i < len (data )]
158+ valid_lh_idx = [i for i in lh_idx if 0 <= i < len (data )]
159+ valid_ll_idx = [i for i in ll_idx if 0 <= i < len (data )]
160+ valid_hl_idx = [i for i in hl_idx if 0 <= i < len (data )]
161+
162+ # Use iloc for integer-based indexing instead of loc with index arrays
163+ if len (valid_hh_idx ) > 0 :
164+ data .iloc [valid_hh_idx , data .columns .get_loc (
165+ f"{ source_column } _highs" )] = 1
166+ if len (valid_lh_idx ) > 0 :
167+ data .iloc [valid_lh_idx , data .columns .get_loc (
168+ f"{ source_column } _highs" )] = - 1
169+ if len (valid_ll_idx ) > 0 :
170+ data .iloc [valid_ll_idx , data .columns .get_loc (
171+ f"{ source_column } _lows" )] = 1
172+ if len (valid_hl_idx ) > 0 :
173+ data .iloc [valid_hl_idx , data .columns .get_loc (
174+ f"{ source_column } _lows" )] = - 1
175+
160176 return data
161177
162178 elif isinstance (data , pl .DataFrame ):
163179 highs_col = np .full (len (data ), np .nan )
164180 lows_col = np .full (len (data ), np .nan )
165181
166- highs_col [hh_idx ] = 1
167- highs_col [lh_idx ] = - 1
168- lows_col [ll_idx ] = 1
169- lows_col [hl_idx ] = - 1
182+ # Filter indices for polars as well
183+ valid_hh_idx = [i for i in hh_idx if 0 <= i < len (data )]
184+ valid_lh_idx = [i for i in lh_idx if 0 <= i < len (data )]
185+ valid_ll_idx = [i for i in ll_idx if 0 <= i < len (data )]
186+ valid_hl_idx = [i for i in hl_idx if 0 <= i < len (data )]
187+
188+ if len (valid_hh_idx ) > 0 :
189+ highs_col [valid_hh_idx ] = 1
190+ if len (valid_lh_idx ) > 0 :
191+ highs_col [valid_lh_idx ] = - 1
192+ if len (valid_ll_idx ) > 0 :
193+ lows_col [valid_ll_idx ] = 1
194+ if len (valid_hl_idx ) > 0 :
195+ lows_col [valid_hl_idx ] = - 1
170196
171197 data = data .with_columns ([
172198 pl .Series (f"{ source_column } _highs" , highs_col ),
0 commit comments