analyser_hj3415 4.1.0__py3-none-any.whl → 4.1.2__py3-none-any.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.
@@ -1,12 +1,13 @@
1
1
  import os
2
2
  from dataclasses import dataclass
3
- from typing import Tuple
3
+ from typing import Tuple, List, Dict
4
4
  import math
5
5
 
6
6
  from utils_hj3415 import tools, setup_logger
7
7
  from db_hj3415 import myredis, mymongo
8
8
 
9
9
  from analyser_hj3415.analyser.eval.common import Tools
10
+ import pickle
10
11
 
11
12
 
12
13
  mylogger = setup_logger(__name__,'INFO')
@@ -85,6 +86,9 @@ class Mil:
85
86
  name (str): 기업명.
86
87
  _code (str): 기업 종목 코드.
87
88
  """
89
+
90
+ REDIS_MIL_DATA_SUFFIX = "mil_data"
91
+
88
92
  def __init__(self, code: str):
89
93
  assert tools.is_6digit(code), f'Invalid value : {code}'
90
94
  mylogger.debug(f"Mil : 종목코드 ({code})")
@@ -299,15 +303,15 @@ class Mil:
299
303
  return [0,]
300
304
 
301
305
  def _generate_data(self, refresh: bool) -> MilData:
302
- mylogger.info(f"In generate_data..refresh : {refresh}")
306
+ mylogger.debug(f"In generate_data..refresh : {refresh}")
303
307
  시가총액_억 = self.get_marketcap억(refresh)
304
- mylogger.info(f"{self} 시가총액(억) : {시가총액_억}")
308
+ mylogger.debug(f"{self} 시가총액(억) : {시가총액_억}")
305
309
 
306
310
  d1, 주주수익률, 재무활동현금흐름 = self._calc주주수익률(시가총액_억, refresh)
307
- mylogger.info(f"{self} 주주수익률 : {주주수익률}, {d1}")
311
+ mylogger.debug(f"{self} 주주수익률 : {주주수익률}, {d1}")
308
312
 
309
313
  d2, 이익지표, 영업활동현금흐름, 지배주주당기순이익 = self._calc이익지표(시가총액_억, refresh)
310
- mylogger.info(f"{self} 이익지표 : {이익지표}, {d2}")
314
+ mylogger.debug(f"{self} 이익지표 : {이익지표}, {d2}")
311
315
 
312
316
  d3, roic_r, roic_dict, roe_r, roe106, roa_r = self._calc투자수익률(refresh)
313
317
  d4, fcf_dict, pfcf_dict, pcr_dict = self._calc가치지표(시가총액_억, refresh)
@@ -364,10 +368,57 @@ class Mil:
364
368
  로그:
365
369
  - 캐시 검색 상태와 새로 생성된 데이터를 출력합니다.
366
370
  """
367
- redis_name = f"{self.code}_mil"
371
+ redis_name = f"{self.code}_{self.REDIS_MIL_DATA_SUFFIX}"
368
372
  mylogger.debug(f"{self} redisname: '{redis_name}' / refresh : {refresh} / expire_time : {expire_time/3600}h")
369
373
 
370
374
  def fetch_generate_data(refresh_in: bool) -> dict:
371
375
  return self._generate_data(refresh_in) # type: ignore
372
376
 
