7
7
import pandas as pd
8
8
9
9
from pyindicators .exceptions import PyIndicatorException
10
-
11
- from .utils import pad_zero_values_pandas , pad_zero_values_polars
10
+ from pyindicators .utils import pad_zero_values_pandas
12
11
13
12
14
13
def polars_ewm_mean_via_pandas (column : pl .Series , alpha : float ) -> pl .Series :
@@ -41,12 +40,12 @@ def calculate_adx_pandas(
41
40
copy_df ['H-pH' ] = copy_df ['High' ] - copy_df ['High' ].shift (1 )
42
41
copy_df ['pL-L' ] = copy_df ['Low' ].shift (1 ) - copy_df ['Low' ]
43
42
copy_df ['+DI' ] = np .where (
44
- (copy_df ['H-pH' ] > copy_df ['pL-L' ]) & (copy_df ['H-pH' ]> 0 ),
43
+ (copy_df ['H-pH' ] > copy_df ['pL-L' ]) & (copy_df ['H-pH' ] > 0 ),
45
44
copy_df ['H-pH' ],
46
45
0.0
47
46
)
48
47
copy_df ['-DI' ] = np .where (
49
- (copy_df ['H-pH' ] < copy_df ['pL-L' ]) & (copy_df ['pL-L' ]> 0 ),
48
+ (copy_df ['H-pH' ] < copy_df ['pL-L' ]) & (copy_df ['pL-L' ] > 0 ),
50
49
copy_df ['pL-L' ],
51
50
0.0
52
51
)
@@ -60,7 +59,10 @@ def calculate_adx_pandas(
60
59
del copy_df ['S+DM' ], copy_df ['S-DM' ]
61
60
62
61
# ADX
63
- copy_df ['DX' ] = (np .abs (copy_df ['+DMI' ] - copy_df ['-DMI' ])/ (copy_df ['+DMI' ] + copy_df ['-DMI' ]))* 100
62
+ copy_df ['DX' ] = (
63
+ np .abs (copy_df ['+DMI' ] - copy_df ['-DMI' ])/ (copy_df ['+DMI' ]
64
+ + copy_df ['-DMI' ])
65
+ )* 100
64
66
copy_df ['ADX' ] = copy_df ['DX' ].ewm (alpha = alpha , adjust = False ).mean ()
65
67
del copy_df ['DX' ], copy_df ['ATR' ], copy_df ['TR' ]
66
68
copy_df = pad_zero_values_pandas (
@@ -130,7 +132,8 @@ def adx(
130
132
131
133
if not all (col in data .columns for col in required_columns ):
132
134
raise PyIndicatorException (
133
- f"Input DataFrame must contain the following columns: { required_columns } "
135
+ "Input DataFrame must contain the " +
136
+ f"following columns: { required_columns } "
134
137
)
135
138
136
139
if len (data ) < period :
@@ -172,78 +175,89 @@ def adx(
172
175
173
176
# copy_df = data.clone()
174
177
175
- # # True Range (TR)
176
- # copy_df = copy_df.with_columns([
177
- # (pl.col("High") - pl.col("Low")).alias("H-L"),
178
- # (pl.col("High") - pl.col("Close").shift(1).fill_null(0)).abs().alias("H-C"),
179
- # (pl.col("Low") - pl.col("Close").shift(1).fill_null(0)).abs().alias("L-C")
180
- # ])
181
-
182
- # copy_df = copy_df.with_columns([
183
- # pl.col("H-L").fill_null(0).alias("H-L"),
184
- # pl.col("H-C").fill_null(0).alias("H-C"),
185
- # pl.col("L-C").fill_null(0).alias("L-C")
186
- # ])
187
-
188
- # copy_df = copy_df.with_columns(
189
- # pl.max_horizontal(["H-L", "H-C", "L-C"]).alias("TR")
190
- # ).drop(["H-L", "H-C", "L-C"])
191
-
192
- # # ATR using Pandas
193
- # copy_df = copy_df.with_columns(
194
- # polars_ewm_mean_via_pandas(copy_df["TR"].fill_nan(0), alpha).alias("ATR")
195
- # )
196
-
197
- # # +-DX calculation
198
- # copy_df = copy_df.with_columns([
199
- # (pl.col("High") - pl.col("High").shift(1).fill_null(0)).alias("H-pH"),
200
- # (pl.col("Low").shift(1).fill_null(0) - pl.col("Low")).alias("pL-L")
201
- # ])
202
-
203
- # copy_df = copy_df.with_columns([
204
- # pl.when((pl.col("H-pH") > pl.col("pL-L")) & (pl.col("H-pH") > 0))
205
- # .then(pl.col("H-pH")).otherwise(0.0).alias("+DI"),
206
- # pl.when((pl.col("H-pH") < pl.col("pL-L")) & (pl.col("pL-L") > 0))
207
- # .then(pl.col("pL-L")).otherwise(0.0).alias("-DI")
208
- # ]).drop(["H-pH", "pL-L"])
209
-
210
- # # Smooth DI using Pandas
211
- # copy_df = copy_df.with_columns([
212
- # polars_ewm_mean_via_pandas(copy_df["+DI"].fill_nan(0), alpha).alias("S+DM"),
213
- # polars_ewm_mean_via_pandas(copy_df["-DI"].fill_nan(0), alpha).alias("S-DM")
214
- # ])
215
-
216
- # copy_df = copy_df.with_columns([
217
- # ((pl.col("S+DM") / pl.col("ATR")) * 100).alias("+DMI"),
218
- # ((pl.col("S-DM") / pl.col("ATR")) * 100).alias("-DMI")
219
- # ]).drop(["S+DM", "S-DM"])
220
-
221
- # # ADX
222
- # copy_df = copy_df.with_columns(
223
- # pl.when((pl.col("+DMI") + pl.col("-DMI")) > 0)
224
- # .then(((pl.col("+DMI") - pl.col("-DMI")).abs()) / (pl.col("+DMI") + pl.col("-DMI")) * 100)
225
- # .otherwise(0.0).alias("DX")
226
- # )
227
-
228
- # copy_df = copy_df.with_columns(
229
- # polars_ewm_mean_via_pandas(copy_df["DX"].fill_nan(0), alpha).alias("ADX")
230
- # ).drop(["DX", "ATR", "TR"])
231
-
232
- # # Fill NaNs
233
- # copy_df = copy_df.with_columns([
234
- # pl.col("ADX").fill_nan(0).alias("ADX"),
235
- # pl.col("+DMI").fill_nan(0).alias("+DMI"),
236
- # pl.col("-DMI").fill_nan(0).alias("-DMI")
237
- # ])
238
-
239
- # # Copy to original
240
- # data = data.with_columns([
241
- # copy_df["ADX"].alias(adx_result_column),
242
- # copy_df["+DMI"].alias(di_plus_result_column),
243
- # copy_df["-DMI"].alias(di_minus_result_column)
244
- # ])
245
-
246
- # # Padding zeros
247
- # data = pad_zero_values_polars(data, column=di_plus_result_column, period=period)
248
- # data = pad_zero_values_polars(data, column=di_minus_result_column, period=period)
249
- # data = pad_zero_values_polars(data, column=adx_result_column, period=period)
178
+ # # True Range (TR)
179
+ # copy_df = copy_df.with_columns([
180
+ # (pl.col("High") - pl.col("Low")).alias("H-L"),
181
+ # (pl.col("High") - pl.col("Close").shift(1)
182
+ # .fill_null(0)).abs().alias("H-C"),
183
+ # (pl.col("Low") - pl.col("Close").shift(1)
184
+ # .fill_null(0)).abs().alias("L-C")
185
+ # ])
186
+
187
+ # copy_df = copy_df.with_columns([
188
+ # pl.col("H-L").fill_null(0).alias("H-L"),
189
+ # pl.col("H-C").fill_null(0).alias("H-C"),
190
+ # pl.col("L-C").fill_null(0).alias("L-C")
191
+ # ])
192
+
193
+ # copy_df = copy_df.with_columns(
194
+ # pl.max_horizontal(["H-L", "H-C", "L-C"]).alias("TR")
195
+ # ).drop(["H-L", "H-C", "L-C"])
196
+
197
+ # # ATR using Pandas
198
+ # copy_df = copy_df.with_columns(
199
+ # polars_ewm_mean_via_pandas(copy_df["TR"]
200
+ # .fill_nan(0), alpha).alias("ATR")
201
+ # )
202
+
203
+ # # +-DX calculation
204
+ # copy_df = copy_df.with_columns([
205
+ # (pl.col("High") - pl.col("High").shift(1)
206
+ # .fill_null(0)).alias("H-pH"),
207
+ # (pl.col("Low").shift(1).fill_null(0) - pl.col("Low")).alias("pL-L")
208
+ # ])
209
+
210
+ # copy_df = copy_df.with_columns([
211
+ # pl.when((pl.col("H-pH") > pl.col("pL-L")) & (pl.col("H-pH") > 0))
212
+ # .then(pl.col("H-pH")).otherwise(0.0).alias("+DI"),
213
+ # pl.when((pl.col("H-pH") < pl.col("pL-L")) & (pl.col("pL-L") > 0))
214
+ # .then(pl.col("pL-L")).otherwise(0.0).alias("-DI")
215
+ # ]).drop(["H-pH", "pL-L"])
216
+
217
+ # # Smooth DI using Pandas
218
+ # copy_df = copy_df.with_columns([
219
+ # polars_ewm_mean_via_pandas(copy_df["+DI"]
220
+ # .fill_nan(0), alpha).alias("S+DM"),
221
+ # polars_ewm_mean_via_pandas(copy_df["-DI"]
222
+ # .fill_nan(0), alpha).alias("S-DM")
223
+ # ])
224
+
225
+ # copy_df = copy_df.with_columns([
226
+ # ((pl.col("S+DM") / pl.col("ATR")) * 100).alias("+DMI"),
227
+ # ((pl.col("S-DM") / pl.col("ATR")) * 100).alias("-DMI")
228
+ # ]).drop(["S+DM", "S-DM"])
229
+
230
+ # # ADX
231
+ # copy_df = copy_df.with_columns(
232
+ # pl.when((pl.col("+DMI") + pl.col("-DMI")) > 0)
233
+ # .then(((pl.col("+DMI") - pl.col("-DMI"))
234
+ # .abs()) / (pl.col("+DMI") + pl.col("-DMI")) * 100)
235
+ # .otherwise(0.0).alias("DX")
236
+ # )
237
+
238
+ # copy_df = copy_df.with_columns(
239
+ # polars_ewm_mean_via_pandas(copy_df["DX"]
240
+ # .fill_nan(0), alpha).alias("ADX")
241
+ # ).drop(["DX", "ATR", "TR"])
242
+
243
+ # # Fill NaNs
244
+ # copy_df = copy_df.with_columns([
245
+ # pl.col("ADX").fill_nan(0).alias("ADX"),
246
+ # pl.col("+DMI").fill_nan(0).alias("+DMI"),
247
+ # pl.col("-DMI").fill_nan(0).alias("-DMI")
248
+ # ])
249
+
250
+ # # Copy to original
251
+ # data = data.with_columns([
252
+ # copy_df["ADX"].alias(adx_result_column),
253
+ # copy_df["+DMI"].alias(di_plus_result_column),
254
+ # copy_df["-DMI"].alias(di_minus_result_column)
255
+ # ])
256
+
257
+ # # Padding zeros
258
+ # data = pad_zero_values_polars(
259
+ # data, column=di_plus_result_column, period=period)
260
+ # data = pad_zero_values_polars(
261
+ # data, column=di_minus_result_column, period=period)
262
+ # data = pad_zero_values_polars
263
+ # (data, column=adx_result_column, period=period)
0 commit comments