neurostats-API 0.0.25__py3-none-any.whl → 1.0.0rc1__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.
Files changed (105) hide show
  1. neurostats_API/__init__.py +1 -1
  2. neurostats_API/async_mode/__init__.py +13 -0
  3. neurostats_API/async_mode/db/__init__.py +3 -0
  4. neurostats_API/async_mode/db/base.py +24 -0
  5. neurostats_API/async_mode/db/tej.py +10 -0
  6. neurostats_API/async_mode/db/twse.py +8 -0
  7. neurostats_API/async_mode/db/us.py +9 -0
  8. neurostats_API/async_mode/db_extractors/__init__.py +20 -0
  9. neurostats_API/async_mode/db_extractors/base.py +66 -0
  10. neurostats_API/async_mode/db_extractors/daily/__init__.py +7 -0
  11. neurostats_API/async_mode/db_extractors/daily/base.py +89 -0
  12. neurostats_API/async_mode/db_extractors/daily/tej_chip.py +14 -0
  13. neurostats_API/async_mode/db_extractors/daily/tej_tech.py +12 -0
  14. neurostats_API/async_mode/db_extractors/daily/twse_chip.py +44 -0
  15. neurostats_API/async_mode/db_extractors/daily/value.py +93 -0
  16. neurostats_API/async_mode/db_extractors/daily/yf.py +12 -0
  17. neurostats_API/async_mode/db_extractors/month_revenue/__init__.py +1 -0
  18. neurostats_API/async_mode/db_extractors/month_revenue/base.py +140 -0
  19. neurostats_API/async_mode/db_extractors/month_revenue/twse.py +5 -0
  20. neurostats_API/async_mode/db_extractors/seasonal/__init__.py +4 -0
  21. neurostats_API/async_mode/db_extractors/seasonal/balance_sheet.py +19 -0
  22. neurostats_API/async_mode/db_extractors/seasonal/base.py +159 -0
  23. neurostats_API/async_mode/db_extractors/seasonal/cashflow.py +10 -0
  24. neurostats_API/async_mode/db_extractors/seasonal/profit_lose.py +17 -0
  25. neurostats_API/async_mode/db_extractors/seasonal/tej.py +87 -0
  26. neurostats_API/async_mode/factory/__init__.py +1 -0
  27. neurostats_API/async_mode/factory/extractor_factory.py +168 -0
  28. neurostats_API/async_mode/factory/transformer_factory.py +164 -0
  29. neurostats_API/async_mode/fetchers/__init__.py +10 -0
  30. neurostats_API/async_mode/fetchers/balance_sheet.py +31 -0
  31. neurostats_API/async_mode/fetchers/base.py +48 -0
  32. neurostats_API/async_mode/fetchers/cash_flow.py +56 -0
  33. neurostats_API/async_mode/fetchers/finance_overview.py +134 -0
  34. neurostats_API/async_mode/fetchers/month_revenue.py +35 -0
  35. neurostats_API/async_mode/fetchers/profit_lose.py +46 -0
  36. neurostats_API/async_mode/fetchers/tech.py +205 -0
  37. neurostats_API/async_mode/fetchers/tej.py +88 -0
  38. neurostats_API/async_mode/fetchers/twse_institution.py +62 -0
  39. neurostats_API/async_mode/fetchers/twse_margin.py +100 -0
  40. neurostats_API/async_mode/fetchers/value.py +76 -0
  41. neurostats_API/config/company_list/ticker_index_industry_map.json +7946 -0
  42. neurostats_API/config/company_list/us.json +9986 -0
  43. neurostats_API/{tools → config}/tej_db/tej_db_skip_index.yaml +0 -2
  44. neurostats_API/{tools → config}/twse/profit_lose.yaml +0 -6
  45. neurostats_API/fetchers/finance_overview.py +27 -5
  46. neurostats_API/transformers/__init__.py +40 -0
  47. neurostats_API/transformers/balance_sheet/__init__.py +2 -0
  48. neurostats_API/transformers/balance_sheet/base.py +51 -0
  49. neurostats_API/transformers/balance_sheet/twse.py +76 -0
  50. neurostats_API/transformers/balance_sheet/us.py +30 -0
  51. neurostats_API/transformers/base.py +110 -0
  52. neurostats_API/transformers/cash_flow/__init__.py +2 -0
  53. neurostats_API/transformers/cash_flow/base.py +114 -0
  54. neurostats_API/transformers/cash_flow/twse.py +68 -0
  55. neurostats_API/transformers/cash_flow/us.py +38 -0
  56. neurostats_API/transformers/daily_chip/__init__.py +1 -0
  57. neurostats_API/transformers/daily_chip/base.py +5 -0
  58. neurostats_API/transformers/daily_chip/tej.py +0 -0
  59. neurostats_API/transformers/daily_chip/twse_chip.py +412 -0
  60. neurostats_API/transformers/daily_chip/utils/__init__.py +0 -0
  61. neurostats_API/transformers/daily_chip/utils/institution.py +90 -0
  62. neurostats_API/transformers/daily_chip/utils/margin_trading.py +2 -0
  63. neurostats_API/transformers/daily_chip/utils/security_lending.py +0 -0
  64. neurostats_API/transformers/daily_tech/__init__.py +1 -0
  65. neurostats_API/transformers/daily_tech/base.py +5 -0
  66. neurostats_API/transformers/daily_tech/tech.py +84 -0
  67. neurostats_API/transformers/daily_tech/utils/__init__.py +1 -0
  68. neurostats_API/transformers/daily_tech/utils/processor.py +251 -0
  69. neurostats_API/transformers/finance_overview/__init__.py +2 -0
  70. neurostats_API/transformers/finance_overview/agent_overview.py +55 -0
  71. neurostats_API/transformers/finance_overview/base.py +824 -0
  72. neurostats_API/transformers/finance_overview/stats_overview.py +64 -0
  73. neurostats_API/transformers/month_revenue/__init__.py +1 -0
  74. neurostats_API/transformers/month_revenue/base.py +60 -0
  75. neurostats_API/transformers/month_revenue/twse.py +129 -0
  76. neurostats_API/transformers/profit_lose/__init__.py +2 -0
  77. neurostats_API/transformers/profit_lose/base.py +82 -0
  78. neurostats_API/transformers/profit_lose/twse.py +133 -0
  79. neurostats_API/transformers/profit_lose/us.py +25 -0
  80. neurostats_API/transformers/tej/__init__.py +1 -0
  81. neurostats_API/transformers/tej/base.py +149 -0
  82. neurostats_API/transformers/tej/finance_statement.py +80 -0
  83. neurostats_API/transformers/value/__init__.py +1 -0
  84. neurostats_API/transformers/value/base.py +5 -0
  85. neurostats_API/transformers/value/tej.py +8 -0
  86. neurostats_API/transformers/value/twse.py +48 -0
  87. neurostats_API/utils/__init__.py +1 -1
  88. neurostats_API/utils/data_process.py +10 -6
  89. neurostats_API/utils/exception.py +8 -0
  90. neurostats_API/utils/logger.py +21 -0
  91. neurostats_API-1.0.0rc1.dist-info/METADATA +102 -0
  92. neurostats_API-1.0.0rc1.dist-info/RECORD +119 -0
  93. neurostats_API-0.0.25.dist-info/METADATA +0 -858
  94. neurostats_API-0.0.25.dist-info/RECORD +0 -36
  95. /neurostats_API/{tools → config}/company_list/tw.json +0 -0
  96. /neurostats_API/{tools → config}/company_list/us_TradingView_list.json +0 -0
  97. /neurostats_API/{tools → config}/tej_db/tej_db_index.yaml +0 -0
  98. /neurostats_API/{tools → config}/tej_db/tej_db_percent_index.yaml +0 -0
  99. /neurostats_API/{tools → config}/tej_db/tej_db_thousand_index.yaml +0 -0
  100. /neurostats_API/{tools → config}/twse/balance_sheet.yaml +0 -0
  101. /neurostats_API/{tools → config}/twse/cash_flow_percentage.yaml +0 -0
  102. /neurostats_API/{tools → config}/twse/finance_overview_dict.yaml +0 -0
  103. /neurostats_API/{tools → config}/twse/seasonal_data_field_dict.txt +0 -0
  104. {neurostats_API-0.0.25.dist-info → neurostats_API-1.0.0rc1.dist-info}/WHEEL +0 -0
  105. {neurostats_API-0.0.25.dist-info → neurostats_API-1.0.0rc1.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