373
- return myredis.Base.fetch_and_cache_data(redis_name, refresh, fetch_generate_data, refresh, timer=expire_time)
377
+ return myredis.Base.fetch_and_cache_data(redis_name, refresh, fetch_generate_data, refresh, timer=expire_time)
378
+
379
+ @classmethod
380
+ def bulk_generate_data(cls, codes: List[str], refresh: bool) -> Dict[str, MilData]:
381
+ # --- (1) 파이프라인 GET ---
382
+ pipe = myredis.Base.redis_client.pipeline()
383
+ redis_keys = [f"{code}_{cls.REDIS_MIL_DATA_SUFFIX}" for code in codes]
384
+ for redis_key in redis_keys:
385
+ pipe.get(redis_key)
386
+ results_from_redis = pipe.execute() # [val1, val2, ...]
387
+
388
+ final_results = {}
389
+ missing_codes = []
390
+
391
+ # refresh=True 이면 기존 데이터 무시하고 다시 계산해야 하므로 모두 missing 처리
392
+ if refresh:
393
+ missing_codes = codes[:]
394
+ else:
395
+ # refresh=False 이면, Redis 값이 None인 티커만 다시 계산
396
+ for code, val in zip(codes, results_from_redis):
397
+ if val is None:
398
+ missing_codes.append(code)
399
+ else:
400
+ # Redis에 pickled 데이터가 있다면 언피클해서 담기
401
+ red_data = pickle.loads(val)
402
+ final_results[code] = red_data
403
+
404
+ # --- (2) 필요한 티커만 직접 연산 ---
405
+ newly_computed_data = {}
406
+ for code in missing_codes:
407
+ mylogger.debug(f"*** bulk_generate_data : {code}")
408
+ data = cls(code)._generate_data(refresh=True)
409
+ newly_computed_data[code] = data
410
+
411
+ # --- (3) 파이프라인 SET ---
412
+ if newly_computed_data:
413
+ pipe = myredis.Base.redis_client.pipeline()
414
+ for code, data in newly_computed_data.items():
415
+ redis_key = f"{code}_{cls.REDIS_MIL_DATA_SUFFIX}"
416
+ # ProphetLatestData 객체를 pickle로 직렬화
417
+ pickled_data = pickle.dumps(data)
418
+ # SET + expire_time
419
+ pipe.setex(redis_key, expire_time, pickled_data)
420
+ pipe.execute()
421
+
422
+ # 최종 결과 딕셔너리 (캐시에 있었던 것 + 새로 만든 것)
423
+ final_results.update(newly_computed_data)
424
+ return final_results
@@ -306,7 +306,7 @@ class Red:
306
306
  newly_computed_data = {}
307
307
  for code in missing_codes:
308
308
  mylogger.debug(f"*** bulk_generate_data : {code}")
309
- data = cls(code, expect_earn)._generate_data(refresh=refresh)
309
+ data = cls(code, expect_earn)._generate_data(refresh=True)
310
310
  newly_computed_data[code] = data
311
311
 
312
312
  # --- (3) 파이프라인 SET ---
@@ -17,7 +17,6 @@ from utils_hj3415 import tools, setup_logger
17
17
  from db_hj3415 import myredis
18
18
  from analyser_hj3415.analyser import MIs, tsa
19
19
  from analyser_hj3415.analyser.tsa.common import PandasTimestampField, ChartPoint
20
- import pickle
21
20
 
22
21
  mylogger = setup_logger(__name__,'INFO')
23
22
  expire_time = tools.to_int(os.getenv('DEFAULT_EXPIRE_TIME_H', 48)) * 3600
@@ -557,24 +556,12 @@ class MyLSTM:
557
556
 
558
557
  @staticmethod
559
558
  def bulk_get_chart_data(tickers: List[str]) -> Dict[str, Optional[LSTMChartData]]:
560
- # --- (1) 파이프라인 GET ---
561
- pipe = myredis.Base.redis_client.pipeline()
562
559
  redis_keys = [f"{ticker}_{MyLSTM.REDIS_LSTM_DATA_SUFFIX}" for ticker in tickers]
563
- for redis_key in redis_keys:
564
- pipe.get(redis_key)
565
- results_from_redis = pipe.execute() # [val1, val2, ...]
566
-
567
- final_results = {}
568
-
569
- for ticker, val in zip(tickers, results_from_redis):
570
- if val is None:
571
- final_results[ticker] = None
572
- else:
573
- # Redis에 pickled 데이터가 있다면 언피클해서 담기
574
- lstm_data = pickle.loads(val)
575
- final_results[ticker] = lstm_data
576
-
577
- return final_results
560
+ redis_key_data = myredis.Base.bulk_get_data(redis_keys)
561
+ ticker_data = {}
562
+ for redis_key, data in redis_key_data.items():
563
+ ticker_data[redis_key.split('_')[0]] = data
564
+ return ticker_data
578
565
 
579
566
  @staticmethod
