neurostats-API 1.0.2rc3__py3-none-any.whl → 1.0.3rc1__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,4 +1,4 @@
1
- __version__='1.0.2rc3'
1
+ __version__='1.0.3rc1'
2
2
 
3
3
  from .fetchers import (
4
4
  AgentFinanceOverviewFetcher,
@@ -26,5 +26,6 @@ from .async_mode import (
26
26
  AsyncTWSEInstitutionFetcher,
27
27
  AsyncTWSEMarginFetcher,
28
28
  AsyncTWSEStatsValueFetcher,
29
- AsyncUSCelebrityFetcher
29
+ AsyncUSCelebrityFetcher,
30
+ AsyncBatchTechFetcher
30
31
  )
@@ -5,10 +5,12 @@ from .fetchers import (
5
5
  AsyncFinanceOverviewFetcher,
6
6
  AsyncMonthlyRevenueFetcher,
7
7
  AsyncProfitLoseFetcher,
8
+ AsyncTEJChipFetcher,
8
9
  AsyncTechFetcher,
9
10
  AsyncTEJSeasonalFetcher,
10
11
  AsyncTWSEInstitutionFetcher,
11
12
  AsyncTWSEMarginFetcher,
12
13
  AsyncTWSEStatsValueFetcher,
13
- AsyncUSCelebrityFetcher
14
+ AsyncUSCelebrityFetcher,
15
+ AsyncBatchTechFetcher
14
16
  )
@@ -1,11 +1,13 @@
1
1
  from .daily import (
2
+ AsyncTEJDailyChipDBExtractor,
2
3
  AsyncTEJDailyTechDBExtractor,
3
4
  AsyncYFDailyTechDBExtractor,
4
5
  AsyncDailyValueDBExtractor,
5
6
  AsyncTEJDailyValueDBExtractor,
6
7
  AsyncTWSEChipDBExtractor,
7
8
  AsyncUS_F13DBExtractor,
8
- AsyncUS_CelebrityDBExtractor
9
+ AsyncUS_CelebrityDBExtractor,
10
+ AsyncBatchTechDBExtractor
9
11
  )
10
12
 
11
13
  from .month_revenue import (
@@ -1,4 +1,5 @@
1
- from .tej_tech import AsyncTEJDailyTechDBExtractor
1
+ from .tej_chip import AsyncTEJDailyChipDBExtractor
2
+ from .tej_tech import AsyncTEJDailyTechDBExtractor, AsyncBatchTechDBExtractor
2
3
  from .twse_chip import AsyncTWSEChipDBExtractor
3
4
  from .value import (
4
5
  AsyncDailyValueDBExtractor,
@@ -1,5 +1,5 @@
1
1
  from .base import BaseDailyTechDBExtractor
2
-
2
+ from pymongo import AsyncMongoClient, ASCENDING, DESCENDING
3
3
 
4
4
  class AsyncTEJDailyTechDBExtractor(BaseDailyTechDBExtractor):
5
5
 
@@ -10,3 +10,77 @@ class AsyncTEJDailyTechDBExtractor(BaseDailyTechDBExtractor):
10
10
  self.collection_name_map = {"tw": "TEJ_share_price"}
11
11
 
12
12
  return self.collection_name_map.get(self.zone, None)
13
+
14
+ class AsyncBatchTechDBExtractor(BaseDailyTechDBExtractor):
15
+
16
+ def __init__(self, ticker:list, client: AsyncMongoClient, zone:str):
17
+ self.tickers = ticker
18
+ self.zone = zone
19
+ self.client = client
20
+
21
+ self.collection_map = {
22
+ 'tw':{
23
+ 'db': "company_test",
24
+ 'collection': "twse_daily_share_price"
25
+ },
26
+ 'us':{
27
+ 'db': "company_us",
28
+ 'collection': "us_technical"
29
+ },
30
+ }
31
+
32
+ db_name = self.collection_map.get(self.zone).get('db')
33
+ collection_name = self.collection_map.get(self.zone).get('collection')
34
+ self.collection = self.client.get_database(db_name).get_collection(collection_name)
35
+
36
+ def _prepare_query(
37
+ self, start_date=None, end_date=None, get_latest=False
38
+ ):
39
+ query = {"ticker":{"$in": self.tickers}}
40
+
41
+ if start_date:
42
+ start_date = self._transform_date(start_date)
43
+ if end_date:
44
+ end_date = self._transform_date(end_date)
45
+
46
+ if start_date or end_date:
47
+ date_range = {}
48
+ if start_date:
49
+ date_range["$gte"] = start_date
50
+ if end_date:
51
+ date_range["$lte"] = end_date
52
+ query["date"] = date_range
53
+
54
+ projection = {
55
+ "_id": 0,
56
+ "ticker": 1,
57
+ "date": 1,
58
+ "open": 1,
59
+ "high": 1,
60
+ "low": 1,
61
+ "close": 1,
62
+ "volume": 1
63
+ }
64
+
65
+ if (get_latest):
66
+ sort = [("date", DESCENDING)]
67
+ else:
68
+ sort = [("date", ASCENDING)]
69
+
70
+ return query, projection, sort
71
+
72
+ async def query_data(
73
+ self, start_date=None, end_date=None, get_latest=False
74
+ ):
75
+ query, projection, sort = self._prepare_query(
76
+ start_date=start_date, end_date=end_date, get_latest=get_latest
77
+ )
78
+
79
+ if (get_latest):
80
+ cursor = self.collection.find(query, projection).sort(sort).limit(1)
81
+ else:
82
+ cursor = self.collection.find(query, projection).sort(sort)
83
+
84
+ fetched_data = [data async for data in cursor]
85
+
86
+ return fetched_data
@@ -2,10 +2,11 @@ from typing import Type, TypedDict, Optional
2
2
  from neurostats_API.async_mode.db_extractors import (
3
3
  AsyncTEJDailyTechDBExtractor, AsyncYFDailyTechDBExtractor,
4
4
  AsyncDailyValueDBExtractor, AsyncTEJDailyValueDBExtractor,
5
- AsyncTWSEChipDBExtractor, AsyncTWSEMonthlyRevenueExtractor,
6
- AsyncBalanceSheetExtractor, AsyncProfitLoseExtractor,
7
- AsyncCashFlowExtractor, AsyncTEJFinanceStatementDBExtractor,
8
- AsyncTEJSelfSettlementDBExtractor, AsyncUS_F13DBExtractor
5
+ AsyncTEJDailyChipDBExtractor, AsyncTWSEChipDBExtractor,
6
+ AsyncTWSEMonthlyRevenueExtractor, AsyncBalanceSheetExtractor,
7
+ AsyncProfitLoseExtractor, AsyncCashFlowExtractor,
8
+ AsyncTEJFinanceStatementDBExtractor, AsyncTEJSelfSettlementDBExtractor,
9
+ AsyncUS_F13DBExtractor
9
10
  )
10
11
  from neurostats_API.utils import NotSupportedError
11
12
 
@@ -92,6 +93,16 @@ EXTRACTOR_MAP: dict[str, ExtractorConfig] = {
92
93
  開高低收
93
94
  """
94
95
  },
96
+ "TEJ_Chip": {
97
+ "class_":
98
+ AsyncTEJDailyChipDBExtractor,
99
+ "default_kwargs": {},
100
+ "description":
101
+ """
102
+ DB_collection: TEJ_chip
103
+ TWSE的評價面
104
+ """
105
+ },
95
106
  "TEJ_tech": {
96
107
  "class_":
97
108
  AsyncTEJDailyTechDBExtractor,
@@ -140,8 +151,6 @@ EXTRACTOR_MAP: dict[str, ExtractorConfig] = {
140
151
  TWSE的評價面
141
152
  """
142
153
  },
143
-
144
-
145
154
  "US_Chip_F13": {
146
155
  "class_":
147
156
  AsyncUS_F13DBExtractor,
@@ -151,7 +160,7 @@ EXTRACTOR_MAP: dict[str, ExtractorConfig] = {
151
160
  DB_collection: "us_F13_flat"
152
161
  US籌碼面(F13)
153
162
  """
154
- },
163
+ }
155
164
  }
156
165
 
157
166
 
@@ -1,11 +1,11 @@
1
1
  from .balance_sheet import AsyncBalanceSheetFetcher
2
2
  from .cash_flow import AsyncCashFlowFetcher
3
3
  from .finance_overview import AsyncFinanceOverviewFetcher, AsyncAgentOverviewFetcher
4
- from .tech import AsyncTechFetcher
4
+ from .tech import AsyncTechFetcher, AsyncBatchTechFetcher
5
5
  from .twse_institution import AsyncTWSEInstitutionFetcher
6
6
  from .twse_margin import AsyncTWSEMarginFetcher
7
7
  from .month_revenue import AsyncMonthlyRevenueFetcher
8
8
  from .profit_lose import AsyncProfitLoseFetcher
9
9
  from .value import AsyncTWSEStatsValueFetcher
10
- from .tej import AsyncTEJDailyTechFetcher, AsyncTEJSeasonalFetcher
10
+ from .tej import AsyncTEJChipFetcher, AsyncTEJDailyTechFetcher, AsyncTEJSeasonalFetcher
11
11
  from .us_chip import AsyncUSChipF13Fetcher, AsyncUSCelebrityFetcher
@@ -1,16 +1,17 @@
1
1
  from .base import AsyncBaseFetcher
2
2
  from datetime import datetime
3
3
  from ..db_extractors import (
4
- AsyncYFDailyTechDBExtractor, AsyncTEJDailyTechDBExtractor
4
+ AsyncYFDailyTechDBExtractor, AsyncTEJDailyTechDBExtractor,
5
+ AsyncBatchTechDBExtractor
5
6
  )
6
7
  from neurostats_API.async_mode.factory import get_extractor
7
- from neurostats_API.transformers import DailyTechTransformer
8
+ from neurostats_API.transformers import DailyTechTransformer, BatchTechTransformer
8
9
  from neurostats_API.utils import NotSupportedError
9
10
  import pandas as pd
10
11
  from pytz import timezone
11
12
  from neurostats_API.utils import StatsDateTime
12
13
  import yfinance as yf
13
-
14
+ from pymongo import AsyncMongoClient
14
15
 
15
16
  class AsyncTechFetcher(AsyncBaseFetcher):
16
17
 
@@ -208,3 +209,29 @@ class AsyncTechFetcher(AsyncBaseFetcher):
208
209
  df = pd.DataFrame(columns=self.required_cols)
209
210
 
210
211
  return df
212
+
213
+ class AsyncBatchTechFetcher(AsyncBaseFetcher):
214
+ def __init__(
215
+ self, client:AsyncMongoClient, tickers:list,
216
+ zone:str, strftime: str = "%Y-%m-%d"
217
+ ):
218
+ super().__init__()
219
+ self.tickers = tickers
220
+ self.zone = zone
221
+ self.extractor = AsyncBatchTechDBExtractor(
222
+ ticker=self.tickers, client=client, zone=zone
223
+ )
224
+ self.transformer = BatchTechTransformer(strftime=strftime)
225
+
226
+ async def query_data(
227
+ self, start_date=None, end_date=None, get_latest=False,
228
+ ):
229
+ fetched_data = await self.extractor.query_data(
230
+ start_date, end_date, get_latest,
231
+ )
232
+
233
+ transformed_data = self.transformer.process_transform(
234
+ fetched_datas = list(fetched_data),
235
+ )
236
+
237
+ return transformed_data
@@ -1,2 +1,3 @@
1
+ from .chip import AsyncTEJChipFetcher
1
2
  from .seasonal_data import AsyncTEJSeasonalFetcher
2
3
  from .tech import AsyncTEJDailyTechFetcher
@@ -0,0 +1,42 @@
1
+ from datetime import datetime
2
+
3
+ from neurostats_API.async_mode.fetchers.base import AsyncBaseFetcher
4
+
5
+ from neurostats_API.async_mode.factory import get_extractor
6
+ from neurostats_API.transformers import TEJChipTransformer
7
+ from neurostats_API.utils import NotSupportedError
8
+
9
+ class AsyncTEJChipFetcher(AsyncBaseFetcher):
10
+ def __init__(
11
+ self,
12
+ ticker,
13
+ client
14
+ ):
15
+ self.ticker = ticker
16
+ self.transformer_map = {"tw": TEJChipTransformer}
17
+ try:
18
+ self.extractor = get_extractor("TEJ_Chip", ticker, client)
19
+
20
+ company_name = self.extractor.get_company_name()
21
+ zone = self.extractor.get_zone()
22
+
23
+ transformer = self.get_transformer(zone)
24
+ self.transformer = transformer(ticker, company_name, zone)
25
+
26
+ except NotSupportedError as e:
27
+ raise NotSupportedError(
28
+ f"{self.__class__.__name__} only support {list(self.transformer_map.keys())} companies now, {ticker} is not available"
29
+ ) from e
30
+
31
+ async def query_data(
32
+ self, start_date=None, end_date=None, get_latest=False
33
+ ):
34
+ fetched_data = await self.extractor.query_data(
35
+ start_date, end_date, get_latest
36
+ )
37
+
38
+ transformed_data = self.transformer.process_transform(
39
+ fetched_data = fetched_data
40
+ )
41
+
42
+ return transformed_data
@@ -1,10 +1,12 @@
1
1
  import pandas as pd
2
2
  from neurostats_API.async_mode.fetchers.base import AsyncBaseFetcher
3
3
  from neurostats_API.async_mode.factory import get_extractor
4
+ from neurostats_API.transformers import TEJTechTransformer
4
5
  from neurostats_API.utils import NotSupportedError
5
6
 
7
+
6
8
  class AsyncTEJDailyTechFetcher(AsyncBaseFetcher):
7
-
9
+
8
10
  def __init__(
9
11
  self,
10
12
  ticker,
@@ -17,18 +19,24 @@ class AsyncTEJDailyTechFetcher(AsyncBaseFetcher):
17
19
  self.company_name = self.extractor.get_company_name()
18
20
  self.zone = self.extractor.get_zone()
19
21
 
22
+ self.transformer = TEJTechTransformer(
23
+ ticker, self.company_name, self.zone
24
+ )
25
+
20
26
  except NotSupportedError as e:
21
27
  raise NotSupportedError(
22
28
  f"{self.__class__.__name__} only support TW companies now, {ticker} is not available"
23
29
  ) from e
24
-
30
+
25
31
  async def query_data(self, start_date, end_date):
26
32
  data = await self.extractor.query_data(start_date, end_date)
27
33
  df = pd.DataFrame(data)
28
- return df.rename(columns={
29
- "open_d": "open",
30
- "high_d": "high",
31
- "low_d": "low",
32
- "close_d": "close",
33
- "vol": "volume"
34
- })
34
+ return df.rename(
35
+ columns={
36
+ "open_d": "open",
37
+ "high_d": "high",
38
+ "low_d": "low",
39
+ "close_d": "close",
40
+ "vol": "volume"
41
+ }
42
+ )
@@ -9,7 +9,8 @@ from .cash_flow import (
9
9
  )
10
10
 
11
11
  from .daily_tech import(
12
- DailyTechTransformer
12
+ DailyTechTransformer,
13
+ BatchTechTransformer
13
14
  )
14
15
 
15
16
  from .daily_chip import(
@@ -28,7 +29,9 @@ from .profit_lose import (
28
29
  )
29
30
 
30
31
  from .tej import (
31
- TEJFinanceStatementTransformer
32
+ TEJChipTransformer,
33
+ TEJFinanceStatementTransformer,
34
+ TEJTechTransformer
32
35
  )
33
36
 
34
37
  from .value import (
@@ -1 +1 @@
1
- from .tech import DailyTechTransformer
1
+ from .tech import DailyTechTransformer, BatchTechTransformer
@@ -1,8 +1,11 @@
1
1
  from .base import BaseDailyTransformer
2
- import inspect
3
- import pandas as pd
4
2
  from .utils import TechProcessor
5
3
 
4
+ import inspect
5
+ import pandas as pd
6
+ from datetime import datetime
7
+ from typing import List, Optional, Union
8
+ from collections import defaultdict
6
9
 
7
10
  class DailyTechTransformer(BaseDailyTransformer):
8
11
  def __init__(self, ticker, company_name, zone):
@@ -81,4 +84,32 @@ class DailyTechTransformer(BaseDailyTransformer):
81
84
  """
82
85
  回傳年線資料
83
86
  """
84
- return self._get_resampled("YE")
87
+ return self._get_resampled("YE")
88
+
89
+ class BatchTechTransformer(BaseDailyTransformer):
90
+ def __init__(self, strftime:str="%Y-%m-%d"):
91
+ self.date_format = strftime
92
+
93
+ def process_transform(
94
+ self,
95
+ fetched_datas: List[dict],
96
+ ) -> dict[str, dict[Union[str, datetime], float]]:
97
+
98
+ result = defaultdict(lambda: defaultdict(dict))
99
+
100
+ for record in fetched_datas:
101
+ ticker = record.get("ticker")
102
+ date = record.get("date")
103
+ if isinstance(date, str):
104
+ date = datetime.fromisoformat(date)
105
+ date_str = date.strftime(self.date_format)
106
+
107
+ result[ticker][date_str] = {
108
+ "open": record.get("open"),
109
+ "high": record.get("high"),
110
+ "low": record.get("low"),
111
+ "close": record.get("close"),
112
+ "volume": record.get("volume"),
113
+ }
114
+
115
+ return dict(result)
@@ -1 +1,3 @@
1
- from .finance_statement import TEJFinanceStatementTransformer
1
+ from .chip import TEJChipTransformer
2
+ from .finance_statement import TEJFinanceStatementTransformer
3
+ from .tech import TEJTechTransformer
@@ -0,0 +1,23 @@
1
+ from .base import BaseTEJTransformer
2
+ import pandas as pd
3
+
4
+ class TEJChipTransformer(BaseTEJTransformer):
5
+ def __init__(self, ticker, company_name, zone):
6
+ super().__init__(ticker, company_name, zone)
7
+ self.return_keys = ["chip_data"]
8
+
9
+
10
+ def process_transform(
11
+ self,
12
+ fetched_data
13
+ ):
14
+ if (not fetched_data):
15
+ return self._get_empty_structure()
16
+
17
+ fetched_data = pd.DataFrame(fetched_data)
18
+
19
+ return {
20
+ "ticker": self.ticker,
21
+ "company_name": self.company_name,
22
+ "chip_data": fetched_data
23
+ }
@@ -0,0 +1,24 @@
1
+ from .base import BaseTEJTransformer
2
+ import pandas as pd
3
+
4
+
5
+ class TEJTechTransformer(BaseTEJTransformer):
6
+
7
+ def __init__(self, ticker, company_name, zone):
8
+ super().__init__(ticker, company_name, zone)
9
+ self.fetched_data = None
10
+
11
+ def process_transform(self, fetched_data):
12
+ self.fetched_data = pd.DataFrame(fetched_data)
13
+
14
+ self.fetched_data = self.fetched_data.rename(
15
+ columns={
16
+ "open_d": "open",
17
+ "high_d": "high",
18
+ "low_d": "low",
19
+ "close_d": "close",
20
+ "vol": "volume"
21
+ }
22
+ )
23
+
24
+ return self.fetched_data
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: neurostats_API
3
- Version: 1.0.2rc3
3
+ Version: 1.0.3rc1
4
4
  Summary: The service of NeuroStats website
5
5
  Home-page: https://github.com/NeurowattStats/NeuroStats_API.git
6
6
  Author: JasonWang@Neurowatt
@@ -71,7 +71,7 @@ pip install neurostats-API
71
71
  ```Python
72
72
  >>> import neurostats_API
73
73
  >>> print(neurostats_API.__version__)
74
- 1.0.2rc3
74
+ 1.0.3rc1
75
75
  ```
76
76
 
77
77
  ### 下載舊版
@@ -1,18 +1,18 @@
1
- neurostats_API/__init__.py,sha256=pJQVKV6Zi1vhFl8s_uNyqTKAOLHkca0vRSnHQnFwByM,704
1
+ neurostats_API/__init__.py,sha256=j_4pWWMUPwXQR1FV4PvGhl79NDnOTBo0kyFW-ESeHts,731
2
2
  neurostats_API/cli.py,sha256=UJSWLIw03P24p-gkBb6JSEI5dW5U12UvLf1L8HjQD-o,873
3
3
  neurostats_API/main.py,sha256=QcsfmWivg2Dnqw3MTJWiI0QvEiRs0VuH-BjwQHFCv00,677
4
- neurostats_API/async_mode/__init__.py,sha256=8tsW_UDLJXuwzWdZJSacOqZatwzqr7v60hRk0PbgB-w,377
4
+ neurostats_API/async_mode/__init__.py,sha256=behin0Kw6BmrMsjNJAR5BQLBUcNw6BQKmT3iTdd1_nE,429
5
5
  neurostats_API/async_mode/db/__init__.py,sha256=7g0OJXgPsIDWRmH25h666cLlvVYpEDyWGXAVCHsNht0,86
6
6
  neurostats_API/async_mode/db/base.py,sha256=63kW2cKBSrs0B4RJaX_3Jv12UYD2APH8sRh2UEVKucw,676
7
7
  neurostats_API/async_mode/db/tej.py,sha256=ku7CfhrSJ8gfUQ_NRjyjSz-OFmqyCGGnXz8Tpue5gP0,324
8
8
  neurostats_API/async_mode/db/twse.py,sha256=YZA-NUZ01EAUKPsaNEaZn3cuzeL9n1fi03aBiHUJGAA,220
9
9
  neurostats_API/async_mode/db/us.py,sha256=SgoU_OpSkpmrlBiNvy5xgyssb7-xK8ptezi4SR00t4I,271
10
- neurostats_API/async_mode/db_extractors/__init__.py,sha256=S6-lz6SZGzsSem-Kicr8UKsbPcuUA3Wyu276yMJN0tg,512
10
+ neurostats_API/async_mode/db_extractors/__init__.py,sha256=CAkp-wryrTsrhZOeNQxaJ-D3nmhPFRFiIVEPuWkYx-I,577
11
11
  neurostats_API/async_mode/db_extractors/base.py,sha256=DLtNONV5F9Lj3OlXeGm_bnR6AMA5d6tL3r7na4H7FRE,2221
12
- neurostats_API/async_mode/db_extractors/daily/__init__.py,sha256=8vw8W8AZ_zi_hSshlobN4ITK9qaFVoNy66OmOT7cNj4,306
12
+ neurostats_API/async_mode/db_extractors/daily/__init__.py,sha256=OKfU4DKsujQD8v_B6BE_qt9fAxnq3aaW4mwFpNTbIVA,384
13
13
  neurostats_API/async_mode/db_extractors/daily/base.py,sha256=ePvYxqOypy0F9VI33nSJQGpG5zMNO_EGZ3owVUeKFLw,3204
14
14
  neurostats_API/async_mode/db_extractors/daily/tej_chip.py,sha256=Ywc0iIIPWw1VdtVc2_s1CNrgj0_G1wOaGzrgyVTN2k8,414
15
- neurostats_API/async_mode/db_extractors/daily/tej_tech.py,sha256=M3k1pmv48DfiUaIfDKx5gk85C5JpmuXdQhRcNzgOhPI,349
15
+ neurostats_API/async_mode/db_extractors/daily/tej_tech.py,sha256=33RGc_Pxf0FPqoG1Mdjtj9aSR3Yrdplh4bskNAPXUfk,2610
16
16
  neurostats_API/async_mode/db_extractors/daily/twse_chip.py,sha256=WICwcsy2m_2ua9UnIjs_SZGFq7m2-UByx9x7TCk_rlY,1490
17
17
  neurostats_API/async_mode/db_extractors/daily/us_chip.py,sha256=0Ycuqy3lqwA0kxAhv-KVqMUEMGQhOV3YMbHarWWT2PQ,4154
18
18
  neurostats_API/async_mode/db_extractors/daily/value.py,sha256=j5QjFOhmvVum0D10prcZZ7_sxrojA-b8sP72Ge9lOnY,2859
@@ -27,23 +27,24 @@ neurostats_API/async_mode/db_extractors/seasonal/cashflow.py,sha256=2yOIOMFic9DT
27
27
  neurostats_API/async_mode/db_extractors/seasonal/profit_lose.py,sha256=AMKMVIVIBWTRk2b_A33OUuTLrCwc-xYj5fIL4YjLnug,564
28
28
  neurostats_API/async_mode/db_extractors/seasonal/tej.py,sha256=SqObDqR3uOnxXGF12VQz7Rzw7B5YAimY1-nR0ImLkaY,2591
29
29
  neurostats_API/async_mode/factory/__init__.py,sha256=7dw36HPjV9JHfEBF7n1pA8i4f-07ACKREnGMUHxh7KY,45
30
- neurostats_API/async_mode/factory/extractor_factory.py,sha256=NlCH2zM8Qq4zObQG9n4rixCcuFBQmkJz7dS-LARPwXA,4774
30
+ neurostats_API/async_mode/factory/extractor_factory.py,sha256=xICWBniyf8EFIRfQHUpK5BYa2uNUjWhyaRFRbDh5PVg,5020
31
31
  neurostats_API/async_mode/factory/transformer_factory.py,sha256=atw_-wPz2JZpJscPVE2jvFB6QNwwmcRNKQH9iai-13E,4942
32
- neurostats_API/async_mode/fetchers/__init__.py,sha256=cn8AfSsqoZ_AntE3x4A1-0zu3KQUNy4OdpHpNJpRyT0,605
32
+ neurostats_API/async_mode/fetchers/__init__.py,sha256=I5t44-pD34afZDX-V201N3m7fV0GsoUIHDj2ompgcaI,649
33
33
  neurostats_API/async_mode/fetchers/balance_sheet.py,sha256=wzlXW5gPh5S5MD5jIUB_yeEL_aW2_CeX2DNKBio0-EA,1129
34
34
  neurostats_API/async_mode/fetchers/base.py,sha256=fWlPmvsQWHcgv8z36BsXj8Y92-VKmr8cUW1EjkqI3_8,1785
35
35
  neurostats_API/async_mode/fetchers/cash_flow.py,sha256=uj2JEbilgn595yJcMNvlTZHdkvu7E9y2e7rqs_ne270,2130
36
36
  neurostats_API/async_mode/fetchers/finance_overview.py,sha256=YETx7uxS6OQgzJ0v_3JMJoUfuWciWmKAzitm91XffHk,4441
37
37
  neurostats_API/async_mode/fetchers/month_revenue.py,sha256=GDrFrjTe81uAzeKvd5HghH9iPXouXL8JTt8hfaFkig4,1258
38
38
  neurostats_API/async_mode/fetchers/profit_lose.py,sha256=-YMqO6hEbGntAeAf9y66LX56fj6VrHWr1_IIbQ_bUBQ,1483
39
- neurostats_API/async_mode/fetchers/tech.py,sha256=fQChyVBPzT4oSOSeCZ5Et6nKf1XUA1U-RxFaezkUr0Y,6993
39
+ neurostats_API/async_mode/fetchers/tech.py,sha256=HVP_hUic_M7iKsrhrx2gzr1Am_ql0-3GY4Hg6kl610s,7896
40
40
  neurostats_API/async_mode/fetchers/twse_institution.py,sha256=DKyecoIa_2-CUfDXKp2dBFJk0lfCBIr2steVVa-jq9o,2055
41
41
  neurostats_API/async_mode/fetchers/twse_margin.py,sha256=wra84uFh9ooCoyFWhRuV4vP3Uhojc13XHx51UD90uYo,3173
42
42
  neurostats_API/async_mode/fetchers/us_chip.py,sha256=1C7wsdgXkf4SOHUyqGKNEsr0Ijds7l4jLLsPMYyMRQo,2365
43
43
  neurostats_API/async_mode/fetchers/value.py,sha256=7FpO0_BOOvq4ZlwwaIfSD8xO_s1O8ykxz147fkiZIt4,2883
44
- neurostats_API/async_mode/fetchers/tej/__init__.py,sha256=QNXGg1gE_bnkZWybulRZXtcCPWV6Aj1nLz7r0Mo4BN0,93
44
+ neurostats_API/async_mode/fetchers/tej/__init__.py,sha256=GdmNZtCPrQkhQOXK6HXkRD5kDKx_FAEwo5CEhs7PMU8,131
45
+ neurostats_API/async_mode/fetchers/tej/chip.py,sha256=1H6z0Ii1Fg-4MlMvgz5oE-PD9c__aTgUWnEvN0phn0A,1378
45
46
  neurostats_API/async_mode/fetchers/tej/seasonal_data.py,sha256=oeMpj4GMzw22KHjVDTcVO2hwVfxmnO291N6O_dKp0sw,2836
46
- neurostats_API/async_mode/fetchers/tej/tech.py,sha256=0wG2bep_nJp3kBS0nIzH6191R5bwEeS-upK40DTGpjU,1110
47
+ neurostats_API/async_mode/fetchers/tej/tech.py,sha256=zW87JBrlMRgCUHmK7b2kTqlEBghQrYThnB9mDFGFZFM,1328
47
48
  neurostats_API/config/company_list/ticker_index_industry_map.json,sha256=JPSrkMrxOg5GB6HoOhOKeCatznvGAFJpWt92iAhutak,162681
48
49
  neurostats_API/config/company_list/ticker_to_cik.json,sha256=MxULBrII65OagYjUgADaMMbng5r3x8lV9RdBRj_WGtg,240260
49
50
  neurostats_API/config/company_list/tw.json,sha256=VWaDFvd0ACCVSWItcHHpmVuM_RzP71jLZl9RBHztu-0,51332
@@ -70,7 +71,7 @@ neurostats_API/fetchers/profit_lose.py,sha256=MUTPPXHWZhhvcq1YzrY1dalFIXljUUG3Uu
70
71
  neurostats_API/fetchers/tech.py,sha256=_718Na2r3K3c9f-3cIx42jIg5g_mDHNrV6aZYFFba8A,16020
71
72
  neurostats_API/fetchers/tej_finance_report.py,sha256=mlIm2Qzs8-Xlzeb8uET8qGPWD3VGUx3g8qFFcY4UbAw,13022
72
73
  neurostats_API/fetchers/value_invest.py,sha256=QxQS2GcoLIU9ZBDEo8iRK2yHd8YLmBS70Bq42F3IsSw,8295
73
- neurostats_API/transformers/__init__.py,sha256=sePY-KavG_7xMA-dvWiC_Z6gXGZUmoCoMeuJCcZSe6A,729
74
+ neurostats_API/transformers/__init__.py,sha256=B9tt7D0vkwyNFvR3nLDv11vE3xZ9JQ8FuFYvqjuLI2g,803
74
75
  neurostats_API/transformers/base.py,sha256=gFRuLmFzZl0HObEtMr78oscFP3ePBseMW7tB4s51-_c,4795
75
76
  neurostats_API/transformers/balance_sheet/__init__.py,sha256=RCScBsR3zeC5UdyuiHD1CGRQufoFL5LkN8WbtI5JeA4,87
76
77
  neurostats_API/transformers/balance_sheet/base.py,sha256=sEap9uHe-nri8F4gPV_FCVm0Qe6KWgpHt6a2ryAPd_8,1676
@@ -82,16 +83,15 @@ neurostats_API/transformers/cash_flow/twse.py,sha256=srrmTmFheJig3el5jQIW8YBgpZV
82
83
  neurostats_API/transformers/cash_flow/us.py,sha256=nRJajeDz4HNkv42NosoP0Jir4tIA0ybhIZu9zHkjAEM,1304
83
84
  neurostats_API/transformers/daily_chip/__init__.py,sha256=-9y52t5cSvLq3ve9STe_Qhqa6iiCO0x78UUNG9qJ-IU,102
84
85
  neurostats_API/transformers/daily_chip/base.py,sha256=KBsnpACakJh2W-k4Kvv-dVNnSNbUCGMeqvQsTQkz-aE,184
85
- neurostats_API/transformers/daily_chip/tej.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
86
  neurostats_API/transformers/daily_chip/twse_chip.py,sha256=miMu5Si0tFndznf7E_T26c1hYtNqwHplbuB3htVzeGQ,14655
87
87
  neurostats_API/transformers/daily_chip/us.py,sha256=PX_pRKDcYOZLqEFazbouH6dIXsAEZnTPQ4a9Wg1Y2Is,2007
88
88
  neurostats_API/transformers/daily_chip/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
89
89
  neurostats_API/transformers/daily_chip/utils/institution.py,sha256=1Zj9mxIhvwkmA599a1OYmdorPEAN_U3sl8uhvddxUW0,3384
90
90
  neurostats_API/transformers/daily_chip/utils/margin_trading.py,sha256=oVY_OW63pcSc1TyM_jSPNAoj4HLyZCRshkdsHQsnxyk,38
91
91
  neurostats_API/transformers/daily_chip/utils/security_lending.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
- neurostats_API/transformers/daily_tech/__init__.py,sha256=xWOXQlK0Yo0SmH-2twdiOUXgl1w3RYZ-0R4mh7AnAKg,38
92
+ neurostats_API/transformers/daily_tech/__init__.py,sha256=u7rzSvzA6HfjEY-48Ko2rl0fT2wgIyvZWtJHqHjMI4Q,60
93
93
  neurostats_API/transformers/daily_tech/base.py,sha256=95pN3EussgbYbDCwCP8x4aVnJtGpuEe8b1y1W53CTzA,185
94
- neurostats_API/transformers/daily_tech/tech.py,sha256=bPAIAm28zxsEBjYvHeGaGHqg8wt7Zv7GtupICT8vJD4,2633
94
+ neurostats_API/transformers/daily_tech/tech.py,sha256=Vhx6YfZQT6kLZXwLIN70UNKLOam7BPAfIhiiEOnPK4s,3650
95
95
  neurostats_API/transformers/daily_tech/utils/__init__.py,sha256=QvkOMEvBW5pIMjTKDBiyaJKq4_Z2NtpbLD7fiu_U6XM,36
96
96
  neurostats_API/transformers/daily_tech/utils/processor.py,sha256=9zOjVFyWqzRXD5jIq2YkBGI4WZ8HFrI_ufssZgvKpdc,9314
97
97
  neurostats_API/transformers/finance_overview/__init__.py,sha256=mWFn13YrugExrSQ7oJvnvP95W20_rQ1wOesrZY3XnSU,107
@@ -105,10 +105,11 @@ neurostats_API/transformers/profit_lose/__init__.py,sha256=oOPyakP1wDnmq7bsxgEm4
105
105
  neurostats_API/transformers/profit_lose/base.py,sha256=BJZjE1GmWBI3ayjDkzrtQTrn0vjTSVckPbrQ_u6zEl0,3125
106
106
  neurostats_API/transformers/profit_lose/twse.py,sha256=RwAJWQBdsjFaLlW-HL6oUGxLAd8jXPpp6ljVB8uOfhQ,5400
107
107
  neurostats_API/transformers/profit_lose/us.py,sha256=q7Vbxp_xzB0SUsxIqQYENi3RayfqR6Nfynvt7p-KHlI,847
108
- neurostats_API/transformers/tej/__init__.py,sha256=WihARZhphkvApsKr4U0--68m1M-Dc_rpV7xoV2fUV7E,61
108
+ neurostats_API/transformers/tej/__init__.py,sha256=pOCvskmtVCJ35-0wCCIt2_Nc5X8XCsIS_VFjgYG2Ng8,135
109
109
  neurostats_API/transformers/tej/base.py,sha256=YD6M3Iok-KXb5EDhqa_fUzJ-zWXLeoXPsavdDJD-ks4,5436
110
- neurostats_API/transformers/tej/chip.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
110
+ neurostats_API/transformers/tej/chip.py,sha256=FsSZJ9_ytUNfQCcHI-UFE6sGIwfpwUmQX2fEoh_yAkc,606
111
111
  neurostats_API/transformers/tej/finance_statement.py,sha256=rE-Kc94hzW8-xcKn6ry8LwwT8dSoGRKGsmvd5W4_SUs,2798
112
+ neurostats_API/transformers/tej/tech.py,sha256=ORaUXCPHxaxFRNTk2xKpHEDKQ6OjJqrnUg4XAexFRPE,650
112
113
  neurostats_API/transformers/value/__init__.py,sha256=D8qMk0aLsv7CBBJHo5zsq_UuBKmZYNyqS3s-RWfhvy8,73
113
114
  neurostats_API/transformers/value/base.py,sha256=wR2LDiwGET126mwrPxYoApyl4lwx1MjWxFpOKLso_As,186
114
115
  neurostats_API/transformers/value/tej.py,sha256=csk0kLCrvXN7T_j9KkvXRRJreWZK6t3bYlPEfWcfBTo,244
@@ -120,7 +121,7 @@ neurostats_API/utils/datetime.py,sha256=e6p2XIXaDMOWNJ2qnwqZBScC9J6kB6h0Ef1A7fuW
120
121
  neurostats_API/utils/db_client.py,sha256=OYe6yazcR4Aa6jYmy47JrryUeh2NnKGqY2K_lSZe6i8,455
121
122
  neurostats_API/utils/exception.py,sha256=yv92GVh5uHV1BgRmO4DwJcX_PtE0-TSgQoo3VnZ5hOQ,277
122
123
  neurostats_API/utils/logger.py,sha256=egBiiPGTi5l1FoX_o6EvdGh81R0_k8hFPctSxq8RCoo,693
123
- neurostats_API-1.0.2rc3.dist-info/METADATA,sha256=ylR636fT1l_biAF2ObBPC0GBxkRDG4DruXsb8hUR7uo,2964
124
- neurostats_API-1.0.2rc3.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
125
- neurostats_API-1.0.2rc3.dist-info/top_level.txt,sha256=nSlQPMG0VtXivJyedp4Bkf86EOy2TpW10VGxolXrqnU,15
126
- neurostats_API-1.0.2rc3.dist-info/RECORD,,
124
+ neurostats_API-1.0.3rc1.dist-info/METADATA,sha256=MmernH6BGaA2wxk7Do-OnWRjDmW_-yfpyKT_aPoE388,2964
125
+ neurostats_API-1.0.3rc1.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
126
+ neurostats_API-1.0.3rc1.dist-info/top_level.txt,sha256=nSlQPMG0VtXivJyedp4Bkf86EOy2TpW10VGxolXrqnU,15
127
+ neurostats_API-1.0.3rc1.dist-info/RECORD,,
File without changes