pkscreener 0.46.20250810.756__cp312-cp312-manylinux2014_x86_64.whl → 0.46.20250908.766__cp312-cp312-manylinux2014_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/LICENSE-Others.txt +1 -1
  2. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/README.txt +6 -6
  3. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/__init__.py +2 -2
  4. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/AssetsManager.py +13 -29
  5. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/Backtest.py +5 -5
  6. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/CandlePatterns.py +23 -23
  7. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/ConfigManager.py +13 -1
  8. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/ConsoleUtility.py +1 -1
  9. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/Fetcher.py +26 -20
  10. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/ImageUtility.py +1 -1
  11. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/MarketMonitor.py +6 -6
  12. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/MarketStatus.py +3 -2
  13. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/PKMarketOpenCloseAnalyser.py +14 -14
  14. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/PKScanRunner.py +2 -2
  15. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/Pktalib.py +36 -36
  16. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/PortfolioXRay.py +5 -5
  17. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/ScreeningStatistics.py +457 -445
  18. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/StockScreener.py +47 -34
  19. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/Utility.py +4 -3
  20. pkscreener-0.46.20250908.766.data/purelib/pkscreener/classes/__init__.py +1 -0
  21. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/globals.py +25 -23
  22. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/pkscreenerbot.py +24 -21
  23. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/pkscreenercli.py +9 -9
  24. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/requirements.txt +3 -3
  25. {pkscreener-0.46.20250810.756.dist-info → pkscreener-0.46.20250908.766.dist-info}/METADATA +10 -11
  26. pkscreener-0.46.20250908.766.dist-info/RECORD +58 -0
  27. pkscreener-0.46.20250810.756.data/purelib/pkscreener/classes/__init__.py +0 -1
  28. pkscreener-0.46.20250810.756.dist-info/RECORD +0 -58
  29. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/Disclaimer.txt +0 -0
  30. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/LICENSE.txt +0 -0
  31. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/LogoWM.txt +0 -0
  32. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/ArtTexts.py +0 -0
  33. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/Barometer.py +0 -0
  34. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/BaseScreeningStatistics.py +0 -0
  35. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/Changelog.py +0 -0
  36. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/ConsoleMenuUtility.py +0 -0
  37. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/GlobalStore.py +0 -0
  38. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/MenuOptions.py +0 -0
  39. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/Messenger.py +0 -0
  40. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/OtaUpdater.py +0 -0
  41. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/PKAnalytics.py +0 -0
  42. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/PKDataService.py +0 -0
  43. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/PKDemoHandler.py +0 -0
  44. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/PKPremiumHandler.py +0 -0
  45. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/PKScheduledTaskProgress.py +0 -0
  46. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/PKScheduler.py +0 -0
  47. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/PKSpreadsheets.py +0 -0
  48. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/PKTask.py +0 -0
  49. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/PKUserRegistration.py +0 -0
  50. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/Portfolio.py +0 -0
  51. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/StockSentiment.py +0 -0
  52. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/UserMenuChoicesHandler.py +0 -0
  53. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/WorkflowManager.py +0 -0
  54. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/classes/keys.py +0 -0
  55. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/courbd.ttf +0 -0
  56. {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.766.data}/purelib/pkscreener/pkscreener.ini +0 -0
  57. {pkscreener-0.46.20250810.756.dist-info → pkscreener-0.46.20250908.766.dist-info}/WHEEL +0 -0
  58. {pkscreener-0.46.20250810.756.dist-info → pkscreener-0.46.20250908.766.dist-info}/entry_points.txt +0 -0
  59. {pkscreener-0.46.20250810.756.dist-info → pkscreener-0.46.20250908.766.dist-info}/licenses/LICENSE +0 -0
  60. {pkscreener-0.46.20250810.756.dist-info → pkscreener-0.46.20250908.766.dist-info}/top_level.txt +0 -0
@@ -62,6 +62,7 @@ class MarketStatus(SingletonMixin, metaclass=SingletonType):
62
62
  self.attributes["marketStatus"] = status