580
567
  def caching_chart_data(tickers:list, num:int):
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: analyser_hj3415
3
- Version: 4.1.0
3
+ Version: 4.1.2
4
4
  Summary: Stock analyser and database processing programs
5
5
  Requires-Python: >=3.6
6
6
  Description-Content-Type: text/markdown
7
7
  Requires-Dist: utils-hj3415>=3.0.10
8
- Requires-Dist: db-hj3415>=4.3.5
8
+ Requires-Dist: db-hj3415>=4.4.0
9
9
  Requires-Dist: scikit-learn>=1.5.2
10
10
  Requires-Dist: plotly>=5.24.1
11
11
  Requires-Dist: yfinance>=0.2.44
@@ -5,13 +5,13 @@ analyser_hj3415/analyser/eval/__init__.py,sha256=IP1d0Q3nOCAD3zK1qxrC685MkJQfUh-
5
5
  analyser_hj3415/analyser/eval/blue.py,sha256=p5JPwkQYoO0dsOe3VnfMV3pOWLzNsAFvLCUK56f85Xo,10782
6
6
  analyser_hj3415/analyser/eval/common.py,sha256=sNXapoofShA43ww_SLjXmIjkrAr1AhAcezdaN_X_3Us,11443
7
7
  analyser_hj3415/analyser/eval/growth.py,sha256=tlHxLx4u5h7bNG0T8ViJujX20QllfrSaBl-TBqFNkEs,6362
8
- analyser_hj3415/analyser/eval/mil.py,sha256=uaS7MHNlytrjEgdLc9S1zhXb5bzVAwlSMlnQWop2Hbw,15017
9
- analyser_hj3415/analyser/eval/red.py,sha256=DZBV0qMzWD8KGvAbdxrohCVT0a5luduuhKQoN3OtNwc,13909
8
+ analyser_hj3415/analyser/eval/mil.py,sha256=aSEqlpytkI0A5_jZKOFLUbPgXc-WiKJUVDZuyI_L3fI,17147
9
+ analyser_hj3415/analyser/eval/red.py,sha256=1wbZWFBWQjnnE4uQQVE34Wfl2YXePzJ2yqKmfLxicoc,13906
10
10
  analyser_hj3415/analyser/tsa/__init__.py,sha256=pg20ZQRABedTdaIoOr5t043RNKtJ7ji_WmnZrD1IhPg,147
11
11
  analyser_hj3415/analyser/tsa/common.py,sha256=ZLUkifupOlLKsrPiqR3y6FaEN4M_loZhxCZXYxkX0us,1874
12
- analyser_hj3415/analyser/tsa/lstm.py,sha256=X59xHpMxEaR95Tf9OIdBT4KXFTMAwZF-_s0CMHRCTk0,29401
12
+ analyser_hj3415/analyser/tsa/lstm.py,sha256=oENuJyyo6U9MMn4UF4ZauGai51_dJisMSUNBiH8udXo,28998
13
13
  analyser_hj3415/analyser/tsa/prophet.py,sha256=a8XPiikRFbqHjbDT7C3hK5RsqOp5JyAbY7lDFNQfBzM,17884
14
- analyser_hj3415-4.1.0.dist-info/entry_points.txt,sha256=ZfjPnJuH8SzvhE9vftIPMBIofsc65IAWYOhqOC_L5ck,65
15
- analyser_hj3415-4.1.0.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
16
- analyser_hj3415-4.1.0.dist-info/METADATA,sha256=cVVNfXeU__3S1w621s_3t71x6DIQpg967nhc1Wj-4oM,6777
17
- analyser_hj3415-4.1.0.dist-info/RECORD,,
14
+ analyser_hj3415-4.1.2.dist-info/entry_points.txt,sha256=ZfjPnJuH8SzvhE9vftIPMBIofsc65IAWYOhqOC_L5ck,65
15
+ analyser_hj3415-4.1.2.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
16
+ analyser_hj3415-4.1.2.dist-info/METADATA,sha256=JxwlkMpOKXNToZlcgU0NL0cI8jZbl_EZMtwhnh-wy7w,6777
17
+ analyser_hj3415-4.1.2.dist-info/RECORD,,