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,80 @@
1
+ from .base import BaseTEJTransformer
2
+ from neurostats_API.utils import StatsProcessor, NoCompanyError, NoDataError
3
+ import pandas as pd
4
+
5
+
6
+ class TEJFinanceStatementTransformer(BaseTEJTransformer):
7
+
8
+ def __init__(self, ticker, company_name, zone, target_column="Q"):
9
+ super().__init__(ticker, company_name, zone)
10
+ self.target_column = target_column
11
+
12
+ index_files = [
13
+ "tej_db/tej_db_index.yaml", "tej_db/tej_db_thousand_index.yaml",
14
+ "tej_db/tej_db_percent_index.yaml", "tej_db/tej_db_skip_index.yaml"
15
+ ]
16
+
17
+ self.index_dict, self.thousand_dict, self.percent_dict, skip_index_dict = [
18
+ StatsProcessor.load_yaml(file) for file in index_files
19
+ ]
20
+
21
+ self.check_index = set(self.index_dict.get("TWN/AINVFQ1", []))
22
+ self.skip_index = set(
23
+ self.percent_dict.get("TWN/AINVFQ1", []) + skip_index_dict.get("TWN/AINVFQ1", [])
24
+ )
25
+ self.thousand_index_list = list(
26
+ self.thousand_dict.get("TWN/AINVFQ1", [])
27
+ )
28
+ self.percent_index_list = list(self.percent_dict.get("TWN/AINVFQ1", []))
29
+
30
+ def process_transform(
31
+ self,
32
+ fetched_data,
33
+ start_date,
34
+ fetch_mode='QoQ',
35
+ use_cal=True,
36
+ indexes=None
37
+ ):
38
+ if (len(fetched_data) == 0):
39
+ raise NoDataError(f"No data found in collection: TEJ_finance_statement, ticker={self.ticker}")
40
+
41
+ target_season = fetched_data[-1]['season']
42
+ start_col = self._find_start_season(fetched_data, start_date)
43
+ fetched_data = self._process_data_to_tej_format(
44
+ fetched_data, target_key=self.target_column
45
+ )
46
+
47
+ if (indexes):
48
+ fetched_data = pd.DataFrame.from_dict(fetched_data)
49
+ fetched_data = fetched_data.loc[indexes, :]
50
+ fetched_data = fetched_data.to_dict()
51
+
52
+ if (fetch_mode == 'QoQ'):
53
+ data = self._get_QoQ_data(data=fetched_data, use_cal=use_cal)
54
+ data = data.iloc[:, start_col:]
55
+ else:
56
+ data = self._get_YoY_data(
57
+ data=fetched_data, target_season=target_season, use_cal=use_cal
58
+ )
59
+
60
+ data = data.iloc[:, start_col:]
61
+ target_season_col = data.columns.str.endswith(f"{target_season}")
62
+ data = data.loc[:, target_season_col]
63
+
64
+ return data
65
+
66
+ def _find_start_season(self, fetched_data, start_date):
67
+ """
68
+ 找出開始的年或季度所在的index
69
+ """
70
+ start_year = start_date.year
71
+ start_season = (start_date.month - 1 // 3) + 1
72
+
73
+ start_col = 0
74
+ for data in fetched_data:
75
+ if ((start_year, start_season) < (data['year'], data['season'])):
76
+ break
77
+ else:
78
+ start_col += 1
79
+
80
+ return start_col
@@ -0,0 +1 @@
1
+ from .twse import TWSEAnnualValueTransformer, TWSEHistoryValueTransformer
@@ -0,0 +1,5 @@
1
+ from ..base import BaseTransformer
2
+
3
+ class BaseValueTransformer(BaseTransformer):
4
+ def __init__(self, ticker, company_name, zone):
5
+ super().__init__(ticker, company_name, zone)
@@ -0,0 +1,8 @@
1
+ from .base import BaseValueTransformer
2
+
3
+ class TEJValueTransformer(BaseValueTransformer):
4
+ def __init__(self, ticker, company_name, zone):
5
+ super().__init__(ticker, company_name, zone)
6
+
7
+ def process_transform(self):
8
+ pass
@@ -0,0 +1,48 @@
1
+ from .base import BaseValueTransformer
2
+ import pandas as pd
3
+
4
+ class TWSEValueTransformer(BaseValueTransformer):
5
+ def __init__(self, ticker, company_name, zone):
6
+ super().__init__(ticker, company_name, zone)
7
+
8
+ def process_transform(self, fetched_data):
9
+ pass
10
+
11
+ class TWSEAnnualValueTransformer(TWSEValueTransformer):
12
+ def __init__(self, ticker, company_name, zone):
13
+ super().__init__(ticker, company_name, zone)
14
+
15
+ def process_transform(self, annual_data):
16
+ annual_df = pd.DataFrame(annual_data)
17
+
18
+ return annual_df
19
+
20
+ class TWSEHistoryValueTransformer(TWSEValueTransformer):
21
+ def __init__(self, ticker, company_name, zone):
22
+ super().__init__(ticker, company_name, zone)
23
+ self.column = [
24
+ "P_E", "P_FCF", "P_B", "P_S",
25
+ "EV_OPI", "EV_EBIT", "EV_EBITDA", "EV_S", "close"
26
+ ]
27
+
28
+ def process_transform(self, daily_data):
29
+ history_df = pd.DataFrame(daily_data).set_index("date")
30
+ return_dict = {}
31
+
32
+ for key in self.column:
33
+ return_dict[key] = history_df.loc[:, [key]]
34
+
35
+ return return_dict
36
+
37
+ def process_latest(self, daily_data):
38
+ if len(daily_data) < 1:
39
+ return self._get_empty_structure()
40
+
41
+ daily_data = daily_data[-1]
42
+
43
+ return daily_data
44
+
45
+ def _get_empty_structure(self):
46
+ return {
47
+ key: None for key in self.column
48
+ }
@@ -2,4 +2,4 @@ from .datetime import StatsDateTime
2
2
  from .db_client import DBClient
3
3
  from .data_process import StatsProcessor
4
4
  from .calculate_value import YoY_Calculator
5
- from .exception import NoCompanyError
5
+ from .exception import NoCompanyError, NoDataError, NotSupportedError
@@ -24,14 +24,14 @@ class StatsProcessor:
24
24
 
25
25
  @classmethod
26
26
  def load_txt(cls, filename, json_load=True):
27
- txt_path = files('neurostats_API.tools').joinpath(filename)
27
+ txt_path = files('neurostats_API.config').joinpath(filename)
28
28
  with open(txt_path, 'r', encoding='utf-8') as f:
29
29
  data = json.load(f) if (json_load) else f.read()
30
30
  return data
31
31
 
32
32
  @classmethod
33
33
  def load_yaml(cls, filename):
34
- yaml_path = files('neurostats_API.tools').joinpath(filename)
34
+ yaml_path = files('neurostats_API.config').joinpath(filename)
35
35
  with open(yaml_path, 'r', encoding='utf-8') as f:
36
36
  data = yaml.safe_load(f)
37
37
 
@@ -39,7 +39,7 @@ class StatsProcessor:
39
39
 
40
40
  @classmethod
41
41
  def load_json(cls, filename):
42
- json_path = files('neurostats_API.tools').joinpath(filename)
42
+ json_path = files('neurostats_API.config').joinpath(filename)
43
43
  with open(json_path, 'r', encoding='utf-8') as f:
44
44
  data = json.load(f)
45
45
 
@@ -57,7 +57,10 @@ class StatsProcessor:
57
57
  # Append the expanded columns to the new DataFrame
58
58
  expanded_columns[col] = expanded_df
59
59
 
60
- expanded_df = pd.concat(expanded_columns.values(), axis=1)
60
+ try:
61
+ expanded_df = pd.concat(expanded_columns.values(), axis=1)
62
+ except ValueError: # No values to concat
63
+ expanded_df = pd.DataFrame(columns = list(expanded_columns.keys()))
61
64
 
62
65
  return expanded_df
63
66
 
@@ -98,12 +101,13 @@ class StatsProcessor:
98
101
  desired_order = []
99
102
  for index_name in target_index:
100
103
  desired_order += [f"{index_name}_{metric_name}" for metric_name in target_metrics]
101
- sliced_table = total_table.loc[desired_order, :].T
104
+ sliced_table = total_table.loc[:, desired_order]
102
105
 
103
106
  return sliced_table.T
104
107
 
105
108
  else:
106
- return total_table
109
+ target_columns = total_table.columns.str.endswith(tuple(target_metrics))
110
+ return total_table.loc[:, target_columns]
107
111
 
108
112
  @classmethod
109
113
  def slice_multi_col_table(
@@ -1,3 +1,11 @@
1
1
  class NoCompanyError(Exception):
2
+ def __init__(self, msg):
3
+ super().__init__(msg)
4
+
5
+ class NoDataError(Exception):
6
+ def __init__(self, msg):
7
+ super().__init__(msg)
8
+
9
+ class NotSupportedError(Exception):
2
10
  def __init__(self, msg):
3
11
  super().__init__(msg)
@@ -0,0 +1,21 @@
1
+ import logging
2
+ from functools import wraps
3
+
4
+ class StatsLogger:
5
+
6
+ @classmethod
7
+ def exception_log(cls, default_return=None, level='error'):
8
+ def decorator(func):
9
+ @wraps(func)
10
+ def wrapper(*args, **kwargs):
11
+ try:
12
+ return func(*args, **kwargs)
13
+ except Exception as e:
14
+ log_fn = getattr(logging, level, logging.error)
15
+ log_fn(
16
+ f"{func.__name__} failed | args={args}, kwargs={kwargs} | error={e}",
17
+ exc_info=True
18
+ )
19
+ return default_return
20
+ return wrapper
21
+ return decorator
@@ -0,0 +1,102 @@
1
+ Metadata-Version: 2.1
2
+ Name: neurostats_API
3
+ Version: 1.0.0rc1
4
+ Summary: The service of NeuroStats website
5
+ Home-page: https://github.com/NeurowattStats/NeuroStats_API.git
6
+ Author: JasonWang@Neurowatt
7
+ Author-email: jason@neurowatt.ai
8
+ Requires-Python: >=3.6
9
+ Description-Content-Type: text/markdown
10
+ Requires-Dist: numpy
11
+ Requires-Dist: pandas
12
+ Requires-Dist: pymongo
13
+ Requires-Dist: pytz
14
+ Requires-Dist: python-dotenv
15
+ Requires-Dist: yfinance
16
+ Requires-Dist: holidays
17
+
18
+ # neurostats_API
19
+
20
+ - [檔案架構](#檔案架構)
21
+ - [下載](#下載)
22
+ - [使用方法](#使用方法)
23
+
24
+ ## 檔案架構
25
+
26
+ ```
27
+ ./neurostats_API
28
+ ├── async_mode
29
+ │ ├── db
30
+ │ ├── db_extractors
31
+ │ │ ├── daily
32
+ │ │ ├── month_revenue
33
+ │ │ └── seasonal
34
+ │ ├── factory
35
+ │ └── fetchers
36
+ ├── config
37
+ │ ├── company_list
38
+ │ ├── tej_db
39
+ │ └── twse
40
+ ├── fetchers
41
+ ├── transformers
42
+ │ ├── balance_sheet
43
+ │ ├── cash_flow
44
+ │ ├── daily_chip
45
+ │ │ └── utils
46
+ │ ├── daily_tech
47
+ │ │ └── utils
48
+ │ ├── finance_overview
49
+ │ ├── month_revenue
50
+ │ ├── profit_lose
51
+ │ ├── tej
52
+ │ └── value
53
+ └── utils
54
+ ```
55
+ - `neurostats_API`: 主要的package運行內容
56
+ - `async_mode`: \[新版新增\]以非同步方式進行DB資料的取得以及回傳資料
57
+ - `/db`: 連接到伺服器下的特定db
58
+ - `/db_extractor`: 決定取得db下的哪個collection的檔案,以及取得檔案內容
59
+ ` `/factory`: 使extractor的初始化變得通用
60
+ - `/fetchers`: 開發者將此套件用於其他專案的接口
61
+ - `fetchers`: (舊版)回傳service內容的fetcher檔案夾
62
+ - `transformers`: \[新版新增\] 處理從DB取出的資料,以dictionary的方式回傳需要的資料
63
+ - `config`: 【新舊通用】存放各種設定檔的dictionary,例如公司名單、各項指標對應的計算欄位、每個項目屬於哪份財報等設定
64
+ - `utils`: 【新舊通用】class之間通用的函式,例如讀取檔案、計算成長率函式、轉換格式與進位等
65
+
66
+ ## 下載
67
+ ```
68
+ pip install neurostats-API
69
+ ```
70
+ ### 確認下載成功
71
+ ```Python
72
+ >>> import neurostats_API
73
+ >>> print(neurostats_API.__version__)
74
+ 1.0.0rc1
75
+ ```
76
+
77
+ ### 下載舊版
78
+ ```
79
+ pip install neurostats-API==0.0.25
80
+ ```
81
+
82
+ ## 使用方式 (以Balance_Sheet為例)
83
+ ### Async Mode
84
+ ```
85
+ from neurostats_API.async_mode.fetchers import AsyncBalanceSheetFetcher
86
+ from pymongo import AsyncMongoClient
87
+
88
+ db_client = AsyncMongoClient("<伺服器的MONGO_URI>")
89
+ ticker = "2330"
90
+
91
+ fetcher = AsyncBalanceSheetFetcher(ticker, db_client)
92
+
93
+ data = await fetcher.query_data()
94
+
95
+ print(data)
96
+ ```
97
+ 詳細各個fetcher的使用法請到[async_mode的fetchers資料夾下觀看](./neurostats_API/async_mode/fetchers/README.md)
98
+
99
+ ### Sync Mode
100
+ (#TODO)
101
+
102
+ > 舊版使用方法請到[fetchers資料夾下觀看](./neurostats_API/fetchers/README.md)
@@ -0,0 +1,119 @@
1
+ neurostats_API/__init__.py,sha256=WELjgN6N6r4KIzw_tmKuk3TIyUBFcnxHUhKY0tBDqSM,323
2
+ neurostats_API/cli.py,sha256=UJSWLIw03P24p-gkBb6JSEI5dW5U12UvLf1L8HjQD-o,873
3
+ neurostats_API/main.py,sha256=QcsfmWivg2Dnqw3MTJWiI0QvEiRs0VuH-BjwQHFCv00,677
4
+ neurostats_API/async_mode/__init__.py,sha256=arSINQm3O3g-IwfOSLsGraEj2icJbkuW0t5HLPQ4Xk8,348
5
+ neurostats_API/async_mode/db/__init__.py,sha256=7g0OJXgPsIDWRmH25h666cLlvVYpEDyWGXAVCHsNht0,86
6
+ neurostats_API/async_mode/db/base.py,sha256=63kW2cKBSrs0B4RJaX_3Jv12UYD2APH8sRh2UEVKucw,676
7
+ neurostats_API/async_mode/db/tej.py,sha256=ku7CfhrSJ8gfUQ_NRjyjSz-OFmqyCGGnXz8Tpue5gP0,324
8
+ neurostats_API/async_mode/db/twse.py,sha256=YZA-NUZ01EAUKPsaNEaZn3cuzeL9n1fi03aBiHUJGAA,220
9
+ neurostats_API/async_mode/db/us.py,sha256=SgoU_OpSkpmrlBiNvy5xgyssb7-xK8ptezi4SR00t4I,271
10
+ neurostats_API/async_mode/db_extractors/__init__.py,sha256=KAjeAL3XanXIhsPz_1uVAsvAoezL9KHdYjO8WEsNxPQ,452
11
+ neurostats_API/async_mode/db_extractors/base.py,sha256=3Xgdl6A5x93Qg7zMyJJFdE9ZMxsSDFtmXQ-i3gmnpjQ,1831
12
+ neurostats_API/async_mode/db_extractors/daily/__init__.py,sha256=crXYyPT-LnEWsMFMoOtW3iD4VDXe8EHfYH_IcdfLoRs,232
13
+ neurostats_API/async_mode/db_extractors/daily/base.py,sha256=U7cxKHIqSITEoDxqShN-3k7_pzLW-VnKLSsXo-eQh0s,2925
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
16
+ neurostats_API/async_mode/db_extractors/daily/twse_chip.py,sha256=pl8vRJuPr0bpSnumGPX28xlyQAp9QuXM86chigccbYI,1375
17
+ neurostats_API/async_mode/db_extractors/daily/value.py,sha256=j5QjFOhmvVum0D10prcZZ7_sxrojA-b8sP72Ge9lOnY,2859
18
+ neurostats_API/async_mode/db_extractors/daily/yf.py,sha256=GewIRJ7_baBc9QL7BHVdnxQ0uXYpFNeiPuwKxzByULg,377
19
+ neurostats_API/async_mode/db_extractors/month_revenue/__init__.py,sha256=VXjEn4xnXsPpt8lq7egSM_3sLnhtOIQG2lNedDC_Shw,50
20
+ neurostats_API/async_mode/db_extractors/month_revenue/base.py,sha256=pXK6MEQtwChZl3J3yGIFmGDbKaoS4tJFjgSEUkqjGQw,4271
21
+ neurostats_API/async_mode/db_extractors/month_revenue/twse.py,sha256=54HT6ISZYC9uFx-YAcWQN4r3rKuZN0fbC5zgsJE46Ic,197
22
+ neurostats_API/async_mode/db_extractors/seasonal/__init__.py,sha256=sotZHTbuGH2am48hb0bIGVs3K_14PgMKsO-FEQzF0dI,236
23
+ neurostats_API/async_mode/db_extractors/seasonal/balance_sheet.py,sha256=67OzGUxZbt7LQ9m3uTcnPPhEYQ17ygEH-Kv1eaR1X2Y,560
24
+ neurostats_API/async_mode/db_extractors/seasonal/base.py,sha256=3mSoh-zmxx2gc57MD1Uii073_BqGCohwYJJjBbXHz5w,4352
25
+ neurostats_API/async_mode/db_extractors/seasonal/cashflow.py,sha256=2yOIOMFic9DTeEyhD2xD_tGrtSWb-LirUnN1a5ka_3A,293
26
+ neurostats_API/async_mode/db_extractors/seasonal/profit_lose.py,sha256=AMKMVIVIBWTRk2b_A33OUuTLrCwc-xYj5fIL4YjLnug,564
27
+ neurostats_API/async_mode/db_extractors/seasonal/tej.py,sha256=SqObDqR3uOnxXGF12VQz7Rzw7B5YAimY1-nR0ImLkaY,2591
28
+ neurostats_API/async_mode/factory/__init__.py,sha256=7dw36HPjV9JHfEBF7n1pA8i4f-07ACKREnGMUHxh7KY,45
29
+ neurostats_API/async_mode/factory/extractor_factory.py,sha256=6dV_-zAtLj6WDbc0N0hRPy7RWl-4ppAyAy1YCbWii0M,4530
30
+ neurostats_API/async_mode/factory/transformer_factory.py,sha256=atw_-wPz2JZpJscPVE2jvFB6QNwwmcRNKQH9iai-13E,4942
31
+ neurostats_API/async_mode/fetchers/__init__.py,sha256=shPoPjwcKXGmW9dwQr89amkcRnGc1SXlHIukMVgwOpw,510
32
+ neurostats_API/async_mode/fetchers/balance_sheet.py,sha256=wzlXW5gPh5S5MD5jIUB_yeEL_aW2_CeX2DNKBio0-EA,1129
33
+ neurostats_API/async_mode/fetchers/base.py,sha256=fWlPmvsQWHcgv8z36BsXj8Y92-VKmr8cUW1EjkqI3_8,1785
34
+ neurostats_API/async_mode/fetchers/cash_flow.py,sha256=uj2JEbilgn595yJcMNvlTZHdkvu7E9y2e7rqs_ne270,2130
35
+ neurostats_API/async_mode/fetchers/finance_overview.py,sha256=nBjKPqrzhXrYvBMbhvzCygRpKR2xV3tPvNX5foiuBSY,4570
36
+ neurostats_API/async_mode/fetchers/month_revenue.py,sha256=GDrFrjTe81uAzeKvd5HghH9iPXouXL8JTt8hfaFkig4,1258
37
+ neurostats_API/async_mode/fetchers/profit_lose.py,sha256=-YMqO6hEbGntAeAf9y66LX56fj6VrHWr1_IIbQ_bUBQ,1483
38
+ neurostats_API/async_mode/fetchers/tech.py,sha256=4qMnnZCOa3qL9wuch5BatPkt737Q4D6TVtRnhUfuLt0,6704
39
+ neurostats_API/async_mode/fetchers/tej.py,sha256=PfYA0ap7ebWMpffVT9tmLFdwHWETAU7MKLFxAjOlg-E,2802
40
+ neurostats_API/async_mode/fetchers/twse_institution.py,sha256=DKyecoIa_2-CUfDXKp2dBFJk0lfCBIr2steVVa-jq9o,2055
41
+ neurostats_API/async_mode/fetchers/twse_margin.py,sha256=wra84uFh9ooCoyFWhRuV4vP3Uhojc13XHx51UD90uYo,3173
42
+ neurostats_API/async_mode/fetchers/value.py,sha256=7FpO0_BOOvq4ZlwwaIfSD8xO_s1O8ykxz147fkiZIt4,2883
43
+ neurostats_API/config/company_list/ticker_index_industry_map.json,sha256=JPSrkMrxOg5GB6HoOhOKeCatznvGAFJpWt92iAhutak,162681
44
+ neurostats_API/config/company_list/tw.json,sha256=VWaDFvd0ACCVSWItcHHpmVuM_RzP71jLZl9RBHztu-0,51332
45
+ neurostats_API/config/company_list/us.json,sha256=XtXr6Pm1KO1fPrXtzuvKgI1_wzUzJk5pjXwNJ-lnTWk,445260
46
+ neurostats_API/config/company_list/us_TradingView_list.json,sha256=SlHgFY5n0dHrEw5vD15NyXNob9pDk181p5wPiXxqlhA,1226883
47
+ neurostats_API/config/tej_db/tej_db_index.yaml,sha256=lu-cmbB6dhx0eUlBSkyzXWqPKlwRtEvqlMTAh2y0oHs,969
48
+ neurostats_API/config/tej_db/tej_db_percent_index.yaml,sha256=xSgmamEK0DUBKRllUb94p9TxhJln_BzFoFYK9OJ0fkM,302
49
+ neurostats_API/config/tej_db/tej_db_skip_index.yaml,sha256=sFn7kMCd3xZOZCkVNLsWaMtveDoUB8L49FnutyMeWHA,234
50
+ neurostats_API/config/tej_db/tej_db_thousand_index.yaml,sha256=K2YFBSrxqX1V2upy0IUeQ4ung4aPrjtlqYSvCGaaO8I,479
51
+ neurostats_API/config/twse/balance_sheet.yaml,sha256=6XygNG_Ybb1Xkk1e39LMLKr7ATvaCP3xxuwFbgNl6dA,673
52
+ neurostats_API/config/twse/cash_flow_percentage.yaml,sha256=fk2Z4eb1JjGFvP134eJatHacB7BgTkBenhDJr83w8RE,1345
53
+ neurostats_API/config/twse/finance_overview_dict.yaml,sha256=B9nV75StXkrF3yv2-eezzitlJ38eEK86RD_VY6588gQ,2884
54
+ neurostats_API/config/twse/profit_lose.yaml,sha256=L04XeZ4OjPHIQUbLgTmP9icFfeEc_oqdMX5DJD8-BZQ,2915
55
+ neurostats_API/config/twse/seasonal_data_field_dict.txt,sha256=X8yc_el6p8BH_3FikTqBVFGsvWdXT6MHXLfKfi44334,8491
56
+ neurostats_API/fetchers/__init__.py,sha256=WTssemcLX2lUq_mM6yz365N3VULJIfISm30qVPLWdjE,540
57
+ neurostats_API/fetchers/balance_sheet.py,sha256=5DxcG8Ux2e0WRmPp-7eIK33oiipoQVRlXMtvtH0bknI,6934
58
+ neurostats_API/fetchers/base.py,sha256=fHdZJtBZ6OD1IUbW6sUTXsPJVWrj41Ay4TOJChp2keI,7236
59
+ neurostats_API/fetchers/cash_flow.py,sha256=OmimJ1afsU8hyJr5GSBhIWvYjtldnoPLSmjuJ1XXriQ,8003
60
+ neurostats_API/fetchers/finance_overview.py,sha256=9XWDtpReONYXRVY184uI4ilNT26udVtLm_6vEWortcs,38197
61
+ neurostats_API/fetchers/institution.py,sha256=YsPRnM2M25plhrgSQ6ckO7gj_toydBXYlR6OtPrp_0o,15380
62
+ neurostats_API/fetchers/margin_trading.py,sha256=0enMPpq0J55uts0nJFHOylXvLEMWZYSb-gt1BH5_gBM,11430
63
+ neurostats_API/fetchers/month_revenue.py,sha256=K1WZct6vLU3y_8uaXR3po5jzx2w3EYb2v3XkIX2_pBE,8313
64
+ neurostats_API/fetchers/profit_lose.py,sha256=MUTPPXHWZhhvcq1YzrY1dalFIXljUUG3UugXQimFy-Y,9170
65
+ neurostats_API/fetchers/tech.py,sha256=TsS8m25Otc3_2jTYITFe-wNHlDWcfWsHIxhOrqL8qMY,16016
66
+ neurostats_API/fetchers/tej_finance_report.py,sha256=mlIm2Qzs8-Xlzeb8uET8qGPWD3VGUx3g8qFFcY4UbAw,13022
67
+ neurostats_API/fetchers/value_invest.py,sha256=QxQS2GcoLIU9ZBDEo8iRK2yHd8YLmBS70Bq42F3IsSw,8295
68
+ neurostats_API/transformers/__init__.py,sha256=AJ0SkJ9P65gbdHPSygYw1X2I-KRJO20q20lLVP-JViE,676
69
+ neurostats_API/transformers/base.py,sha256=ju6PCoc9CNo-sdGCYnozQ2_l8KBSHEEe5W2ua8HxzR0,3422
70
+ neurostats_API/transformers/balance_sheet/__init__.py,sha256=RCScBsR3zeC5UdyuiHD1CGRQufoFL5LkN8WbtI5JeA4,87
71
+ neurostats_API/transformers/balance_sheet/base.py,sha256=sEap9uHe-nri8F4gPV_FCVm0Qe6KWgpHt6a2ryAPd_8,1676
72
+ neurostats_API/transformers/balance_sheet/twse.py,sha256=ZJKfRN4HkmmcbJsYY3t1Q6ufq0ri8btba5O9EhREW_g,2710
73
+ neurostats_API/transformers/balance_sheet/us.py,sha256=WS1JjShLcs9oGov4Bdaggs_eTIzb8SSutVKKKbAK7Ts,897
74
+ neurostats_API/transformers/cash_flow/__init__.py,sha256=KJs5kfjRV0ahy842ZVLvQuZS02YxT-w0cMNHfU0ngFE,79
75
+ neurostats_API/transformers/cash_flow/base.py,sha256=6Lt44O-xg658-jEFYBHOF2cgD0PGiKK43257uQMSetk,4392
76
+ neurostats_API/transformers/cash_flow/twse.py,sha256=_ZIiZrjXSBCxgpXRgXe8MYWFWlDSVQVEb06P90LOezA,2351
77
+ neurostats_API/transformers/cash_flow/us.py,sha256=nRJajeDz4HNkv42NosoP0Jir4tIA0ybhIZu9zHkjAEM,1304
78
+ neurostats_API/transformers/daily_chip/__init__.py,sha256=e-yvQ94J3dkzRbhZwOiAkyt_ub9bRQ7pAVDbO-61Grw,43
79
+ neurostats_API/transformers/daily_chip/base.py,sha256=KBsnpACakJh2W-k4Kvv-dVNnSNbUCGMeqvQsTQkz-aE,184
80
+ neurostats_API/transformers/daily_chip/tej.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
+ neurostats_API/transformers/daily_chip/twse_chip.py,sha256=QZlbOCOSRH0ds1NZjJdQWfHhVfmkmAS9G5zM64dhAis,14663
82
+ neurostats_API/transformers/daily_chip/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
+ neurostats_API/transformers/daily_chip/utils/institution.py,sha256=1Zj9mxIhvwkmA599a1OYmdorPEAN_U3sl8uhvddxUW0,3384
84
+ neurostats_API/transformers/daily_chip/utils/margin_trading.py,sha256=oVY_OW63pcSc1TyM_jSPNAoj4HLyZCRshkdsHQsnxyk,38
85
+ neurostats_API/transformers/daily_chip/utils/security_lending.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
+ neurostats_API/transformers/daily_tech/__init__.py,sha256=xWOXQlK0Yo0SmH-2twdiOUXgl1w3RYZ-0R4mh7AnAKg,38
87
+ neurostats_API/transformers/daily_tech/base.py,sha256=95pN3EussgbYbDCwCP8x4aVnJtGpuEe8b1y1W53CTzA,185
88
+ neurostats_API/transformers/daily_tech/tech.py,sha256=bPAIAm28zxsEBjYvHeGaGHqg8wt7Zv7GtupICT8vJD4,2633
89
+ neurostats_API/transformers/daily_tech/utils/__init__.py,sha256=QvkOMEvBW5pIMjTKDBiyaJKq4_Z2NtpbLD7fiu_U6XM,36
90
+ neurostats_API/transformers/daily_tech/utils/processor.py,sha256=9zOjVFyWqzRXD5jIq2YkBGI4WZ8HFrI_ufssZgvKpdc,9314
91
+ neurostats_API/transformers/finance_overview/__init__.py,sha256=mWFn13YrugExrSQ7oJvnvP95W20_rQ1wOesrZY3XnSU,107
92
+ neurostats_API/transformers/finance_overview/agent_overview.py,sha256=DA7zLTslqiYCKIzC8wKKJK7f2cz2KpTOhqy-qDQmDrc,1974
93
+ neurostats_API/transformers/finance_overview/base.py,sha256=uksr5sUhbaL12ZBH3cUtR1Q0NzpQ8C36FwfwluB8uYE,29669
94
+ neurostats_API/transformers/finance_overview/stats_overview.py,sha256=pRstGTw7flYQ8nDFHA8BioWRGXBTu_T2GBuzm5us0xM,2498
95
+ neurostats_API/transformers/month_revenue/__init__.py,sha256=fNj-FNJgl7yhYeswd3UFZEcSNoDF4kL6Mkspjom2cSo,47
96
+ neurostats_API/transformers/month_revenue/base.py,sha256=cDswLIZ7UBJX3insyI3NPunxOva9Pf-6TEW15tHjn4s,1881
97
+ neurostats_API/transformers/month_revenue/twse.py,sha256=-QhPI3hRc7PPWmFarsbBINauv6LdwXlyR_hIR6alh34,5642
98
+ neurostats_API/transformers/profit_lose/__init__.py,sha256=oOPyakP1wDnmq7bsxgEm4vu1uWtUR34dd3Oegk9kvq0,83
99
+ neurostats_API/transformers/profit_lose/base.py,sha256=BJZjE1GmWBI3ayjDkzrtQTrn0vjTSVckPbrQ_u6zEl0,3125
100
+ neurostats_API/transformers/profit_lose/twse.py,sha256=kpIEk7D309umdt5xRvmMDvNfuwS53CwqpIhczCKwrCo,5402
101
+ neurostats_API/transformers/profit_lose/us.py,sha256=QzAd2N_1Dqqb2TEPCLkqxsfp62gOMffbSOgr6FFODRM,804
102
+ neurostats_API/transformers/tej/__init__.py,sha256=WihARZhphkvApsKr4U0--68m1M-Dc_rpV7xoV2fUV7E,61
103
+ neurostats_API/transformers/tej/base.py,sha256=YD6M3Iok-KXb5EDhqa_fUzJ-zWXLeoXPsavdDJD-ks4,5436
104
+ neurostats_API/transformers/tej/finance_statement.py,sha256=lTRZKJIrnDBJu4tGvaMBAQ6Ps_yixXWc1FsGJAHsA90,2804
105
+ neurostats_API/transformers/value/__init__.py,sha256=D8qMk0aLsv7CBBJHo5zsq_UuBKmZYNyqS3s-RWfhvy8,73
106
+ neurostats_API/transformers/value/base.py,sha256=wR2LDiwGET126mwrPxYoApyl4lwx1MjWxFpOKLso_As,186
107
+ neurostats_API/transformers/value/tej.py,sha256=csk0kLCrvXN7T_j9KkvXRRJreWZK6t3bYlPEfWcfBTo,244
108
+ neurostats_API/transformers/value/twse.py,sha256=DbBqnKmaY0ceR1Q7PWiIF6CjI8eLshwQkR9zIj0xQSc,1432
109
+ neurostats_API/utils/__init__.py,sha256=ZPLgh-MNOhskDhWzabLXAyZIjwJgX-sE5YlWJHEWfUw,222
110
+ neurostats_API/utils/calculate_value.py,sha256=ioPV5VWitJ2NylBi5vwfs-payAUYxWhAiS7aaJjzQKQ,4305
111
+ neurostats_API/utils/data_process.py,sha256=cD1Vzv8oDpsd1Y7qCALTyM-AP1nkwqhfOgDY0KQpXec,10442
112
+ neurostats_API/utils/datetime.py,sha256=XJya4G8b_-ZOaBbMXgQjWh2MC4wc-o6goQ7EQJQMWrQ,773
113
+ neurostats_API/utils/db_client.py,sha256=OYe6yazcR4Aa6jYmy47JrryUeh2NnKGqY2K_lSZe6i8,455
114
+ neurostats_API/utils/exception.py,sha256=yv92GVh5uHV1BgRmO4DwJcX_PtE0-TSgQoo3VnZ5hOQ,277
115
+ neurostats_API/utils/logger.py,sha256=egBiiPGTi5l1FoX_o6EvdGh81R0_k8hFPctSxq8RCoo,693
116
+ neurostats_API-1.0.0rc1.dist-info/METADATA,sha256=86hApbJb36N44lqvTcbsh2QRV9uvOSXwtruFLt0EWB8,2964
117
+ neurostats_API-1.0.0rc1.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
118
+ neurostats_API-1.0.0rc1.dist-info/top_level.txt,sha256=nSlQPMG0VtXivJyedp4Bkf86EOy2TpW10VGxolXrqnU,15
119
+ neurostats_API-1.0.0rc1.dist-info/RECORD,,