63
63
 
64
64
  def getMarketStatus(self, progress=None, task_id=0, exchangeSymbol="^NSEI",namedOnly=False):
65
+ return "NA"
65
66
  lngStatus = ""
66
67
  try:
67
68
  # if not 'pytest' in sys.modules:
@@ -71,9 +72,9 @@ class MarketStatus(SingletonMixin, metaclass=SingletonType):
71
72
  with SuppressOutput(suppress_stdout=suppressLogs, suppress_stderr=suppressLogs):
72
73
  if progress:
73
74
  progress[task_id] = {"progress": 0, "total": 1}
74
- _,lngStatus,_ = MarketStatus.nseFetcher.capitalMarketStatus(exchange=exchangeSymbol)
75
+ _,lngStatus,_ = "","TODO","" # MarketStatus.nseFetcher.capitalMarketStatus(exchange=exchangeSymbol)
75
76
  if exchangeSymbol in ["^NSEI","^BSESN"] and not namedOnly:
76
- _,bseStatus,_ = MarketStatus.nseFetcher.capitalMarketStatus(exchange="^BSESN")
77
+ _,bseStatus,_ = "","TODO","" #MarketStatus.nseFetcher.capitalMarketStatus(exchange="^BSESN")
77
78
  lngStatus = f"{lngStatus} | {bseStatus}"
78
79
  if progress:
79
80
  progress[task_id] = {"progress": 1, "total": 1}
@@ -288,9 +288,9 @@ class PKMarketOpenCloseAnalyser:
288
288
  if df is not None and len(df) > 0:
289
289
  close = PKMarketOpenCloseAnalyser.getMorningClose(df)
290
290
  adjClose = df["Adj Close"][-1] if "Adj Close" in df.columns else close
291
- combinedCandle = {"Open":PKMarketOpenCloseAnalyser.getMorningOpen(df), "High":max(df["High"]),
292
- "Low":min(df["Low"]),"Close":close,
293
- "Adj Close":adjClose,"Volume":sum(df["Volume"])}
291
+ combinedCandle = {"open":PKMarketOpenCloseAnalyser.getMorningOpen(df), "high":max(df["high"]),
292
+ "low":min(df["low"]),"close":close,
293
+ "Adj Close":adjClose,"volume":sum(df["volume"])}
294
294
  tradingDate = df.index[-1] #PKDateUtilities.tradingDate()
295
295
  timestamp = datetime.datetime.strptime(tradingDate.strftime("%Y-%m-%d %H:%M:%S"),"%Y-%m-%d %H:%M:%S")
296
296
  df = pd.DataFrame([combinedCandle], columns=df.columns, index=[timestamp])
@@ -304,29 +304,29 @@ class PKMarketOpenCloseAnalyser:
304
304
 
305
305
  def getMorningOpen(df):
306
306
  try:
307
- open = df["Open"][0]
307
+ open = df["open"][0]
308
308
  except KeyError: # pragma: no cover
309
- open = df["Open"][df.index.values[0]]
309
+ open = df["open"][df.index.values[0]]
310
310
  index = 0
311
311
  while np.isnan(open) and index < len(df):
312
312
  try:
313
- open = df["Open"][index + 1]
313
+ open = df["open"][index + 1]
314
314
  except KeyError: # pragma: no cover
315
- open = df["Open"][df.index.values[index + 1]]
315
+ open = df["open"][df.index.values[index + 1]]
316
316
  index += 1
317
317
  return open
318
318
 
319
319
  def getMorningClose(df):
320
320
  try:
321
- close = df["Close"][-1]
321
+ close = df["close"][-1]
322
322
  except KeyError: # pragma: no cover
323
- close = df["Close"][df.index.values[-1]]
323
+ close = df["close"][df.index.values[-1]]
324
324
  index = len(df)
325
325
  while np.isnan(close) and index >= 0:
326
326
  try:
327
- close = df["Close"][index - 1]
327
+ close = df["close"][index - 1]
328
328
  except KeyError: # pragma: no cover
