Skip to content

Commit 89b04db

Browse files
committed
Fix indices reference error
1 parent 0175e74 commit 89b04db

File tree

1 file changed

+38
-12
lines changed

1 file changed

+38
-12
lines changed

pyindicators/indicators/divergence.py

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,10 @@ def get_higher_lows_index(data, order=5, K=2):
103103

104104

105105
def 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

Comments
 (0)