neurostats-API 0.0.23b1__py3-none-any.whl → 0.0.24__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.
@@ -8,6 +8,11 @@ class ValueFetcher(StatsFetcher):
8
8
 
9
9
  def __init__(self, ticker: str, db_client):
10
10
  super().__init__(ticker, db_client)
11
+ self.value_keys = [
12
+ "P_E", "P_FCF", "P_B", "P_S",
13
+ "EV_OPI", "EV_EBIT", "EV_EBITDA", "EV_S",
14
+ "Yield"
15
+ ]
11
16
 
12
17
  def prepare_query(self, start_date, end_date):
13
18
  pipeline = super().prepare_query()
@@ -54,7 +59,8 @@ class ValueFetcher(StatsFetcher):
54
59
  "EV_OPI": "$$daily_item.EV_OPI",
55
60
  "EV_EBIT": "$$daily_item.EV_EBIT",
56
61
  "EV_EBITDA": "$$daily_item.EV_EBITDA",
57
- "EV_S": "$$daily_item.EV_S"
62
+ "EV_S": "$$daily_item.EV_S",
63
+ "Yield": "$$daily_item.Yield"
58
64
  }
59
65
  }
60
66
  },
@@ -89,10 +95,13 @@ class ValueFetcher(StatsFetcher):
89
95
  fetched_data = self.collect_data(start_date, end_date)
90
96
 
91
97
  fetched_data['daily_data'] = fetched_data['daily_data'][-1]
98
+ for key in self.value_keys:
99
+ fetched_data['daily_data'][key] = fetched_data['daily_data'].get(key, None)
92
100
 
93
101
  fetched_data['yearly_data'] = ValueProcessor.transform_to_df(
94
102
  fetched_data['daily_data'],
95
103
  fetched_data['yearly_data'],
104
+ required_keys=self.value_keys
96
105
  )
97
106
 
98
107
  return fetched_data
@@ -110,7 +119,8 @@ class ValueFetcher(StatsFetcher):
110
119
  EV_OPI,
111
120
  EV_EBIT,
112
121
  EV_EBITDA,
113
- EV_S
122
+ EV_S,
123
+ Yield
114
124
  }
