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.
- neurostats_API/__init__.py +3 -2
- neurostats_API/async_mode/__init__.py +3 -1
- neurostats_API/async_mode/db_extractors/__init__.py +3 -1
- neurostats_API/async_mode/db_extractors/daily/__init__.py +2 -1
- neurostats_API/async_mode/db_extractors/daily/tej_tech.py +75 -1
- neurostats_API/async_mode/factory/extractor_factory.py +16 -7
- neurostats_API/async_mode/fetchers/__init__.py +2 -2
- neurostats_API/async_mode/fetchers/tech.py +30 -3
- neurostats_API/async_mode/fetchers/tej/__init__.py +1 -0
- neurostats_API/async_mode/fetchers/tej/chip.py +42 -0
- neurostats_API/async_mode/fetchers/tej/tech.py +17 -9
- neurostats_API/transformers/__init__.py +5 -2
- neurostats_API/transformers/daily_tech/__init__.py +1 -1
- neurostats_API/transformers/daily_tech/tech.py +34 -3
- neurostats_API/transformers/tej/__init__.py +3 -1
- neurostats_API/transformers/tej/chip.py +23 -0
- neurostats_API/transformers/tej/tech.py +24 -0
- {neurostats_API-1.0.2rc3.dist-info → neurostats_API-1.0.3rc1.dist-info}/METADATA +2 -2
- {neurostats_API-1.0.2rc3.dist-info → neurostats_API-1.0.3rc1.dist-info}/RECORD +21 -20
- neurostats_API/transformers/daily_chip/tej.py +0 -0
- {neurostats_API-1.0.2rc3.dist-info → neurostats_API-1.0.3rc1.dist-info}/WHEEL +0 -0
- {neurostats_API-1.0.2rc3.dist-info → neurostats_API-1.0.3rc1.dist-info}/top_level.txt +0 -0
neurostats_API/__init__.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
__version__='1.0.
|
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 .
|
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
|
-
|
6
|
-
|
7
|
-
|
8
|
-
AsyncTEJSelfSettlementDBExtractor,
|
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
|
@@ -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(
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
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
|
-
|
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)
|
@@ -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.
|
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.
|
74
|
+
1.0.3rc1
|
75
75
|
```
|
76
76
|
|
77
77
|
### 下載舊版
|
@@ -1,18 +1,18 @@
|
|
1
|
-
neurostats_API/__init__.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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.
|
124
|
-
neurostats_API-1.0.
|
125
|
-
neurostats_API-1.0.
|
126
|
-
neurostats_API-1.0.
|
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
|
File without changes
|
File without changes
|