@@ -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 }  ] =  np .nan 
154154        data [f"{ source_column }  ] =  np .nan 
155155
156-         data .loc [data .index [hh_idx ], f"{ source_column }  ] =  1 
157-         data .loc [data .index [lh_idx ], f"{ source_column }  ] =  - 1 
158-         data .loc [data .index [ll_idx ], f"{ source_column }  ] =  1 
159-         data .loc [data .index [hl_idx ], f"{ source_column }  ] =  - 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 }  )] =  1 
166+         if  len (valid_lh_idx ) >  0 :
167+             data .iloc [valid_lh_idx , data .columns .get_loc (
168+                 f"{ source_column }  )] =  - 1 
169+         if  len (valid_ll_idx ) >  0 :
170+             data .iloc [valid_ll_idx , data .columns .get_loc (
171+                 f"{ source_column }  )] =  1 
172+         if  len (valid_hl_idx ) >  0 :
173+             data .iloc [valid_hl_idx , data .columns .get_loc (
174+                 f"{ source_column }  )] =  - 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_col ),
0 commit comments