77import pandas as pd
88
99from 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
1211
1312
1413def polars_ewm_mean_via_pandas (column : pl .Series , alpha : float ) -> pl .Series :
@@ -41,12 +40,12 @@ def calculate_adx_pandas(
4140 copy_df ['H-pH' ] = copy_df ['High' ] - copy_df ['High' ].shift (1 )
4241 copy_df ['pL-L' ] = copy_df ['Low' ].shift (1 ) - copy_df ['Low' ]
4342 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 ),
4544 copy_df ['H-pH' ],
4645 0.0
4746 )
4847 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 ),
5049 copy_df ['pL-L' ],
5150 0.0
5251 )
@@ -60,7 +59,10 @@ def calculate_adx_pandas(
6059 del copy_df ['S+DM' ], copy_df ['S-DM' ]
6160
6261 # 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
6466 copy_df ['ADX' ] = copy_df ['DX' ].ewm (alpha = alpha , adjust = False ).mean ()
6567 del copy_df ['DX' ], copy_df ['ATR' ], copy_df ['TR' ]
6668 copy_df = pad_zero_values_pandas (
@@ -130,7 +132,8 @@ def adx(
130132
131133 if not all (col in data .columns for col in required_columns ):
132134 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 } "
134137 )
135138
136139 if len (data ) < period :
@@ -172,78 +175,89 @@ def adx(
172175
173176 # copy_df = data.clone()
174177
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