329
- close = df["Close"][df.index.values[index - 1]]
329
+ close = df["close"][df.index.values[index - 1]]
330
330
  index -= 1
331
331
  return close
332
332
 
@@ -459,15 +459,15 @@ class PKMarketOpenCloseAnalyser:
459
459
  highTS, highRow = scrStats.findIntradayHighCrossover(df=df)
460
460
  # buySell_df = scrStats.computeBuySellSignals(updatedCandleData[stock]["data"])
461
461
  # OutputControls().printOutput(buySell_df)
462
- dayHighLTP = dayHighLTP if pd.notna(dayHighLTP) else highRow["High"][-1]
462
+ dayHighLTP = dayHighLTP if pd.notna(dayHighLTP) else highRow["high"][-1]
463
463
  sellTimestamps.append(PKDateUtilities.utc_to_ist(ts).strftime("%H:%M"))
464
464
  dayHighTimestamps.append(PKDateUtilities.utc_to_ist(highTS).strftime("%H:%M"))
465
- sellLTPs.append(row["High"][-1])
465
+ sellLTPs.append(row["high"][-1])
466
466
  eodLTPs.append(round(endOfDayLTP,2))
467
467
  dayHighLTPs.append(round(dayHighLTP,2))
468
468
  eodDiffs.append(round(endOfDayLTP - morningLTP,2))
469
469
  dayHighDiffs.append(round(dayHighLTP - morningLTP,2))
470
- sqrOffDiffs.append(round(row["High"][-1] - morningLTP,2))
470
+ sqrOffDiffs.append(round(row["high"][-1] - morningLTP,2))
471
471
  morningAlertLTPs.append(str(int(round(morningLTP,0))))
472
472
  index += 1
473
473
  except: # pragma: no cover
@@ -71,7 +71,7 @@ class PKScanRunner:
71
71
  "52Wk-H",
72
72
  "52Wk-L",
73
73
  "%Chng",
74
- "Volume",
74
+ "volume",
75
75
  "MA-Signal",
76
76
  "RSI",
77
77
  "RSIi",
@@ -89,7 +89,7 @@ class PKScanRunner:
89
89
  "52Wk-H",
90
90
  "52Wk-L",
91
91
  "%Chng",
92
- "Volume",
92
+ "volume",
93
93
  "MA-Signal",
94
94
  "RSI",
95
95
  "RSIi",
@@ -49,26 +49,26 @@ if Imports["talib"]:
49
49
  + colorText.END
50
50
  )
51
51
  try:
52
- import pandas_ta as talib
52
+ import pandas_ta_classic as talib
53
53
  OutputControls().printOutput(
54
54
  colorText.FAIL
55
- + f" [+] TA-Lib is not installed. Falling back on pandas_ta.\n [+] For full coverage(candle patterns), you may wish to follow instructions from\n [+] {taLink}"
55
+ + f" [+] TA-Lib is not installed. Falling back on pandas_ta_classic.\n [+] For full coverage(candle patterns), you may wish to follow instructions from\n [+] {taLink}"
56
56
  + colorText.END
57
57
  )
58
58
  except: # pragma: no cover
59
59
  OutputControls().printOutput(
60
60
  colorText.FAIL
61
- + f" [+] pandas_ta is not installed. Falling back on pandas_ta also failed.\n [+] For full coverage(candle patterns), you may wish to follow instructions from\n [+] {taLink}"
61
+ + f" [+] pandas_ta_classic is not installed. Falling back on pandas_ta_classic also failed.\n [+] For full coverage(candle patterns), you may wish to follow instructions from\n [+] {taLink}"
62
62
  + colorText.END
63
63
  )
64
64
  pass
65
65
  pass
66
66
  else:
67
67
  try:
68
- import pandas_ta as talib
68
+ import pandas_ta_classic as talib
69
69
  OutputControls().printOutput(
70
70
  colorText.FAIL
71
- + " [+] TA-Lib is not installed. Falling back on pandas_ta.\n [+] For full coverage(candle patterns), you may wish to follow instructions from\n [+] https://github.com/ta-lib/ta-lib-python"
71
+ + " [+] TA-Lib is not installed. Falling back on pandas_ta_classic.\n [+] For full coverage(candle patterns), you may wish to follow instructions from\n [+] https://github.com/ta-lib/ta-lib-python"
72
72
  + colorText.END
73
73
  )
