neurostats-API 1.0.0rc3__py3-none-any.whl → 1.0.0rc5__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.
@@ -1,4 +1,4 @@
1
- __version__='1.0.0rc3'
1
+ __version__='1.0.0rc5'
2
2
 
3
3
  from .fetchers import (
4
4
  AgentFinanceOverviewFetcher,
@@ -12,4 +12,18 @@ from .fetchers import (
12
12
  TechFetcher,
13
13
  TEJStockPriceFetcher,
14
14
  ProfitLoseFetcher,
15
+ )
16
+
17
+ from .async_mode import (
18
+ AsyncAgentOverviewFetcher,
19
+ AsyncBalanceSheetFetcher,
20
+ AsyncCashFlowFetcher,
21
+ AsyncFinanceOverviewFetcher,
22
+ AsyncMonthlyRevenueFetcher,
23
+ AsyncProfitLoseFetcher,
24
+ AsyncTechFetcher,
25
+ AsyncTEJSeasonalFetcher,
26
+ AsyncTWSEInstitutionFetcher,
27
+ AsyncTWSEMarginFetcher,
28
+ AsyncTWSEStatsValueFetcher
15
29
  )
@@ -157,7 +157,7 @@ class AsyncTechFetcher(AsyncBaseFetcher):
157
157
  start_date, end_date
158
158
  )
159
159
 
160
- if (len(fetched_data) > 0):
160
+ if (fetched_data):
161
161
  df = pd.DataFrame(fetched_data)
162
162
  return df
163
163
  else:
@@ -171,7 +171,7 @@ class AsyncTechFetcher(AsyncBaseFetcher):
171
171
  start_date, end_date
172
172
  )
173
173
 
174
- if (len(fetched_data) > 0):
174
+ if (fetched_data):
175
175
  df = pd.DataFrame(fetched_data)
