analyser_hj3415 4.0.3__py3-none-any.whl → 4.0.5__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.
- analyser_hj3415/analyser/tsa/common.py +12 -0
- analyser_hj3415/analyser/tsa/lstm.py +10 -5
- analyser_hj3415/analyser/tsa/prophet.py +17 -32
- {analyser_hj3415-4.0.3.dist-info → analyser_hj3415-4.0.5.dist-info}/METADATA +1 -1
- {analyser_hj3415-4.0.3.dist-info → analyser_hj3415-4.0.5.dist-info}/RECORD +7 -7
- {analyser_hj3415-4.0.3.dist-info → analyser_hj3415-4.0.5.dist-info}/WHEEL +0 -0
- {analyser_hj3415-4.0.3.dist-info → analyser_hj3415-4.0.5.dist-info}/entry_points.txt +0 -0
@@ -1,4 +1,6 @@
|
|
1
1
|
import numpy as np
|
2
|
+
import pandas as pd
|
3
|
+
from marshmallow import fields
|
2
4
|
|
3
5
|
|
4
6
|
def is_up_by_OLS(data: dict) -> bool:
|
@@ -31,3 +33,13 @@ def is_up_by_OLS(data: dict) -> bool:
|
|
31
33
|
|
32
34
|
# 4) 기울기가 양수면 "우상향 추세"로 판별
|
33
35
|
return slope > 0
|
36
|
+
|
37
|
+
|
38
|
+
class PandasTimestampField(fields.DateTime):
|
39
|
+
"""pandas.Timestamp를 ISO 8601 문자열로 직렬화하고 역직렬화하는 필드"""
|
40
|
+
|
41
|
+
def _serialize(self, value, attr, obj, **kwargs):
|
42
|
+
return value.isoformat() if isinstance(value, pd.Timestamp) else None
|
43
|
+
|
44
|
+
def _deserialize(self, value, attr, data, **kwargs):
|
45
|
+
return pd.Timestamp(value)
|
@@ -1,6 +1,5 @@
|
|
1
1
|
import os
|
2
2
|
import numpy as np
|
3
|
-
import pandas
|
4
3
|
import yfinance as yf
|
5
4
|
from datetime import datetime, timedelta
|
6
5
|
import pandas as pd
|
@@ -11,11 +10,13 @@ from tensorflow.keras.layers import LSTM, Dense, Dropout # type: ignore
|
|
11
10
|
from tensorflow.keras.callbacks import EarlyStopping # type: ignore
|
12
11
|
from tensorflow.keras import Input # type: ignore
|
13
12
|
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
|
14
|
-
from dataclasses import dataclass
|
13
|
+
from dataclasses import dataclass, field
|
14
|
+
from marshmallow import fields
|
15
15
|
|
16
16
|
from utils_hj3415 import tools, setup_logger
|
17
17
|
from db_hj3415 import myredis
|
18
18
|
from analyser_hj3415.analyser import MIs, tsa
|
19
|
+
from analyser_hj3415.analyser.tsa.common import PandasTimestampField
|
19
20
|
|
20
21
|
mylogger = setup_logger(__name__,'INFO')
|
21
22
|
expire_time = tools.to_int(os.getenv('DEFAULT_EXPIRE_TIME_H', 48)) * 3600
|
@@ -76,9 +77,13 @@ class LSTMGrade:
|
|
76
77
|
@dataclass
|
77
78
|
class LSTMChartData:
|
78
79
|
ticker: str
|
79
|
-
|
80
|
-
|
81
|
-
|
80
|
+
|
81
|
+
labels: List[pd.Timestamp] = field(metadata={"marshmallow_field": fields.List(PandasTimestampField())})
|
82
|
+
prices: List[Dict[pd.Timestamp, float]] = field(
|
83
|
+
metadata={"marshmallow_field": fields.List(fields.Dict(keys=PandasTimestampField(), values=fields.Float()))})
|
84
|
+
future_prices: List[Dict[pd.Timestamp, float]] = field(
|
85
|
+
metadata={"marshmallow_field": fields.List(fields.Dict(keys=PandasTimestampField(), values=fields.Float()))})
|
86
|
+
|
82
87
|
grade: LSTMGrade
|
83
88
|
num: int
|
84
89
|
is_lstm_up: bool
|
@@ -2,19 +2,20 @@ from collections import OrderedDict
|
|
2
2
|
from datetime import datetime, timedelta
|
3
3
|
from typing import Tuple, List, Dict, Union
|
4
4
|
|
5
|
-
import pandas
|
6
5
|
import pickle
|
7
6
|
import yfinance as yf
|
8
7
|
import pandas as pd
|
9
8
|
from prophet import Prophet
|
10
9
|
from sklearn.preprocessing import StandardScaler
|
11
|
-
from dataclasses import dataclass
|
10
|
+
from dataclasses import dataclass, field
|
11
|
+
from marshmallow import fields
|
12
12
|
import os
|
13
13
|
|
14
14
|
from utils_hj3415 import tools, setup_logger
|
15
15
|
from db_hj3415 import myredis
|
16
16
|
|
17
17
|
from analyser_hj3415.analyser import eval, MIs, tsa
|
18
|
+
from analyser_hj3415.analyser.tsa.common import PandasTimestampField
|
18
19
|
|
19
20
|
|
20
21
|
mylogger = setup_logger(__name__,'INFO')
|
@@ -34,15 +35,20 @@ class ProphetLatestData:
|
|
34
35
|
trading_action: str = ''
|
35
36
|
score: int = None
|
36
37
|
|
38
|
+
|
37
39
|
@dataclass
|
38
40
|
class ProphetChartData:
|
39
41
|
ticker: str
|
40
42
|
|
41
|
-
labels: List[
|
42
|
-
prices: List[Dict[
|
43
|
-
|
44
|
-
|
45
|
-
|
43
|
+
labels: List[pd.Timestamp] = field(metadata={"marshmallow_field": fields.List(PandasTimestampField())})
|
44
|
+
prices: List[Dict[pd.Timestamp, float]] = field(
|
45
|
+
metadata={"marshmallow_field": fields.List(fields.Dict(keys=PandasTimestampField(), values=fields.Float()))})
|
46
|
+
yhats: List[Dict[pd.Timestamp, float]] = field(
|
47
|
+
metadata={"marshmallow_field": fields.List(fields.Dict(keys=PandasTimestampField(), values=fields.Float()))})
|
48
|
+
yhat_uppers: List[Dict[pd.Timestamp, float]] = field(
|
49
|
+
metadata={"marshmallow_field": fields.List(fields.Dict(keys=PandasTimestampField(), values=fields.Float()))})
|
50
|
+
yhat_lowers: List[Dict[pd.Timestamp, float]] = field(
|
51
|
+
metadata={"marshmallow_field": fields.List(fields.Dict(keys=PandasTimestampField(), values=fields.Float()))})
|
46
52
|
|
47
53
|
is_prophet_up: bool
|
48
54
|
|
@@ -133,7 +139,6 @@ class MyProphet:
|
|
133
139
|
|
134
140
|
# ds 열에서 타임존 제거
|
135
141
|
df['ds'] = df['ds'].dt.tz_localize(None)
|
136
|
-
|
137
142
|
# 추가 변수를 정규화
|
138
143
|
df['volume_scaled'] = self.scaler.fit_transform(df[['volume']])
|
139
144
|
mylogger.debug('_preprocessing_for_prophet')
|
@@ -176,6 +181,7 @@ class MyProphet:
|
|
176
181
|
self.model = Prophet()
|
177
182
|
|
178
183
|
self.raw_data = get_raw_data()
|
184
|
+
mylogger.debug(self.raw_data)
|
179
185
|
self.df_real = preprocessing_for_prophet()
|
180
186
|
self.df_forecast = make_forecast()
|
181
187
|
|
@@ -279,7 +285,8 @@ class MyProphet:
|
|
279
285
|
f"redisname: '{redis_name}' / refresh : {refresh} / expire_time : {expire_time / 3600}h")
|
280
286
|
|
281
287
|
def fetch_generate_prophet_chart_data() -> ProphetChartData:
|
282
|
-
|
288
|
+
mylogger.debug(f'initialized: {self.initialized}')
|
289
|
+
if not self.initialized:
|
283
290
|
self.initializing()
|
284
291
|
|
285
292
|
# 날짜를 기준으로 합치기 (outer join)
|
@@ -294,7 +301,7 @@ class MyProphet:
|
|
294
301
|
yhats=[{"x": ds, "y": yhat} for ds, yhat in zip(merged_df["ds"], merged_df["yhat"])], # type: ignore
|
295
302
|
yhat_uppers=[{"x": ds, "y": yhat_upper} for ds, yhat_upper in zip(merged_df["ds"], merged_df["yhat_upper"])], # type: ignore
|
296
303
|
yhat_lowers=[{"x": ds, "y": yhat_lower} for ds, yhat_lower in zip(merged_df["ds"], merged_df["yhat_lower"])], # type: ignore
|
297
|
-
is_prophet_up=self.
|
304
|
+
is_prophet_up=tsa.common.is_up_by_OLS(self.df_forecast.set_index('ds')['yhat'].to_dict()),
|
298
305
|
)
|
299
306
|
return data
|
300
307
|
|
@@ -302,28 +309,6 @@ class MyProphet:
|
|
302
309
|
timer=expire_time)
|
303
310
|
return prophet_chart_data
|
304
311
|
|
305
|
-
def is_prophet_up(self, refresh: bool) -> bool:
|
306
|
-
"""
|
307
|
-
Prophet 예측이 상승 추세인지 여부를 확인합니다.
|
308
|
-
|
309
|
-
매개변수:
|
310
|
-
refresh (bool): 데이터를 새로 생성할지 여부.
|
311
|
-
|
312
|
-
반환값:
|
313
|
-
bool: 상승 추세 여부.
|
314
|
-
"""
|
315
|
-
mylogger.debug("**** Caching is_prophet_up ... ****")
|
316
|
-
redis_name = f'{self.ticker}_is_prophet_up'
|
317
|
-
mylogger.info(f"redisname: '{redis_name}' / expire_time : {expire_time / 3600}h")
|
318
|
-
|
319
|
-
def fetch_is_prophet_up():
|
320
|
-
if self.initialized:
|
321
|
-
self.initializing()
|
322
|
-
yhat_dict = self.df_forecast.set_index('ds')['yhat'].to_dict()
|
323
|
-
return tsa.common.is_up_by_OLS(yhat_dict)
|
324
|
-
|
325
|
-
return myredis.Base.fetch_and_cache_data(redis_name, refresh, fetch_is_prophet_up, timer=expire_time)
|
326
|
-
|
327
312
|
@staticmethod
|
328
313
|
def is_valid_date(date_string):
|
329
314
|
"""
|
@@ -8,10 +8,10 @@ analyser_hj3415/analyser/eval/growth.py,sha256=sfJ7h06efrTfL4ylhUCV525IzUzilbun1
|
|
8
8
|
analyser_hj3415/analyser/eval/mil.py,sha256=mFMiFCuCBvlQrhQcM5hMg8U4zF32TS1GnUmk8fPd950,15178
|
9
9
|
analyser_hj3415/analyser/eval/red.py,sha256=b-Odud8pxQIO2NjI7m3HbK4FOND5WhaoYV94mCHqDPo,13907
|
10
10
|
analyser_hj3415/analyser/tsa/__init__.py,sha256=pg20ZQRABedTdaIoOr5t043RNKtJ7ji_WmnZrD1IhPg,147
|
11
|
-
analyser_hj3415/analyser/tsa/common.py,sha256=
|
12
|
-
analyser_hj3415/analyser/tsa/lstm.py,sha256=
|
13
|
-
analyser_hj3415/analyser/tsa/prophet.py,sha256=
|
14
|
-
analyser_hj3415-4.0.
|
15
|
-
analyser_hj3415-4.0.
|
16
|
-
analyser_hj3415-4.0.
|
17
|
-
analyser_hj3415-4.0.
|
11
|
+
analyser_hj3415/analyser/tsa/common.py,sha256=fDzHf-j1S7JIDEFpfn-ogr5sCBM3TCq88BygAlY2HbU,1397
|
12
|
+
analyser_hj3415/analyser/tsa/lstm.py,sha256=v1I9vxPQfA_Y8eAlJ5BGflOlEz87uFUnGwCI5bB27Fc,28388
|
13
|
+
analyser_hj3415/analyser/tsa/prophet.py,sha256=AwXvdCQAv9mHa1SSS6FfeJAqcWKToJxmAZ_qRtr0ibk,18269
|
14
|
+
analyser_hj3415-4.0.5.dist-info/entry_points.txt,sha256=ZfjPnJuH8SzvhE9vftIPMBIofsc65IAWYOhqOC_L5ck,65
|
15
|
+
analyser_hj3415-4.0.5.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
|
16
|
+
analyser_hj3415-4.0.5.dist-info/METADATA,sha256=JlaHA44xer9S53VnI60NaUbhSMWDd-n8PR-HuWuFjMY,6777
|
17
|
+
analyser_hj3415-4.0.5.dist-info/RECORD,,
|
File without changes
|
File without changes
|