74
74
  sleep(3)
@@ -103,12 +103,12 @@ class pktalib:
103
103
  # identify potential areas of support and resistance more accurately
104
104
  # and make better trading decisions.
105
105
  with pd.option_context('mode.chained_assignment', None):
106
- df["VWAP_D"] = pktalib.VWAP(high=df["High"],low=df["Low"],close=df["Close"],volume=df["Volume"],anchor="D")
106
+ df["VWAP_D"] = pktalib.VWAP(high=df["high"],low=df["low"],close=df["close"],volume=df["volume"],anchor="D")
107
107
  # If we create a column 'typical_price', it should be identical with 'VWAP_D'
108
- df['typical_price'] = (df['High'] + df['Low'] + df['Close'])/3
109
- tpp_d = ((df['High'] + df['Low'] + df['Close'])*df['Volume'])/3
108
+ df['typical_price'] = (df["high"] + df["low"] + df["close"])/3
109
+ tpp_d = ((df["high"] + df["low"] + df["close"])*df["volume"])/3
110
110
  df['anchored_VWAP'] = tpp_d.where(df.index >= anchored_date).groupby(
111
- df.index >= anchored_date).cumsum()/df['Volume'].where(
111
+ df.index >= anchored_date).cumsum()/df["volume"].where(
112
112
  df.index >= anchored_date).groupby(
113
113
  df.index >= anchored_date).cumsum()
114
114
  return df['anchored_VWAP']
@@ -132,7 +132,7 @@ class pktalib:
132
132
  @classmethod
133
133
  def VWAP(self, high, low, close, volume,anchor=None):
134
134
  try:
135
- import pandas_ta as talib
135
+ import pandas_ta_classic as talib
136
136
  # Aligning the series
137
137
  # high,low,close = pktalib.align_series(high, low, close, fill_value=0)
138
138
  return talib.vwap(high, low, close, volume,anchor=anchor)
@@ -204,7 +204,7 @@ class pktalib:
204
204
  @classmethod
205
205
  def TriMA(self, close,length=10):
206
206
  try:
207
- import pandas_ta as talib
207
+ import pandas_ta_classic as talib
208
208
  return talib.trima(close=close, length=length)
209
209
  except Exception: # pragma: no cover
210
210
  # default_logger().debug(e, exc_info=True)
@@ -213,7 +213,7 @@ class pktalib:
213
213
  @classmethod
214
214
  def MACD(self, close, fast, slow, signal):
215
215
  try:
216
- # import pandas_ta as talib
216
+ # import pandas_ta_classic as talib
217
217
  return talib.macd(close, fast, slow, signal, talib=Imports["talib"])
218
218
  except Exception: # pragma: no cover
219
219
  # default_logger().debug(e, exc_info=True)
@@ -346,7 +346,7 @@ class pktalib:
346
346
  def ichimoku(
347
347
  self, df, tenkan=None, kijun=None, senkou=None, include_chikou=True, offset=None
348
348
  ):
349
- import pandas_ta as ta
349
+ import pandas_ta_classic as ta
350
350
 