176
176
  df = df.rename(
177
177
  columns={
@@ -1,19 +1,24 @@
1
1
  from .base import BaseBalanceSheetTransformer
2
2
  from neurostats_API.utils import StatsProcessor
3
3
 
4
+
4
5
  class TWSEBalanceSheetTransformer(BaseBalanceSheetTransformer):
6
+
5
7
  def __init__(self, ticker, company_name, zone):
6
8
  super().__init__(ticker, company_name, zone)
7
9
 
8
- self.table_settings = StatsProcessor.load_yaml("twse/balance_sheet.yaml")
10
+ self.table_settings = StatsProcessor.load_yaml(
11
+ "twse/balance_sheet.yaml"
12
+ )
9
13
  self.return_keys = [
10
- 'balance_sheet', 'total_asset', 'current_asset', 'non_current_asset',
11
- 'current_debt', 'non_current_debt', 'equity', 'balance_sheet_all', 'balance_sheet_YoY'
14
+ 'balance_sheet', 'total_asset', 'current_asset',
15
+ 'non_current_asset', 'current_debt', 'non_current_debt', 'equity',
16
+ 'balance_sheet_all', 'balance_sheet_YoY'
12
17
  ]
13
18
 
14
19
  self.stats_df = None
15
20
  self.new_df = None
16
-
21
+
17
22
  def process_transform(self, fetched_data):
18
23
  if (not fetched_data):
19
24
  return self._get_empty_structure()
@@ -21,12 +26,10 @@ class TWSEBalanceSheetTransformer(BaseBalanceSheetTransformer):
21
26
  processed_data = self._process_fn(fetched_data)
22
27
 
23
28
  return processed_data
29
+
24
30
  def _process_fn(self, fetched_data):
25
-
26
- return_dict = {
27
- "ticker": self.ticker,
28
- "company_name": self.company_name
29
- }
31
+
32
+ return_dict = {"ticker": self.ticker, "company_name": self.company_name}
30
33
 
31
34
  target_season = fetched_data[0]['season']
32
35
 
@@ -36,18 +39,22 @@ class TWSEBalanceSheetTransformer(BaseBalanceSheetTransformer):
36
39
  # 轉換格式 (元 / 千元 / %)
37
40
  self.stats_df = StatsProcessor.expand_value_percentage(self.stats_df)
38
41
  self.stats_df = self._apply_process_unit_pipeline(
39
- self.stats_df,
40
- postfix_list=['_value', "_percentage"]
42
+ self.stats_df, postfix_list=['_value', "_percentage"]
41
43
  )
42
44
 
43
45
  self.new_df = self._process_twse_to_tej_format(fetched_data)
44
46
  # 轉換格式 (元 / 千元 / %)
45
47
  self.new_df = self._apply_process_unit_pipeline(
46
- self.new_df,
47
- postfix_list=['_value', "_percentage"]
48
+ self.new_df, postfix_list=['_value', "_percentage"]
48
49
  )
49
50
 
50
- total_table_YoY = self._slice_target_season(self.new_df.T, target_season)
51
+ self.new_dict = self.new_df.to_dict()
52
+ self.new_df = self._cal_QoQ(self.new_dict)
53
+ self.new_df = self.new_df.T
54
+
55
+ total_table_YoY = self._slice_target_season(
56
+ self.new_df, target_season
57
+ )
51
58
 
52
59
  return_dict.update(
53
60
  {
@@ -60,17 +67,15 @@ class TWSEBalanceSheetTransformer(BaseBalanceSheetTransformer):
60
67
  self._process_target_columns(return_dict, self.stats_df)
61
68
 
62
69
  return return_dict
63
-
70
+
64
71
  def _process_target_columns(self, return_dict, stats_df):
65
72
  for name, setting in self.table_settings.items():
66
73
  target_indexes = setting.get('target_index', [None])
67
74
  for target_index in target_indexes:
68
75
  try:
69
76
  return_dict[name] = StatsProcessor.slice_old_table(
70
- total_table=stats_df,
71
- target_index=target_index
77
+ total_table=stats_df, target_index=target_index
72
78
  )
73
79
  break
74
80
  except Exception as e:
75
81
  continue
76
-
@@ -1,24 +1,32 @@
1
1
  from .base import BaseBalanceSheetTransformer
2
2
  from neurostats_API.utils import StatsProcessor
3
3
 
4
+
4
5
  class USBalanceSheetTransformer(BaseBalanceSheetTransformer):
5
- def __init__(self, ticker, company_name, zone):
6
+
7
+ def __init__(self, ticker, company_name, zone):
6
8
  super().__init__(ticker, company_name, zone)
7
9
 
8
10
  self.data_df = None
9
-
11
+ self.return_keys = [
12
+ 'balance_sheet',
13
+ 'balance_sheet_YoY'
14
+ ]
15
+
10
16
  def process_transform(self, fetched_data):
11
- return_dict = {
12
- "ticker": self.ticker,
13
- "company_name": self.company_name
14
- }
17
+ if (not fetched_data):
18
+ return self._get_empty_structure()
19
+
20
+ return_dict = {"ticker": self.ticker, "company_name": self.company_name}
15
21
 
16
22
  # QoQ表格
17
23
  self.data_df = self._process_us_format(fetched_data)
18
-
24
+
19
25
  # YoY表格
20
26
  target_season = fetched_data[0]['season']
21
- total_table_YoY = self._slice_target_season(self.data_df.T, target_season)
27
+ total_table_YoY = self._slice_target_season(
28
+ self.data_df.T, target_season
29
+ )
22
30
 
23
31
  return_dict.update(
24
32
  {
@@ -27,4 +35,4 @@ class USBalanceSheetTransformer(BaseBalanceSheetTransformer):
27
35
  }
28
36
  )
29
37
 
30
- return return_dict
38
+ return return_dict
@@ -2,10 +2,12 @@ import abc
2
2
  from neurostats_API.utils import StatsProcessor, YoY_Calculator
3
3
  import pandas as pd
4
4
 
5
+
5
6
  class BaseTransformer(abc.ABC):
6
7
  """
7
8
  Transformer用途: 轉換資料為fetcher可使用的格式
8
9
  """
10
+
9
11
  def __init__(self, ticker, company_name, zone):
10
12
  self.ticker = ticker
11
13
  self.company_name = company_name
@@ -13,7 +15,6 @@ class BaseTransformer(abc.ABC):
13
15
  self.zone = zone
14
16
  self.return_keys = []
15
17
 
16
-
17
18
  @abc.abstractmethod
18
19
  def process_transform(self):
19
20
  pass
@@ -23,27 +24,36 @@ class BaseTransformer(abc.ABC):
23
24
  indexes = value_dict.keys()
24
25
  new_dict = {}
25
26
 
26
-
27
27
  for key in indexes:
28
28
  new_dict.update(
29
29
  {
30
- f"{key}_{sub_key}": value_dict[key].get(sub_key, None)
30
+ f"{key}_{sub_key}": value_dict[key].get(sub_key, None)
31
31
  for sub_key in target_keys
32
32
  }
33
33
  )
34
+
34
35
  return new_dict
35
-
36
+
36
37
  @staticmethod
37
38
  def _process_unit(data_df, postfix):
38
39
 
39
40
  lambda_map = {
40
- "_value": lambda x: StatsProcessor.cal_non_percentage(x, postfix="千元"),
41
- "_percentage": lambda x : StatsProcessor.cal_non_percentage(x, to_str=True, postfix="%"),
42
- '_growth': lambda x : StatsProcessor.cal_non_percentage(x, to_str=True, postfix="%"),
43
- "_YoY_1": StatsProcessor.cal_percentage,
44
- "_YoY_3": StatsProcessor.cal_percentage,
45
- "_YoY_5": StatsProcessor.cal_percentage,
46
- "_YoY_10": StatsProcessor.cal_percentage
41
+ "_value":
42
+ lambda x: StatsProcessor.cal_non_percentage(x, postfix="千元"),
43
+ "_percentage":
44
+ lambda x: StatsProcessor.
45
+ cal_non_percentage(x, to_str=True, postfix="%"),
46
+ '_growth':
47
+ lambda x: StatsProcessor.
48
+ cal_non_percentage(x, to_str=True, postfix="%"),
49
+ "_YoY_1":
50
+ StatsProcessor.cal_percentage,
51
+ "_YoY_3":
52
+ StatsProcessor.cal_percentage,
53
+ "_YoY_5":
54
+ StatsProcessor.cal_percentage,
55
+ "_YoY_10":
56
+ StatsProcessor.cal_percentage
47
57
  }
48
58
 
49
59
  process_fn = lambda_map.get(postfix)
@@ -51,33 +61,36 @@ class BaseTransformer(abc.ABC):
51
61
  postfix_cols = data_df.loc[:, postfix_cols].columns
52
62
 
53
63
  if (postfix == "_value"):
54
- postfix_cols = [col for col in postfix_cols if not ("eps" in col or "每股盈餘" in col)]
55
-
64
+ postfix_cols = [
65
+ col for col in postfix_cols
66
+ if not ("eps" in col or "每股盈餘" in col)
67
+ ]
68
+
56
69
  if (postfix == '_growth'):
57
- data_df[postfix_cols] =data_df[postfix_cols].map(
58
- lambda x: x * 100.0 if isinstance(x, float) else x
70
+ data_df[postfix_cols] = data_df[postfix_cols].map(
71
+ lambda x: x * 100.0 if isinstance(x, float) else x
59
72
  )
60
73
 
61
- data_df[postfix_cols] = (
62
- data_df[postfix_cols].map(
63
- process_fn
64
- )
65
- )
74
+ data_df[postfix_cols] = (data_df[postfix_cols].map(process_fn))
66
75
 
67
76
  return data_df
68
77
 
69
- def _apply_process_unit_pipeline(self, data_df, postfix_list = ["_value", "percentage"]):
78
+ def _apply_process_unit_pipeline(
79
+ self, data_df, postfix_list=["_value", "percentage"]
80
+ ):
70
81
  for postfix in postfix_list:
71
82
  data_df = self._process_unit(data_df, postfix)
72
83
  return data_df
73
84
 
74
85
  @staticmethod
75
86
  def _slice_target_season(stats_df, target_season):
76
- target_season_columns = stats_df.columns.str.endswith(f"Q{target_season}")
87
+ target_season_columns = stats_df.columns.str.endswith(
88
+ f"Q{target_season}"
89
+ )
77
90
  stats_df = stats_df.loc[:, target_season_columns]
78
91
 
79
92
  return stats_df
80
-
93
+
81
94
  def _get_empty_structure(self):
82
95
  return_dict = {
83
96
  "warning": "No data fetched",
@@ -87,11 +100,12 @@ class BaseTransformer(abc.ABC):
87
100
 
88
101
  return_dict.update(
89
102
  {
90
- key: pd.DataFrame(columns= pd.Index([], name = 'date')) for key in self.return_keys
103
+ key: pd.DataFrame(columns=pd.Index([], name='index'))
104
+ for key in self.return_keys
91
105
  }
92
106
  )
93
107
  return return_dict
94
-
108
+
95
109
  def _process_value(self, value):
96
110
  if isinstance(value, str) and "%" in value:
97
111
  value = value.replace("%", "")
@@ -99,7 +113,7 @@ class BaseTransformer(abc.ABC):
99
113
  return float(value)
100
114
  except (ValueError, TypeError):
101
115
  return None
102
-
116
+
103
117
  def _calculate_growth(self, this_value, last_value, delta):
104
118
  try:
105
119
  return YoY_Calculator.cal_growth(
@@ -107,4 +121,38 @@ class BaseTransformer(abc.ABC):
107
121
  ) * 100
108
122
  except Exception:
109
123
  return None
110
-
124
+
125
+ def _cal_QoQ(self, data_dict):
126
+ """
127
+ data_dict: {"<key>_value": {"2020Q1": <value>, ....}, "<key>_percentage": {"2020Q1": <value>, ....}}
128
+ """
129
+
130
+ return_dict = data_dict.copy()
131
+
132
+ for key, datas in data_dict.items():
133
+ if (key.endswith("_value")):
134
+ main_key = key.split("_")[0]
135
+ temp_growth_dict = dict()
136
+ for year_season, value in datas.items():
137
+
138
+ year, season = year_season.split('Q')
139
+ year, season = int(year), int(season)
140
+
141
+ last_year, last_season = (
142
+ year, season - 1
143
+ ) if season != 1 else (year - 1, 4)
144
+
145
+ last_value = datas.get(f"{last_year}Q{last_season}", None)
146
+
147
+ growth = YoY_Calculator.cal_growth(
148
+ value, last_value, delta=1
149
+ )
150
+ if (growth):
151
+ growth = growth * 100
152
+ growth = f"{growth:.2f}%"
153
+
154
+ temp_growth_dict[year_season] = growth
155
+
156
+ return_dict[f"{main_key}_growth"] = growth
157
+ return_df = pd.DataFrame.from_dict(return_dict)
158
+ return return_df
@@ -52,6 +52,8 @@ class TWSECashFlowTransformer(BaseCashFlowTransformer):
52
52
  return self._get_empty_structure()
53
53
 
54
54
  data_df = self._process_twse_to_tej_format(fetched_data)
55
+ data_df = self._cal_QoQ(data_df.T.to_dict())
56
+ data_df = data_df.T
55
57
  target_season = fetched_data[0]['season']
56
58
 
57
59
  data_df_YoY = self._slice_target_season(data_df, target_season)
@@ -35,7 +35,7 @@ class TWSEChipTransformer(BaseChipTransformer):
35
35
 
36
36
  tech_dict = {data['date']: data for data in tech_data}
37
37
  latest_tech = tech_data[-1]
38
- if (len(fetched_data) < 1):
38
+ if (not fetched_data):
39
39
  return_dict['latest_trading'].update(
40
40
  self._process_latest({}, latest_tech, key)
41
41
  )
@@ -27,12 +27,27 @@ class FinanceOverviewTransformer(BaseFinanceOverviewTransformer):
27
27
  return processed_data_dict
28
28
 
29
29
  def _filter_target_data(self, balance_sheet, profit_lose, cash_flow):
30
+ balance_sheet = balance_sheet[-1]
31
+ cash_flow = cash_flow[-1]
32
+ profit_lose = profit_lose[-1]
33
+ seasons = [
34
+ (int(report['year']), int(report['season']))
35
+ for report in (balance_sheet, profit_lose, cash_flow)
36
+ ]
37
+
38
+ max_date = max(seasons)
39
+ year, season = max_date
40
+
30
41
  data_dict = {
31
- 'balance_sheet': balance_sheet[-1]['balance_sheet'],
32
- 'profit_lose': profit_lose[-1]['profit_lose'],
33
- "cash_flow": cash_flow[-1]['cash_flow']
42
+ 'balance_sheet': balance_sheet['balance_sheet'],
43
+ 'profit_lose': profit_lose['profit_lose'],
44
+ "cash_flow": cash_flow['cash_flow']
34
45
  }
35
- filtered_dict = {}
46
+ filtered_dict = {
47
+ "year": year,
48
+ "season": season
49
+ }
50
+
36
51
 
37
52
  for key, target_sets in self.target_fields.items():
38
53
  try:
@@ -1,4 +1,5 @@
1
1
  from .base import BaseMonthRevenueTransformer
2
+ from datetime import datetime
2
3
  from neurostats_API.utils import StatsProcessor, YoY_Calculator
3
4
  import pandas as pd
4
5
 
@@ -8,6 +9,8 @@ class TWSEMonthlyRevenueTransformer(BaseMonthRevenueTransformer):
8
9
 
9
10
  self.data_df = None
10
11
  def process_transform(self, fetched_data):
12
+ if (not fetched_data):
13
+ return self._get_empty_structure()
11
14
  self.data_df = self._process_data(fetched_data)
12
15
  target_month = fetched_data[0]['month']
13
16
 
@@ -97,10 +100,12 @@ class TWSEMonthlyRevenueTransformer(BaseMonthRevenueTransformer):
97
100
  return df[df['date'] != "0/0"].set_index('date').T
98
101
 
99
102
 
100
- def _get_empty_structure(self, target_year, target_month):
103
+ def _get_empty_structure(self):
101
104
  """
102
105
  Exception 發生時回傳
103
106
  """
107
+ target_date = datetime.today()
108
+ target_year, target_month = target_date.year, target_date.month
104
109
  recent_date = [f"{target_year}/{target_month}"]
105
110
  for _ in range(11):
106
111
  target_year, target_month = (target_year - 1, 12) if target_month == 1 else (target_year, target_month - 1)
@@ -105,7 +105,7 @@ class TWSEProfitLoseTransformer(BaseProfitLoseTransformer):
105
105
  return_dict.update({
106
106
  "profit_lose": stats_main_page_df,
107
107
  "grand_total_profit_lose": stats_grand_total_df,
108
- "profit_lose_all": self.new_df.T,
108
+ "profit_lose_all": self.new_df,
109
109
  "profit_lose_YoY": new_df_YoY
110
110
  })
111
111
 
@@ -6,6 +6,7 @@ class USProfitLoseTransformer(BaseProfitLoseTransformer):
6
6
  def __init__(self, ticker, company_name, zone):
7
7
  super().__init__(ticker, company_name, zone)
8
8
  self.data_df = None
9
+ self.return_keys = ['profit_lose']
9
10
 
10
11
  def process_transform(self, fetched_data):
11
12
 
@@ -35,7 +35,7 @@ class TEJFinanceStatementTransformer(BaseTEJTransformer):
35
35
  use_cal=True,
36
36
  indexes=None
37
37
  ):
38
- if (len(fetched_data) == 0):
38
+ if (not fetched_data):
39
39
  raise NoDataError(f"No data found in collection: TEJ_finance_statement, ticker={self.ticker}")
40
40
 
41
41
  target_season = fetched_data[-1]['season']
@@ -35,7 +35,7 @@ class TWSEHistoryValueTransformer(TWSEValueTransformer):
35
35
  return return_dict
36
36
 
37
37
  def process_latest(self, daily_data):
38
- if len(daily_data) < 1:
38
+ if (not daily_data):
39
39
  return self._get_empty_structure()
40
40
 
41
41
  daily_data = daily_data[-1]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: neurostats_API
3
- Version: 1.0.0rc3
3
+ Version: 1.0.0rc5
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.0rc2
74
+ 1.0.0rc5
75
75
  ```
76
76
 
77
77
  ### 下載舊版
@@ -1,4 +1,4 @@
1
- neurostats_API/__init__.py,sha256=nFv18ZCSzCbGH6uDwyHVQXFMQ6WorQeSUYlm4GiV11g,323
1
+ neurostats_API/__init__.py,sha256=i-A81EltAAyWKaO_KUJQwnzwTmMOhUc1XrfLDSG0eAo,675
2
2
  neurostats_API/cli.py,sha256=UJSWLIw03P24p-gkBb6JSEI5dW5U12UvLf1L8HjQD-o,873
3
3
  neurostats_API/main.py,sha256=QcsfmWivg2Dnqw3MTJWiI0QvEiRs0VuH-BjwQHFCv00,677
4
4
  neurostats_API/async_mode/__init__.py,sha256=arSINQm3O3g-IwfOSLsGraEj2icJbkuW0t5HLPQ4Xk8,348
@@ -35,7 +35,7 @@ neurostats_API/async_mode/fetchers/cash_flow.py,sha256=uj2JEbilgn595yJcMNvlTZHdk
35
35
  neurostats_API/async_mode/fetchers/finance_overview.py,sha256=nBjKPqrzhXrYvBMbhvzCygRpKR2xV3tPvNX5foiuBSY,4570
36
36
  neurostats_API/async_mode/fetchers/month_revenue.py,sha256=GDrFrjTe81uAzeKvd5HghH9iPXouXL8JTt8hfaFkig4,1258
37
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
38
+ neurostats_API/async_mode/fetchers/tech.py,sha256=xj6LRnexMePi4Nc9P0lduAjJwjcVOp1xInIFjrRMrbM,6686
39
39
  neurostats_API/async_mode/fetchers/tej.py,sha256=PfYA0ap7ebWMpffVT9tmLFdwHWETAU7MKLFxAjOlg-E,2802
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
@@ -66,19 +66,19 @@ neurostats_API/fetchers/tech.py,sha256=TsS8m25Otc3_2jTYITFe-wNHlDWcfWsHIxhOrqL8q
66
66
  neurostats_API/fetchers/tej_finance_report.py,sha256=mlIm2Qzs8-Xlzeb8uET8qGPWD3VGUx3g8qFFcY4UbAw,13022
67
67
  neurostats_API/fetchers/value_invest.py,sha256=QxQS2GcoLIU9ZBDEo8iRK2yHd8YLmBS70Bq42F3IsSw,8295
68
68
  neurostats_API/transformers/__init__.py,sha256=AJ0SkJ9P65gbdHPSygYw1X2I-KRJO20q20lLVP-JViE,676
69
- neurostats_API/transformers/base.py,sha256=ju6PCoc9CNo-sdGCYnozQ2_l8KBSHEEe5W2ua8HxzR0,3422
69
+ neurostats_API/transformers/base.py,sha256=gFRuLmFzZl0HObEtMr78oscFP3ePBseMW7tB4s51-_c,4795
70
70
  neurostats_API/transformers/balance_sheet/__init__.py,sha256=RCScBsR3zeC5UdyuiHD1CGRQufoFL5LkN8WbtI5JeA4,87
71
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
72
+ neurostats_API/transformers/balance_sheet/twse.py,sha256=ghQWvacJvJSEqu7RtNqICE5gK_N_AKWSvpfYv5Eioiw,2800
73
+ neurostats_API/transformers/balance_sheet/us.py,sha256=v1QUsI6bt8_AZV-oB5NEddjJYO3N1hs6zTbi7J3ZGME,1054
74
74
  neurostats_API/transformers/cash_flow/__init__.py,sha256=KJs5kfjRV0ahy842ZVLvQuZS02YxT-w0cMNHfU0ngFE,79
75
75
  neurostats_API/transformers/cash_flow/base.py,sha256=6Lt44O-xg658-jEFYBHOF2cgD0PGiKK43257uQMSetk,4392
76
- neurostats_API/transformers/cash_flow/twse.py,sha256=_ZIiZrjXSBCxgpXRgXe8MYWFWlDSVQVEb06P90LOezA,2351
76
+ neurostats_API/transformers/cash_flow/twse.py,sha256=srrmTmFheJig3el5jQIW8YBgpZVUOq-Af2zM4NxLm7s,2432
77
77
  neurostats_API/transformers/cash_flow/us.py,sha256=nRJajeDz4HNkv42NosoP0Jir4tIA0ybhIZu9zHkjAEM,1304
78
78
  neurostats_API/transformers/daily_chip/__init__.py,sha256=e-yvQ94J3dkzRbhZwOiAkyt_ub9bRQ7pAVDbO-61Grw,43
79
79
  neurostats_API/transformers/daily_chip/base.py,sha256=KBsnpACakJh2W-k4Kvv-dVNnSNbUCGMeqvQsTQkz-aE,184
80
80
  neurostats_API/transformers/daily_chip/tej.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
- neurostats_API/transformers/daily_chip/twse_chip.py,sha256=mUcHHQN9EFJkn1kB5KCcUoZJrHrMPBXotiJKQv7hM4Y,14660
81
+ neurostats_API/transformers/daily_chip/twse_chip.py,sha256=miMu5Si0tFndznf7E_T26c1hYtNqwHplbuB3htVzeGQ,14655
82
82
  neurostats_API/transformers/daily_chip/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
83
  neurostats_API/transformers/daily_chip/utils/institution.py,sha256=1Zj9mxIhvwkmA599a1OYmdorPEAN_U3sl8uhvddxUW0,3384
84
84
  neurostats_API/transformers/daily_chip/utils/margin_trading.py,sha256=oVY_OW63pcSc1TyM_jSPNAoj4HLyZCRshkdsHQsnxyk,38
@@ -91,21 +91,21 @@ neurostats_API/transformers/daily_tech/utils/processor.py,sha256=9zOjVFyWqzRXD5j
91
91
  neurostats_API/transformers/finance_overview/__init__.py,sha256=mWFn13YrugExrSQ7oJvnvP95W20_rQ1wOesrZY3XnSU,107
92
92
  neurostats_API/transformers/finance_overview/agent_overview.py,sha256=DA7zLTslqiYCKIzC8wKKJK7f2cz2KpTOhqy-qDQmDrc,1974
93
93
  neurostats_API/transformers/finance_overview/base.py,sha256=uksr5sUhbaL12ZBH3cUtR1Q0NzpQ8C36FwfwluB8uYE,29669
94
- neurostats_API/transformers/finance_overview/stats_overview.py,sha256=pRstGTw7flYQ8nDFHA8BioWRGXBTu_T2GBuzm5us0xM,2498
94
+ neurostats_API/transformers/finance_overview/stats_overview.py,sha256=ml-u6BHCSKaTebvDAOBgyJfT6o3LCmluCfneABn1ysw,2884
95
95
  neurostats_API/transformers/month_revenue/__init__.py,sha256=fNj-FNJgl7yhYeswd3UFZEcSNoDF4kL6Mkspjom2cSo,47
96
96
  neurostats_API/transformers/month_revenue/base.py,sha256=cDswLIZ7UBJX3insyI3NPunxOva9Pf-6TEW15tHjn4s,1881
97
- neurostats_API/transformers/month_revenue/twse.py,sha256=-QhPI3hRc7PPWmFarsbBINauv6LdwXlyR_hIR6alh34,5642
97
+ neurostats_API/transformers/month_revenue/twse.py,sha256=BB_6pPnfTW0llud0UjnfmYdLTmjoafHjfInWbeWrebY,5834
98
98
  neurostats_API/transformers/profit_lose/__init__.py,sha256=oOPyakP1wDnmq7bsxgEm4vu1uWtUR34dd3Oegk9kvq0,83
99
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
100
+ neurostats_API/transformers/profit_lose/twse.py,sha256=RwAJWQBdsjFaLlW-HL6oUGxLAd8jXPpp6ljVB8uOfhQ,5400
101
+ neurostats_API/transformers/profit_lose/us.py,sha256=q7Vbxp_xzB0SUsxIqQYENi3RayfqR6Nfynvt7p-KHlI,847
102
102
  neurostats_API/transformers/tej/__init__.py,sha256=WihARZhphkvApsKr4U0--68m1M-Dc_rpV7xoV2fUV7E,61
103
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
104
+ neurostats_API/transformers/tej/finance_statement.py,sha256=rE-Kc94hzW8-xcKn6ry8LwwT8dSoGRKGsmvd5W4_SUs,2798
105
105
  neurostats_API/transformers/value/__init__.py,sha256=D8qMk0aLsv7CBBJHo5zsq_UuBKmZYNyqS3s-RWfhvy8,73
106
106
  neurostats_API/transformers/value/base.py,sha256=wR2LDiwGET126mwrPxYoApyl4lwx1MjWxFpOKLso_As,186
107
107
  neurostats_API/transformers/value/tej.py,sha256=csk0kLCrvXN7T_j9KkvXRRJreWZK6t3bYlPEfWcfBTo,244
108
- neurostats_API/transformers/value/twse.py,sha256=DbBqnKmaY0ceR1Q7PWiIF6CjI8eLshwQkR9zIj0xQSc,1432
108
+ neurostats_API/transformers/value/twse.py,sha256=uNGLkxCIfQhzRkalSn6o2kgPT-uw41KGTL6s3e7SneI,1429
109
109
  neurostats_API/utils/__init__.py,sha256=ZPLgh-MNOhskDhWzabLXAyZIjwJgX-sE5YlWJHEWfUw,222
110
110
  neurostats_API/utils/calculate_value.py,sha256=ioPV5VWitJ2NylBi5vwfs-payAUYxWhAiS7aaJjzQKQ,4305
111
111
  neurostats_API/utils/data_process.py,sha256=cD1Vzv8oDpsd1Y7qCALTyM-AP1nkwqhfOgDY0KQpXec,10442
@@ -113,7 +113,7 @@ neurostats_API/utils/datetime.py,sha256=XJya4G8b_-ZOaBbMXgQjWh2MC4wc-o6goQ7EQJQM
113
113
  neurostats_API/utils/db_client.py,sha256=OYe6yazcR4Aa6jYmy47JrryUeh2NnKGqY2K_lSZe6i8,455
114
114
  neurostats_API/utils/exception.py,sha256=yv92GVh5uHV1BgRmO4DwJcX_PtE0-TSgQoo3VnZ5hOQ,277
115
115
  neurostats_API/utils/logger.py,sha256=egBiiPGTi5l1FoX_o6EvdGh81R0_k8hFPctSxq8RCoo,693
116
- neurostats_API-1.0.0rc3.dist-info/METADATA,sha256=wLHE4NK0dMWEMnGw70H0_h9VTMf4M_FAZXTkrSkTqMU,2964
117
- neurostats_API-1.0.0rc3.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
118
- neurostats_API-1.0.0rc3.dist-info/top_level.txt,sha256=nSlQPMG0VtXivJyedp4Bkf86EOy2TpW10VGxolXrqnU,15
119
- neurostats_API-1.0.0rc3.dist-info/RECORD,,
116
+ neurostats_API-1.0.0rc5.dist-info/METADATA,sha256=6JSpvVQmq9d9DmvuArlutP-T1rH5UkGcpyDtMnejmu0,2964
117
+ neurostats_API-1.0.0rc5.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
118
+ neurostats_API-1.0.0rc5.dist-info/top_level.txt,sha256=nSlQPMG0VtXivJyedp4Bkf86EOy2TpW10VGxolXrqnU,15
119
+ neurostats_API-1.0.0rc5.dist-info/RECORD,,