neurostats-API 0.0.25__py3-none-any.whl → 1.0.0__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 +15 -1
- neurostats_API/async_mode/__init__.py +13 -0
- neurostats_API/async_mode/db/__init__.py +3 -0
- neurostats_API/async_mode/db/base.py +24 -0
- neurostats_API/async_mode/db/tej.py +10 -0
- neurostats_API/async_mode/db/twse.py +8 -0
- neurostats_API/async_mode/db/us.py +9 -0
- neurostats_API/async_mode/db_extractors/__init__.py +20 -0
- neurostats_API/async_mode/db_extractors/base.py +66 -0
- neurostats_API/async_mode/db_extractors/daily/__init__.py +7 -0
- neurostats_API/async_mode/db_extractors/daily/base.py +89 -0
- neurostats_API/async_mode/db_extractors/daily/tej_chip.py +14 -0
- neurostats_API/async_mode/db_extractors/daily/tej_tech.py +12 -0
- neurostats_API/async_mode/db_extractors/daily/twse_chip.py +49 -0
- neurostats_API/async_mode/db_extractors/daily/value.py +93 -0
- neurostats_API/async_mode/db_extractors/daily/yf.py +12 -0
- neurostats_API/async_mode/db_extractors/month_revenue/__init__.py +1 -0
- neurostats_API/async_mode/db_extractors/month_revenue/base.py +140 -0
- neurostats_API/async_mode/db_extractors/month_revenue/twse.py +5 -0
- neurostats_API/async_mode/db_extractors/seasonal/__init__.py +4 -0
- neurostats_API/async_mode/db_extractors/seasonal/balance_sheet.py +19 -0
- neurostats_API/async_mode/db_extractors/seasonal/base.py +152 -0
- neurostats_API/async_mode/db_extractors/seasonal/cashflow.py +10 -0
- neurostats_API/async_mode/db_extractors/seasonal/profit_lose.py +17 -0
- neurostats_API/async_mode/db_extractors/seasonal/tej.py +87 -0
- neurostats_API/async_mode/factory/__init__.py +1 -0
- neurostats_API/async_mode/factory/extractor_factory.py +168 -0
- neurostats_API/async_mode/factory/transformer_factory.py +164 -0
- neurostats_API/async_mode/fetchers/__init__.py +10 -0
- neurostats_API/async_mode/fetchers/balance_sheet.py +31 -0
- neurostats_API/async_mode/fetchers/base.py +48 -0
- neurostats_API/async_mode/fetchers/cash_flow.py +56 -0
- neurostats_API/async_mode/fetchers/finance_overview.py +134 -0
- neurostats_API/async_mode/fetchers/month_revenue.py +35 -0
- neurostats_API/async_mode/fetchers/profit_lose.py +46 -0
- neurostats_API/async_mode/fetchers/tech.py +205 -0
- neurostats_API/async_mode/fetchers/tej/__init__.py +2 -0
- neurostats_API/async_mode/fetchers/tej/seasonal_data.py +88 -0
- neurostats_API/async_mode/fetchers/tej/tech.py +34 -0
- neurostats_API/async_mode/fetchers/twse_institution.py +62 -0
- neurostats_API/async_mode/fetchers/twse_margin.py +100 -0
- neurostats_API/async_mode/fetchers/value.py +76 -0
- neurostats_API/config/company_list/ticker_index_industry_map.json +7946 -0
- neurostats_API/config/company_list/us.json +9986 -0
- neurostats_API/{tools → config}/tej_db/tej_db_skip_index.yaml +0 -2
- neurostats_API/{tools → config}/twse/profit_lose.yaml +0 -6
- neurostats_API/fetchers/finance_overview.py +22 -2
- neurostats_API/transformers/__init__.py +40 -0
- neurostats_API/transformers/balance_sheet/__init__.py +2 -0
- neurostats_API/transformers/balance_sheet/base.py +51 -0
- neurostats_API/transformers/balance_sheet/twse.py +81 -0
- neurostats_API/transformers/balance_sheet/us.py +38 -0
- neurostats_API/transformers/base.py +158 -0
- neurostats_API/transformers/cash_flow/__init__.py +2 -0
- neurostats_API/transformers/cash_flow/base.py +114 -0
- neurostats_API/transformers/cash_flow/twse.py +70 -0
- neurostats_API/transformers/cash_flow/us.py +38 -0
- neurostats_API/transformers/daily_chip/__init__.py +1 -0
- neurostats_API/transformers/daily_chip/base.py +5 -0
- neurostats_API/transformers/daily_chip/tej.py +0 -0
- neurostats_API/transformers/daily_chip/twse_chip.py +415 -0
- neurostats_API/transformers/daily_chip/utils/__init__.py +0 -0
- neurostats_API/transformers/daily_chip/utils/institution.py +90 -0
- neurostats_API/transformers/daily_chip/utils/margin_trading.py +2 -0
- neurostats_API/transformers/daily_chip/utils/security_lending.py +0 -0
- neurostats_API/transformers/daily_tech/__init__.py +1 -0
- neurostats_API/transformers/daily_tech/base.py +5 -0
- neurostats_API/transformers/daily_tech/tech.py +84 -0
- neurostats_API/transformers/daily_tech/utils/__init__.py +1 -0
- neurostats_API/transformers/daily_tech/utils/processor.py +251 -0
- neurostats_API/transformers/finance_overview/__init__.py +2 -0
- neurostats_API/transformers/finance_overview/agent_overview.py +55 -0
- neurostats_API/transformers/finance_overview/base.py +824 -0
- neurostats_API/transformers/finance_overview/stats_overview.py +79 -0
- neurostats_API/transformers/month_revenue/__init__.py +1 -0
- neurostats_API/transformers/month_revenue/base.py +60 -0
- neurostats_API/transformers/month_revenue/twse.py +134 -0
- neurostats_API/transformers/profit_lose/__init__.py +2 -0
- neurostats_API/transformers/profit_lose/base.py +82 -0
- neurostats_API/transformers/profit_lose/twse.py +133 -0
- neurostats_API/transformers/profit_lose/us.py +26 -0
- neurostats_API/transformers/tej/__init__.py +1 -0
- neurostats_API/transformers/tej/base.py +149 -0
- neurostats_API/transformers/tej/finance_statement.py +80 -0
- neurostats_API/transformers/value/__init__.py +1 -0
- neurostats_API/transformers/value/base.py +5 -0
- neurostats_API/transformers/value/tej.py +8 -0
- neurostats_API/transformers/value/twse.py +48 -0
- neurostats_API/utils/__init__.py +1 -1
- neurostats_API/utils/data_process.py +10 -6
- neurostats_API/utils/exception.py +8 -0
- neurostats_API/utils/logger.py +21 -0
- neurostats_API-1.0.0.dist-info/METADATA +102 -0
- neurostats_API-1.0.0.dist-info/RECORD +121 -0
- neurostats_API-0.0.25.dist-info/METADATA +0 -858
- neurostats_API-0.0.25.dist-info/RECORD +0 -36
- /neurostats_API/{tools → config}/company_list/tw.json +0 -0
- /neurostats_API/{tools → config}/company_list/us_TradingView_list.json +0 -0
- /neurostats_API/{tools → config}/tej_db/tej_db_index.yaml +0 -0
- /neurostats_API/{tools → config}/tej_db/tej_db_percent_index.yaml +0 -0
- /neurostats_API/{tools → config}/tej_db/tej_db_thousand_index.yaml +0 -0
- /neurostats_API/{tools → config}/twse/balance_sheet.yaml +0 -0
- /neurostats_API/{tools → config}/twse/cash_flow_percentage.yaml +0 -0
- /neurostats_API/{tools → config}/twse/finance_overview_dict.yaml +0 -0
- /neurostats_API/{tools → config}/twse/seasonal_data_field_dict.txt +0 -0
- {neurostats_API-0.0.25.dist-info → neurostats_API-1.0.0.dist-info}/WHEEL +0 -0
- {neurostats_API-0.0.25.dist-info → neurostats_API-1.0.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,100 @@
|
|
1
|
+
from .base import AsyncBaseFetcher
|
2
|
+
from datetime import datetime, timedelta
|
3
|
+
from neurostats_API.async_mode.factory import get_extractor
|
4
|
+
from ..db_extractors import (
|
5
|
+
AsyncTWSEChipDBExtractor,
|
6
|
+
AsyncYFDailyTechDBExtractor,
|
7
|
+
)
|
8
|
+
|
9
|
+
from neurostats_API.transformers import TWSEChipTransformer
|
10
|
+
from neurostats_API.utils import NotSupportedError
|
11
|
+
import pandas as pd
|
12
|
+
|
13
|
+
|
14
|
+
class AsyncTWSEMarginFetcher(AsyncBaseFetcher):
|
15
|
+
"""
|
16
|
+
stats 網頁用
|
17
|
+
"""
|
18
|
+
|
19
|
+
def __init__(self, ticker, client):
|
20
|
+
self.ticker = ticker
|
21
|
+
self.transformer_map = {"tw": TWSEChipTransformer}
|
22
|
+
try:
|
23
|
+
self.margin_extractor = get_extractor(
|
24
|
+
"TWSE_chip", ticker, client, fetch_type='M'
|
25
|
+
)
|
26
|
+
self.security_extractor = get_extractor(
|
27
|
+
"TWSE_chip", ticker, client, fetch_type='S'
|
28
|
+
)
|
29
|
+
self.daily_extractor = get_extractor("YF_tech", ticker, client)
|
30
|
+
|
31
|
+
company_name = self.margin_extractor.get_company_name()
|
32
|
+
zone = self.margin_extractor.get_zone()
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
transformer = self.get_transformer(zone)
|
37
|
+
self.transformer = transformer(ticker, company_name, zone)
|
38
|
+
except NotSupportedError as e:
|
39
|
+
raise NotSupportedError(
|
40
|
+
f"{self.__class__.__name__} only support {list(self.transformer_map.keys())} companies now, {ticker} is not available"
|
41
|
+
) from e
|
42
|
+
|
43
|
+
async def query_data(self, start_date=None, end_date=None):
|
44
|
+
margin = await self.margin_extractor.query_data(start_date, end_date)
|
45
|
+
security_lending = await self.security_extractor.query_data(
|
46
|
+
start_date, end_date
|
47
|
+
)
|
48
|
+
|
49
|
+
tech_data = await self.daily_extractor.query_data(start_date, end_date)
|
50
|
+
|
51
|
+
fetched_data = {
|
52
|
+
"margin_trading": margin,
|
53
|
+
"security_lending": security_lending
|
54
|
+
}
|
55
|
+
transformed_data = self.transformer.process_transform(
|
56
|
+
tech_data=tech_data, **fetched_data
|
57
|
+
)
|
58
|
+
transformed_data['annual_trading'] = self._concat_data(
|
59
|
+
transformed_data['annual_trading']
|
60
|
+
)
|
61
|
+
|
62
|
+
return transformed_data
|
63
|
+
|
64
|
+
async def query_data_annual(self):
|
65
|
+
"""
|
66
|
+
取一年內的資料
|
67
|
+
"""
|
68
|
+
end_date = datetime.today()
|
69
|
+
start_date = end_date - timedelta(days=365)
|
70
|
+
|
71
|
+
fetched_data = await self.query_data(start_date, end_date)
|
72
|
+
|
73
|
+
return fetched_data
|
74
|
+
|
75
|
+
def _concat_data(self, annaual_data):
|
76
|
+
"""
|
77
|
+
借券, 債券串接
|
78
|
+
annaual_data:
|
79
|
+
{
|
80
|
+
"margin_trading": pd.DataFrame,
|
81
|
+
'security_lending': pd.DataFrame
|
82
|
+
}
|
83
|
+
"""
|
84
|
+
|
85
|
+
margin_annual = annaual_data.get("margin_trading")
|
86
|
+
security_annaul = annaual_data.get("security_lending")
|
87
|
+
|
88
|
+
unique_cols = [
|
89
|
+
name for name in security_annaul.columns
|
90
|
+
if name not in margin_annual.columns
|
91
|
+
]
|
92
|
+
concat_df = pd.concat(
|
93
|
+
[margin_annual, security_annaul[unique_cols]], axis=1
|
94
|
+
)
|
95
|
+
|
96
|
+
return {
|
97
|
+
'margin_trading': margin_annual,
|
98
|
+
'security_lending': security_annaul,
|
99
|
+
'stats_page_history': concat_df
|
100
|
+
}
|
@@ -0,0 +1,76 @@
|
|
1
|
+
from .base import AsyncBaseFetcher
|
2
|
+
from ..db_extractors import (
|
3
|
+
AsyncDailyValueDBExtractor, AsyncTEJDailyValueDBExtractor
|
4
|
+
)
|
5
|
+
from neurostats_API.async_mode.factory import get_extractor
|
6
|
+
from neurostats_API.transformers import TWSEAnnualValueTransformer, TWSEHistoryValueTransformer
|
7
|
+
from neurostats_API.utils import NotSupportedError
|
8
|
+
|
9
|
+
|
10
|
+
class AsyncTWSEStatsValueFetcher(AsyncBaseFetcher):
|
11
|
+
|
12
|
+
def __init__(self, ticker, client):
|
13
|
+
|
14
|
+
self.ticker = ticker
|
15
|
+
self.transformer_map = {
|
16
|
+
"tw": (TWSEHistoryValueTransformer, TWSEAnnualValueTransformer)
|
17
|
+
}
|
18
|
+
try:
|
19
|
+
self.daily_data_extractor = get_extractor("TWSE_value", ticker, client, fetch_type = 'D')
|
20
|
+
self.annual_data_extractor = get_extractor("TWSE_value", ticker, client, fetch_type = 'Y')
|
21
|
+
|
22
|
+
self.company_name = self.daily_data_extractor.get_company_name()
|
23
|
+
self.zone = self.daily_data_extractor.get_zone()
|
24
|
+
|
25
|
+
transformer = self.get_transformer(self.zone)
|
26
|
+
|
27
|
+
daily_transformer, annual_transformer = transformer
|
28
|
+
self.daily_transformer = daily_transformer(
|
29
|
+
ticker, self.company_name, self.zone
|
30
|
+
)
|
31
|
+
self.annual_transformer = annual_transformer(
|
32
|
+
ticker, self.company_name, self.zone
|
33
|
+
)
|
34
|
+
|
35
|
+
self.return_dict = {
|
36
|
+
"ticker": self.ticker,
|
37
|
+
"company_name": self.company_name
|
38
|
+
}
|
39
|
+
except NotSupportedError as e:
|
40
|
+
raise NotSupportedError(
|
41
|
+
f"{self.__class__.__name__} only support {list(self.transformer_map.keys())} companies now, {ticker} is not available"
|
42
|
+
) from e
|
43
|
+
|
44
|
+
async def query_data(self, start_date=None, end_date=None):
|
45
|
+
|
46
|
+
annual_data = await self.annual_data_extractor.query_data(
|
47
|
+
start_date, end_date
|
48
|
+
)
|
49
|
+
daily_data = await self.daily_data_extractor.query_data(
|
50
|
+
start_date=start_date, end_date=end_date
|
51
|
+
)
|
52
|
+
|
53
|
+
self.return_dict['yearly_data'
|
54
|
+
] = self.annual_transformer.process_transform(
|
55
|
+
annual_data
|
56
|
+
)
|
57
|
+
self.return_dict['daily_data'] = self.daily_transformer.process_latest(
|
58
|
+
daily_data
|
59
|
+
)
|
60
|
+
self.return_dict['value_serie'
|
61
|
+
] = self.daily_transformer.process_transform(
|
62
|
+
daily_data
|
63
|
+
)
|
64
|
+
|
65
|
+
return self.return_dict
|
66
|
+
|
67
|
+
async def query_value_serie(self, start_date=None, end_date=None):
|
68
|
+
daily_data = await self.daily_data_extractor.query_data(
|
69
|
+
start_date, end_date
|
70
|
+
)
|
71
|
+
self.return_dict['value_serie'
|
72
|
+
] = self.daily_transformer.process_transform(
|
73
|
+
daily_data
|
74
|
+
)
|
75
|
+
|
76
|
+
return self.return_dict
|