115
125
  """
116
126
 
@@ -142,7 +152,8 @@ class ValueFetcher(StatsFetcher):
142
152
  "EV_OPI": "$$daily.EV_OPI",
143
153
  "EV_EBIT": "$$daily.EV_EBIT",
144
154
  "EV_EBITDA": "$$daily.EV_EBITDA",
145
- "EV_S": "$$daily.EV_S"
155
+ "EV_S": "$$daily.EV_S",
156
+ "Yield": "$$daily.Yield"
146
157
  }
147
158
  }
148
159
  }
@@ -153,15 +164,12 @@ class ValueFetcher(StatsFetcher):
153
164
  fetched_data = self.collection.aggregate(pipeline).to_list()
154
165
  fetched_data = fetched_data[0]
155
166
 
156
- value_keys = ["P_E", "P_FCF", "P_B", "P_S", "EV_OPI", "EV_EBIT", "EV_EVITDA", "EV_S"]
157
- return_dict = {value_key: dict() for value_key in value_keys}
167
+ return_dict = {value_key: dict() for value_key in self.value_keys}
168
+
169
+ for data in fetched_data['daily_data']:
170
+ for value_key in self.value_keys:
171
+ return_dict[value_key].update({data['date']: data.get(value_key, None)})
158
172
 
159
- for value_key in value_keys:
160
- for data in fetched_data['daily_data']:
161
- if (value_key not in data.keys()):
162
- continue
163
- else:
164
- return_dict[value_key].update({data['date']: data[value_key]})
165
173
 
166
174
  return_dict = {
167
175
  value_key: pd.DataFrame.from_dict(value_dict, orient='index', columns=[value_key])
@@ -173,7 +181,7 @@ class ValueFetcher(StatsFetcher):
173
181
  class ValueProcessor(StatsProcessor):
174
182
 
175
183
  @staticmethod
176
- def transform_to_df(daily_dict, yearly_dict):
184
+ def transform_to_df(daily_dict: dict, yearly_dict: dict, required_keys: list):
177
185
  latest_data = {"year": f"過去4季"}
178
186
 
179
187
  latest_data.update(daily_dict)
@@ -184,4 +192,16 @@ class ValueProcessor(StatsProcessor):
184
192
 
185
193
  yearly_dict = pd.DataFrame.from_dict(yearly_dict)
186
194
 
195
+ total_keys = [
196
+ # 年度評價
197
+ 'year', 'P_E', 'P_FCF', 'P_B', 'P_S',
198
+ 'EV_OPI', 'EV_EBIT', 'EV_EBITDA','EV_S',
199
+
200
+ # 最新一日交易
201
+ 'open', 'high', 'low', 'close', 'volume', 'dividends',
202
+ 'stock splits', 'Yield', 'dividend_year', 'finance_report_time'
203
+ ]
204
+
205
+ total_keys_list = list(total_keys)
206
+ yearly_dict = yearly_dict.reindex(columns=total_keys, fill_value=None)
187
207
  return yearly_dict
@@ -29,9 +29,6 @@ TWN/AINVFQ1:
29
29
  - r607
30
30
  - r613
31
31
  - r612
32
- - r609
33
- - r614
34
- - r611
35
32
  TWN/AFESTM1:
36
33
  - r105
37
34
  - r106
@@ -1,4 +1,5 @@
1
1
  from .data_process import StatsProcessor
2
+ import numpy as np
2
3
  class YoY_Calculator:
3
4
  def __init__(self):
4
5
  pass
@@ -23,6 +24,9 @@ class YoY_Calculator:
23
24
 
24
25
  if (isinstance(YoY, complex)): # 年化成長率有複數問題
25
26
  return None
27
+
28
+ if YoY != YoY: # 確認是否為nan (Python 中 nan不等於自己)
29
+ return None
26
30
 
27
31
  return YoY
28
32
  @classmethod
@@ -91,7 +95,6 @@ class YoY_Calculator:
91
95
  for key in list(this_data.keys()):
92
96
  if key == "season":
93
97
  continue
94
-
95
98
 
96
99
  value = this_data.get(key, None)
97
100
 
@@ -102,7 +105,7 @@ class YoY_Calculator:
102
105
  temp_dict = {"value": value}
103
106
  this_value = value
104
107
 
105
- this_value = StatsProcessor.process_str_to_float(this_data[key])
108
+ this_value = StatsProcessor.process_str_to_float(this_value)
106
109
 
107
110
  last_value = data_dict.get(
108
111
  f"{last_year}Q{last_season}",{}
@@ -191,7 +191,11 @@ class StatsProcessor:
191
191
  @classmethod
192
192
  def cal_percentage(cls, value, postfix="%"):
193
193
  if (isinstance(value, (float, int))):
194
+ if (np.isnan(value)):
195
+ return None
194
196
  value = np.round(value * 100, 2).item()
197
+ if (value != value): # nan值發生
198
+ return None
195
199
  value = f"{value:.2f}{postfix}"
196
200
 
197
201
  return value
@@ -202,10 +206,11 @@ class StatsProcessor:
202
206
  @classmethod
203
207
  def cal_non_percentage(cls, value, to_str=False, postfix="元"):
204
208
  if (isinstance(value, (float, int))):
205
-
209
+ if (np.isnan(value)):
210
+ return None
206
211
  value = np.round(value, 2).item()
207
212
  if (postfix == "千元"):
208
- value *= 1000
213
+ value = value * 1000
209
214
  try:
210
215
  value = int(value)
211
216
  except Exception as e:
@@ -283,16 +288,17 @@ class StatsProcessor:
283
288
  if (key):
284
289
  keys = [key]
285
290
  for data in data_list:
286
- data = data['data']
287
291
 
288
292
  pop_keys = []
289
293
 
290
294
  for key in keys:
291
295
  assert (key in data.keys())
292
296
  pop_keys.append(str(data.pop(key)))
293
-
297
+
294
298
  pop_key = delimeter.join(pop_keys)
295
- return_dict[pop_key] = data[data_key]
299
+ target_data = data.get(data_key, data)
300
+
301
+ return_dict[pop_key] = target_data
296
302
 
297
303
  return return_dict
298
304
 
@@ -302,5 +308,5 @@ class StatsProcessor:
302
308
  value = value.replace("%", "")
303
309
  try:
304
310
  return float(value)
305
- except (ValueError, TypeError):
311
+ except (ValueError, TypeError) as e:
306
312
  return None
@@ -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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: neurostats_API
3
- Version: 0.0.23b1
3
+ Version: 0.0.24
4
4
  Summary: The service of NeuroStats website
5
5
  Home-page: https://github.com/NeurowattStats/NeuroStats_API.git
6
6
  Author: JasonWang@Neurowatt
@@ -89,7 +89,7 @@ pip install neurostats-API
89
89
  ```Python
90
90
  >>> import neurostats_API
91
91
  >>> print(neurostats_API.__version__)
92
- 0.0.23b
92
+ 0.0.23
93
93
  ```
94
94
 
95
95
  ### 得到最新一期的評價資料與歷年評價
@@ -0,0 +1,36 @@
1
+ neurostats_API/__init__.py,sha256=nUg0aKz0ncXl7wfHthqrmQmVDlUkLKEcjR7ARy_lgWU,288
2
+ neurostats_API/cli.py,sha256=UJSWLIw03P24p-gkBb6JSEI5dW5U12UvLf1L8HjQD-o,873
3
+ neurostats_API/main.py,sha256=QcsfmWivg2Dnqw3MTJWiI0QvEiRs0VuH-BjwQHFCv00,677
4
+ neurostats_API/fetchers/__init__.py,sha256=KCw-yRSDFa3fw83u73LJ9OVop7gRl_YQYlQq-cITxuo,511
5
+ neurostats_API/fetchers/balance_sheet.py,sha256=h5vQAzqCRrIfSwA4ZFAnCOT-BPIFdhQf5ZPz6YqcKCE,6938
6
+ neurostats_API/fetchers/base.py,sha256=fHdZJtBZ6OD1IUbW6sUTXsPJVWrj41Ay4TOJChp2keI,7236
7
+ neurostats_API/fetchers/cash_flow.py,sha256=OmimJ1afsU8hyJr5GSBhIWvYjtldnoPLSmjuJ1XXriQ,8003
8
+ neurostats_API/fetchers/finance_overview.py,sha256=xRn4UF2iMS13ztsFgBFj4UykyJsWMriuUevNeZHQR7E,27815
9
+ neurostats_API/fetchers/institution.py,sha256=U7N6QenW5XANGI2L-a7tY2agR1iYY8LI6gUarQYS9N8,15250
10
+ neurostats_API/fetchers/macro_daily_event.py,sha256=bThpI17Tk1wVYeuJ56mqoXbV_svJ7Hl1ftY9_9u8WJs,234
11
+ neurostats_API/fetchers/margin_trading.py,sha256=0enMPpq0J55uts0nJFHOylXvLEMWZYSb-gt1BH5_gBM,11430
12
+ neurostats_API/fetchers/month_revenue.py,sha256=K1WZct6vLU3y_8uaXR3po5jzx2w3EYb2v3XkIX2_pBE,8313
13
+ neurostats_API/fetchers/profit_lose.py,sha256=MUTPPXHWZhhvcq1YzrY1dalFIXljUUG3UugXQimFy-Y,9170
14
+ neurostats_API/fetchers/tech.py,sha256=TsS8m25Otc3_2jTYITFe-wNHlDWcfWsHIxhOrqL8qMY,16016
15
+ neurostats_API/fetchers/tej_finance_report.py,sha256=mlIm2Qzs8-Xlzeb8uET8qGPWD3VGUx3g8qFFcY4UbAw,13022
16
+ neurostats_API/fetchers/value_invest.py,sha256=QxQS2GcoLIU9ZBDEo8iRK2yHd8YLmBS70Bq42F3IsSw,8295
17
+ neurostats_API/tools/company_list/tw.json,sha256=VWaDFvd0ACCVSWItcHHpmVuM_RzP71jLZl9RBHztu-0,51332
18
+ neurostats_API/tools/tej_db/tej_db_index.yaml,sha256=lu-cmbB6dhx0eUlBSkyzXWqPKlwRtEvqlMTAh2y0oHs,969
19
+ neurostats_API/tools/tej_db/tej_db_percent_index.yaml,sha256=xSgmamEK0DUBKRllUb94p9TxhJln_BzFoFYK9OJ0fkM,302
20
+ neurostats_API/tools/tej_db/tej_db_skip_index.yaml,sha256=6UtMfPL7XvkKvEWTFXIIUZMJWZSagIduLYJb-r3HEg8,246
21
+ neurostats_API/tools/tej_db/tej_db_thousand_index.yaml,sha256=K2YFBSrxqX1V2upy0IUeQ4ung4aPrjtlqYSvCGaaO8I,479
22
+ neurostats_API/tools/twse/balance_sheet.yaml,sha256=6XygNG_Ybb1Xkk1e39LMLKr7ATvaCP3xxuwFbgNl6dA,673
23
+ neurostats_API/tools/twse/cash_flow_percentage.yaml,sha256=fk2Z4eb1JjGFvP134eJatHacB7BgTkBenhDJr83w8RE,1345
24
+ neurostats_API/tools/twse/finance_overview_dict.yaml,sha256=B9nV75StXkrF3yv2-eezzitlJ38eEK86RD_VY6588gQ,2884
25
+ neurostats_API/tools/twse/profit_lose.yaml,sha256=iyp9asYJ04vAxk_HBUDse_IBy5oVvYHpwsyACg5YEeg,3029
26
+ neurostats_API/tools/twse/seasonal_data_field_dict.txt,sha256=X8yc_el6p8BH_3FikTqBVFGsvWdXT6MHXLfKfi44334,8491
27
+ neurostats_API/utils/__init__.py,sha256=uZk08lGPvVIc7MKAvRdZ2FJzgfa8GzsWG_hWAhF6C5U,152
28
+ neurostats_API/utils/calculate_value.py,sha256=ioPV5VWitJ2NylBi5vwfs-payAUYxWhAiS7aaJjzQKQ,4305
29
+ neurostats_API/utils/data_process.py,sha256=xt5BkXK1zWJaL3ZFyXXmxwsU_YfB66VMZAYBI2Mgm6E,10187
30
+ neurostats_API/utils/datetime.py,sha256=XJya4G8b_-ZOaBbMXgQjWh2MC4wc-o6goQ7EQJQMWrQ,773
31
+ neurostats_API/utils/db_client.py,sha256=OYe6yazcR4Aa6jYmy47JrryUeh2NnKGqY2K_lSZe6i8,455
32
+ neurostats_API/utils/logger.py,sha256=egBiiPGTi5l1FoX_o6EvdGh81R0_k8hFPctSxq8RCoo,693
33
+ neurostats_API-0.0.24.dist-info/METADATA,sha256=mf7iV7Pud5CLvrVZLO6c_BiodQLzillMO6HScFVLhYM,31618
34
+ neurostats_API-0.0.24.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
35
+ neurostats_API-0.0.24.dist-info/top_level.txt,sha256=nSlQPMG0VtXivJyedp4Bkf86EOy2TpW10VGxolXrqnU,15
36
+ neurostats_API-0.0.24.dist-info/RECORD,,
@@ -1,34 +0,0 @@
1
- neurostats_API/__init__.py,sha256=ItIYqBMTp2EHBeBahEWCKKGa-JIzQO2ykdQy3A-LNZY,289
2
- neurostats_API/cli.py,sha256=UJSWLIw03P24p-gkBb6JSEI5dW5U12UvLf1L8HjQD-o,873
3
- neurostats_API/main.py,sha256=QcsfmWivg2Dnqw3MTJWiI0QvEiRs0VuH-BjwQHFCv00,677
4
- neurostats_API/fetchers/__init__.py,sha256=KCw-yRSDFa3fw83u73LJ9OVop7gRl_YQYlQq-cITxuo,511
5
- neurostats_API/fetchers/balance_sheet.py,sha256=RgiX5wp9UoS7HcXHqwO_NMAFr2ESJSWJenyCwJj6rxU,6060
6
- neurostats_API/fetchers/base.py,sha256=BcGpwlA0TD8y-Uped68xPf-cZYHP9PB4UyDWgPcURe4,7155
7
- neurostats_API/fetchers/cash_flow.py,sha256=0it4hnKLKRLAFgrxrsrK2rk7dom7HvQi96z5LXh2w_c,7013
8
- neurostats_API/fetchers/finance_overview.py,sha256=dDe6THJg1UJffnJ25xwXd4K99s2DBTdGaxmCT3O-xdA,27763
9
- neurostats_API/fetchers/institution.py,sha256=UrcBc6t7u7CnEwUsf6YmLbbJ8VncdWpq8bCz17q2dgs,11168
10
- neurostats_API/fetchers/margin_trading.py,sha256=lQImtNdvaBoSlKhJvQ3DkH3HjSSgKRJz4ZZpyR5-Z4I,10433
11
- neurostats_API/fetchers/month_revenue.py,sha256=DZeOblfSz7NhQXVvL5xfMHZ1rv2B8pgqu-U-o_gcAuc,6323
12
- neurostats_API/fetchers/profit_lose.py,sha256=ZvSG4vx4gBrWMKmcyuSaoNyW6JGiOtIpFxRIeyCAeDY,7705
13
- neurostats_API/fetchers/tech.py,sha256=u0L6X19g7VmbCUXF_9UI_tBIJJ9hPareEggjXUe52_o,16079
14
- neurostats_API/fetchers/tej_finance_report.py,sha256=og3wg0Vdyzyx3Ex6ejk10ORo4zQjcrUrRtR9W1dCWNE,11320
15
- neurostats_API/fetchers/value_invest.py,sha256=b_x2Dpgs8VBU5HdG8ocKtfIEkqhU-Q0S5n6RxuFuM2g,7467
16
- neurostats_API/tools/company_list/tw.json,sha256=VWaDFvd0ACCVSWItcHHpmVuM_RzP71jLZl9RBHztu-0,51332
17
- neurostats_API/tools/tej_db/tej_db_index.yaml,sha256=lu-cmbB6dhx0eUlBSkyzXWqPKlwRtEvqlMTAh2y0oHs,969
18
- neurostats_API/tools/tej_db/tej_db_percent_index.yaml,sha256=-rBSdOoYs5UB9H6Y3FE5PTqV9meXEFZD2KhSlAQ_4Eg,323
19
- neurostats_API/tools/tej_db/tej_db_skip_index.yaml,sha256=6UtMfPL7XvkKvEWTFXIIUZMJWZSagIduLYJb-r3HEg8,246
20
- neurostats_API/tools/tej_db/tej_db_thousand_index.yaml,sha256=K2YFBSrxqX1V2upy0IUeQ4ung4aPrjtlqYSvCGaaO8I,479
21
- neurostats_API/tools/twse/balance_sheet.yaml,sha256=6XygNG_Ybb1Xkk1e39LMLKr7ATvaCP3xxuwFbgNl6dA,673
22
- neurostats_API/tools/twse/cash_flow_percentage.yaml,sha256=fk2Z4eb1JjGFvP134eJatHacB7BgTkBenhDJr83w8RE,1345
23
- neurostats_API/tools/twse/finance_overview_dict.yaml,sha256=B9nV75StXkrF3yv2-eezzitlJ38eEK86RD_VY6588gQ,2884
24
- neurostats_API/tools/twse/profit_lose.yaml,sha256=iyp9asYJ04vAxk_HBUDse_IBy5oVvYHpwsyACg5YEeg,3029
25
- neurostats_API/tools/twse/seasonal_data_field_dict.txt,sha256=X8yc_el6p8BH_3FikTqBVFGsvWdXT6MHXLfKfi44334,8491
26
- neurostats_API/utils/__init__.py,sha256=uZk08lGPvVIc7MKAvRdZ2FJzgfa8GzsWG_hWAhF6C5U,152
27
- neurostats_API/utils/calculate_value.py,sha256=Zc5DG_qXnHZLkCjUYdoMWka3KVXu2o9AmDnEYixiXYQ,4197
28
- neurostats_API/utils/data_process.py,sha256=LdDmhQMGBg1UI6cIWCdsj9YTkixtf1cyrN1xq2JZmPo,9971
29
- neurostats_API/utils/datetime.py,sha256=XJya4G8b_-ZOaBbMXgQjWh2MC4wc-o6goQ7EQJQMWrQ,773
30
- neurostats_API/utils/db_client.py,sha256=OYe6yazcR4Aa6jYmy47JrryUeh2NnKGqY2K_lSZe6i8,455
31
- neurostats_API-0.0.23b1.dist-info/METADATA,sha256=W8Ks1L96z3SeSc5moAXkDwLYVlbMildAHJH6x4D09mo,31621
32
- neurostats_API-0.0.23b1.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
33
- neurostats_API-0.0.23b1.dist-info/top_level.txt,sha256=nSlQPMG0VtXivJyedp4Bkf86EOy2TpW10VGxolXrqnU,15
34
- neurostats_API-0.0.23b1.dist-info/RECORD,,