351
351
  ichimokudf, spandf = ta.ichimoku(
352
352
  df["high"], df["low"], df["close"], tenkan, kijun, senkou, False, 26
@@ -355,10 +355,10 @@ class pktalib:
355
355
 
356
356
  @classmethod
357
357
  def supertrend(self, df, length=7, multiplier=3):
358
- import pandas_ta as ta
358
+ import pandas_ta_classic as ta
359
359
 
360
360
  sti = ta.supertrend(
361
- df["High"], df["Low"], df["Close"], length=length, multiplier=multiplier
361
+ df["high"], df["low"], df["close"], length=length, multiplier=multiplier
362
362
  )
363
363
  # trend, direction, long, short
364
364
  # SUPERT_7_3.0 SUPERTd_7_3.0 SUPERTl_7_3.0 SUPERTs_7_3.0
@@ -373,17 +373,17 @@ class pktalib:
373
373
 
374
374
  # @classmethod
375
375
  # def momentum(self, df):
376
- # df.loc[:,'MOM'] = talib.MOM(df.loc[:,'Close'],2).apply(lambda x: round(x, 2))
376
+ # df.loc[:,'MOM'] = talib.MOM(df.loc[:,"close"],2).apply(lambda x: round(x, 2))
377
377
  # return df.loc[:,'MOM']
378
378
 
379
379
  # @classmethod
380
380
  # def get_dmi_df(self, df):
381
- # df.loc[:,'DMI'] = talib.DX(df.loc[:,'High'],df.loc[:,'Low'],df.loc[:,'Close'],timeperiod=14)
381
+ # df.loc[:,'DMI'] = talib.DX(df.loc[:,"high"],df.loc[:,"low"],df.loc[:,"close"],timeperiod=14)
382
382
  # return df.loc[:,'DMI']
383
383
 
384
384
  # @classmethod
385
385
  # def get_macd_df(self, df):
386
- # df.loc[:,'macd(12)'], df.loc[:,'macdsignal(9)'], df.loc[:,'macdhist(26)'] = talib.MACD(df.loc[:,'Close'], fastperiod=12, slowperiod=26, signalperiod=9)
386
+ # df.loc[:,'macd(12)'], df.loc[:,'macdsignal(9)'], df.loc[:,'macdhist(26)'] = talib.MACD(df.loc[:,"close"], fastperiod=12, slowperiod=26, signalperiod=9)
387
387
  # df.loc[:,'macd(12)'] = df.loc[:,'macd(12)'].apply(lambda x: round(x, 3))
388
388
  # df.loc[:,'macdsignal(9)']= df.loc[:,'macdsignal(9)'].apply(lambda x: round(x, 3))
389
389
  # df.loc[:,'macdhist(26)'] = df.loc[:,'macdhist(26)'].apply(lambda x: round(x, 3))
@@ -391,48 +391,48 @@ class pktalib:
391
391
 
392
392
  # @classmethod
393
393
  # def get_sma_df(self, df):
394
- # df.loc[:,'SMA(10)'] = talib.SMA(df.loc[:,'Close'],10).apply(lambda x: round(x, 2))
395
- # df.loc[:,'SMA(50)'] = talib.SMA(df.loc[:,'Close'],50).apply(lambda x: round(x, 2))
396
- # return df.loc[:,['Close','SMA(10)', 'SMA(50)']]
394
+ # df.loc[:,'SMA(10)'] = talib.SMA(df.loc[:,"close"],10).apply(lambda x: round(x, 2))
395
+ # df.loc[:,'SMA(50)'] = talib.SMA(df.loc[:,"close"],50).apply(lambda x: round(x, 2))
396
+ # return df.loc[:,["close",'SMA(10)', 'SMA(50)']]
397
397
 
398
398
  # @classmethod
399
399
  # def get_ema_df(self, df):
400
- # df.loc[:,'EMA(9)'] = talib.EMA(df.loc[:,'Close'], timeperiod = 9).apply(lambda x: round(x, 2))
401
- # return df.loc[:,['Close','EMA(9)']]
400
+ # df.loc[:,'EMA(9)'] = talib.EMA(df.loc[:,"close"], timeperiod = 9).apply(lambda x: round(x, 2))
401
+ # return df.loc[:,["close",'EMA(9)']]
402
402
 
403
403
  # @classmethod
404
404
  # def get_adx_df(self, df):
405
- # df.loc[:,'ADX'] = talib.ADX(df.loc[:,'High'],df.loc[:,'Low'], df.loc[:,'Close'], timeperiod=14).apply(lambda x: round(x, 2))
405
+ # df.loc[:,'ADX'] = talib.ADX(df.loc[:,"high"],df.loc[:,"low"], df.loc[:,"close"], timeperiod=14).apply(lambda x: round(x, 2))
406
406
  # return df.loc[:,'ADX']
407
407
 
408
408
  # @classmethod
409
409
  # def get_bbands_df(self, df):
410
- # df.loc[:,'BBands-U'], df.loc[:,'BBands-M'], df.loc[:,'BBands-L'] = talib.BBANDS(df.loc[:,'Close'], timeperiod =20)
410
+ # df.loc[:,'BBands-U'], df.loc[:,'BBands-M'], df.loc[:,'BBands-L'] = talib.BBANDS(df.loc[:,"close"], timeperiod =20)
411
411
  # df.loc[:,'BBands-U'] = df.loc[:,'BBands-U'].apply(lambda x: round(x, 2))
412
412
  # df.loc[:,'BBands-M'] = df.loc[:,'BBands-M'].apply(lambda x: round(x, 2))
413
413
  # df.loc[:,'BBands-L'] = df.loc[:,'BBands-L'].apply(lambda x: round(x, 2))
414
- # return df[['Close','BBands-U','BBands-M','BBands-L']]
414
+ # return df[["close",'BBands-U','BBands-M','BBands-L']]
415
415
 
416
416
  # @classmethod
417
417
  # def get_obv_df(self, df):
418
- # if ('Close' not in df.keys()) or ('Volume' not in df.keys()):
418
+ # if ("close" not in df.keys()) or ("volume" not in df.keys()):
419
419
  # return np.nan
420
- # df.loc[:,'OBV'] = talib.OBV(df.loc[:,'Close'], df.loc[:,'Volume'])
420
+ # df.loc[:,'OBV'] = talib.OBV(df.loc[:,"close"], df.loc[:,"volume"])
421
421
  # return df.loc[:,'OBV']
422
422
 
423
423
  # @classmethod
424
424
  # def get_atr_df(self, df):
425
- # df.loc[:,'ATR'] = talib.ATR(df.loc[:,'High'], df.loc[:,'Low'], df.loc[:,'Close'], timeperiod=14).apply(lambda x: round(x, 2))
425
+ # df.loc[:,'ATR'] = talib.ATR(df.loc[:,"high"], df.loc[:,"low"], df.loc[:,"close"], timeperiod=14).apply(lambda x: round(x, 2))
426
426
  # return df.loc[:,'ATR']
427
427
 
428
428
  # @classmethod
429
429
  # def get_natr_df(self, df):
430
- # df.loc[:,'NATR'] = talib.NATR(df.loc[:,'High'], df.loc[:,'Low'], df.loc[:,'Close'], timeperiod=14).apply(lambda x: round(x, 2))
430
+ # df.loc[:,'NATR'] = talib.NATR(df.loc[:,"high"], df.loc[:,"low"], df.loc[:,"close"], timeperiod=14).apply(lambda x: round(x, 2))
431
431
  # return df.loc[:,'NATR']
432
432
 
433
433
  # @classmethod
434
434
  # def get_trange_df(self, df):
435
- # df.loc[:,'TRANGE'] = talib.TRANGE(df.loc[:,'High'], df.loc[:,'Low'], df.loc[:,'Close']).apply(lambda x: round(x, 2))
435
+ # df.loc[:,'TRANGE'] = talib.TRANGE(df.loc[:,"high"], df.loc[:,"low"], df.loc[:,"close"]).apply(lambda x: round(x, 2))
436
436
  # return df.loc[:,'TRANGE']
437
437
 
438
438
  # @classmethod
@@ -443,9 +443,9 @@ class pktalib:
443
443
 
444
444
  # @return: fasts, slows
445
445
  # """
446
- # highs = df.loc[:,'High']
447
- # lows = df.loc[:,'Low']
448
- # closes = df.loc[:,'Close']
446
+ # highs = df.loc[:,"high"]
447
+ # lows = df.loc[:,"low"]
448
+ # closes = df.loc[:,"close"]
449
449
  # slowPeriod=30
450
450
  # fastPeriod=3
451
451
  # atr = self.get_atr_df(df)
@@ -467,7 +467,7 @@ class pktalib:
467
467
  # """
468
468
  # ATR(14)/MA(14)
469
469
  # """
470
- # closes = df.loc[:,'Close']
470
+ # closes = df.loc[:,"close"]
471
471
 
472
472
  # atr = self.get_atr_df(df)
473
473
  # ma = talib.MA(closes, timeperiod=14)
@@ -501,7 +501,7 @@ class pktalib:
501
501
  result = pd.Series(high + 2 * (PP - low))
502
502
  elif pivotPoint == "S3":
503
503
  result = pd.Series(low - 2 * (high - PP))
504
- psr = {'Close':close, 'PP':round(PP,2)}
504
+ psr = {"close":close, 'PP':round(PP,2)}
505
505
  if pivotPoint != "PP" and result is not None:
506
506
  psr[pivotPoint] = round(result,2)
507
507
  with pd.option_context('mode.chained_assignment', None):
@@ -399,7 +399,7 @@ def statScanCalculationForPatterns(*args, **kwargs):
399
399
  return scanResults
400
400
 
401
401
  def ensureColumnsExist(saveResults):
402
- columns = ['Stock', 'Date', 'Volume', 'Trend', 'MA-Signal', 'LTP', '52Wk-H',
402
+ columns = ['Stock', 'Date', "volume", 'Trend', 'MA-Signal', 'LTP', '52Wk-H',
403
403
  '52Wk-L', '1-Pd', '2-Pd', '3-Pd', '4-Pd', '5-Pd', '10-Pd', '15-Pd',
404
404
  '22-Pd', '30-Pd', 'Consol.', 'Breakout', 'RSI', 'Pattern', 'CCI',
405
405
  'LTP1', 'Growth1', 'LTP2', 'Growth2', 'LTP3', 'Growth3', 'LTP4',
@@ -423,7 +423,7 @@ def cleanupData(savedResults):
423
423
 
424
424
  saveResults["LTP"] = saveResults["LTP"].astype(float).fillna(0.0)
425
425
  saveResults["RSI"] = saveResults["RSI"].astype(float).fillna(0.0)
426
- saveResults.loc[:, "Volume"] = saveResults.loc[:, "Volume"].apply(
426
+ saveResults.loc[:, "volume"] = saveResults.loc[:, "volume"].apply(
427
427
  lambda x: x.replace("x", "")
428
428
  )
429
429
  if f"Trend({configManager.daysToLookback}Prds)" not in saveResults.columns:
@@ -455,7 +455,7 @@ def cleanupData(savedResults):
455
455
  ].apply(lambda x: x.replace("(Potential)", "") if x is not None else x)
456
456
  saveResults["Breakout"] = saveResults["Breakout"].astype(float).fillna(0.0)
457
457
  saveResults["Resistance"] = saveResults["Resistance"].astype(float).fillna(0.0)
458
- saveResults["Volume"] = saveResults["Volume"].astype(float).fillna(0.0)
458
+ saveResults["volume"] = saveResults["volume"].astype(float).fillna(0.0)
459
459
  saveResults[f"Consol."] = (
460
460
  saveResults[f"Consol."].astype(float).fillna(0.0)
461
461
  )
@@ -1036,13 +1036,13 @@ def filterMASignalResist(df):
1036
1036
  def filterVolumeLessThan25(df):
1037
1037
  if df is None:
1038
1038
  return None
1039
- return df[df["Volume"] < 2.5].fillna(0.0)
1039
+ return df[df["volume"] < 2.5].fillna(0.0)
1040
1040
 
1041
1041
 
1042
1042
  def filterVolumeMoreThan25(df):
1043
1043
  if df is None:
1044
1044
  return None
1045
- return df[df["Volume"] >= 2.5].fillna(0.0)
1045
+ return df[df["volume"] >= 2.5].fillna(0.0)
1046
1046
 
1047
1047
 
1048
1048
  def filterConsolidating10Percent(df):