neurostats-API 0.0.9__py3-none-any.whl → 0.0.11__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -1 +1 @@
1
- __version__='0.0.8'
1
+ __version__='0.0.11'
@@ -2,6 +2,7 @@ from .base import StatsDateTime, StatsFetcher
2
2
  from .balance_sheet import BalanceSheetFetcher
3
3
  from .cash_flow import CashFlowFetcher
4
4
  from .finance_overview import FinanceOverviewFetcher
5
+ from .institution import InstitutionFetcher
5
6
  from .month_revenue import MonthRevenueFetcher
6
7
  from .profit_lose import ProfitLoseFetcher
7
8
  from .value_invest import ValueFetcher
@@ -116,10 +116,13 @@ class BalanceSheetFetcher(StatsFetcher):
116
116
  try: # table_dict[項目][(2020Q1, '%')]
117
117
  if (item_name == 'percentage'):
118
118
  if (isinstance(item, (float, int))):
119
- item = np.round(item, 2)
120
- if ("YoY" in item_name):
119
+ item = StatsProcessor.cal_non_percentage(item, to_str=True, postfix="%")
120
+ elif ("YoY" in item_name):
121
121
  if (isinstance(item, (float, int))):
122
- item = np.round(item * 100, 2)
122
+ item = StatsProcessor.cal_percentage(item)
123
+ else:
124
+ if (isinstance(item, (float, int))):
125
+ item = StatsProcessor.cal_non_percentage(item, postfix="千元")
123
126
  table_dict[index_name][(time_index, item_name)] = item
124
127
 
125
128
  except KeyError:
@@ -132,10 +135,17 @@ class BalanceSheetFetcher(StatsFetcher):
132
135
  total_table.columns = pd.MultiIndex.from_tuples(total_table.columns)
133
136
 
134
137
  for name, setting in self.table_settings.items():
135
- return_dict[name] = StatsProcessor.slice_multi_col_table(
136
- total_table=total_table,
137
- mode=setting['mode'],
138
- target_index=setting['target_index']
139
- if "target_index" in setting.keys() else None)
140
-
138
+ if ('target_index' in setting.keys()):
139
+ target_indexes = [target_index.strip() for target_index in setting['target_index']]
140
+ else:
141
+ target_indexes = [None]
142
+ for target_index in target_indexes:
143
+ try:
144
+ return_dict[name] = StatsProcessor.slice_multi_col_table(
145
+ total_table=total_table,
146
+ mode=setting['mode'],
147
+ target_index=target_index)
148
+ break
149
+ except Exception as e:
150
+ continue
141
151
  return return_dict
@@ -132,14 +132,15 @@ class CashFlowFetcher(StatsFetcher):
132
132
  table_dict[time_index][index_name]['value'] = value[
133
133
  'value']
134
134
  if (value['value']):
135
- table_dict[time_index][index_name][
136
- 'percentage'] = np.round(
135
+ ratio = np.round(
137
136
  (value['value'] / cash_flow[
138
137
  main_cash_flow_name]['value']) * 100, 2)
138
+ table_dict[time_index][index_name][
139
+ 'percentage'] = f"{ratio}%"
139
140
  else:
140
141
  table_dict[time_index][index_name][
141
142
  'percentage'] = None
142
- except:
143
+ except: # 新增index再做一次
143
144
  if (time_index not in table_dict.keys()):
144
145
  table_dict[time_index] = dict()
145
146
  table_dict[time_index][index_name] = dict()
@@ -147,14 +148,15 @@ class CashFlowFetcher(StatsFetcher):
147
148
  table_dict[time_index][index_name]['value'] = value[
148
149
  'value']
149
150
  if (value['value']):
150
- table_dict[time_index][index_name][
151
- 'percentage'] = np.round(
151
+ ratio = np.round(
152
152
  (value['value'] / cash_flow[
153
153
  main_cash_flow_name]['value']) * 100, 2)
154
+ table_dict[time_index][index_name][
155
+ 'percentage'] = f"{ratio}%"
154
156
  else:
155
157
  table_dict[time_index][index_name][
156
158
  'percentage'] = None
157
-
159
+ table_dict[time_index][index_name]['value'] = StatsProcessor.cal_non_percentage(value['value'], postfix="千元")
158
160
  try:
159
161
  partial_cash_flow[time_index][index_name] = table_dict[
160
162
  time_index][index_name]
@@ -31,15 +31,19 @@ class FinanceOverviewFetcher(StatsFetcher):
31
31
 
32
32
  for key, target_sets in self.target_fields.items():
33
33
  try:
34
- small_target = target_sets['field']
35
- big_target = self.inverse_dict[
36
- small_target] # balance_sheet/profit_lose/cash_flow
34
+ small_targets = target_sets['field']
35
+
37
36
  value_index = target_sets['value'] # "金額" or "%"
38
37
 
39
- target_query.update({
40
- f"{key}":
41
- f"$$target_season_data.{big_target}.{small_target}.{value_index}"
42
- })
38
+ for small_target in small_targets:
39
+ big_target = self.inverse_dict[
40
+ small_target] # balance_sheet/profit_lose/cash_flow
41
+ if (small_target == "利息費用_bank"):
42
+ small_target = small_target[:small_target.find("_bank")]
43
+ target_query.update({
44
+ f"{key}":
45
+ f"$$target_season_data.{big_target}.{small_target}.{value_index}"
46
+ })
43
47
  except Exception:
44
48
  continue
45
49
 
@@ -98,8 +102,16 @@ class FinanceOverviewFetcher(StatsFetcher):
98
102
  finance_dict = fetched_data['seasonal_data'][0]
99
103
  FinanceOverviewProcessor.process_rate(finance_dict)
100
104
  FinanceOverviewProcessor.process_all(finance_dict)
105
+ self.fill_nan_index(finance_dict)
106
+ FinanceOverviewProcessor.process_thousand_dollar(finance_dict)
101
107
  fetched_data['seasonal_data'] = finance_dict
108
+
102
109
  return fetched_data
110
+
111
+ def fill_nan_index(self, finance_dict):
112
+ for key in self.target_fields.keys():
113
+ if (key not in finance_dict.keys()):
114
+ finance_dict[key] = None
103
115
 
104
116
 
105
117
  class FinanceOverviewProcessor(StatsProcessor):
@@ -116,6 +128,35 @@ class FinanceOverviewProcessor(StatsProcessor):
116
128
  else:
117
129
  finance_dict[key] = StatsProcessor.cal_non_percentage(
118
130
  finance_dict[key])
131
+
132
+
133
+ @classmethod
134
+ def process_thousand_dollar(cls, finance_dict):
135
+ process_index = [
136
+ "revenue",
137
+ "gross_profit",
138
+ "operating_income",
139
+ "net_income",
140
+ "operating_cash_flow",
141
+ "invest_cash_flow",
142
+ "financing_cash_flow",
143
+ "fcf",
144
+
145
+ 'current_assets',
146
+ 'current_liabilities',
147
+ 'non_current_assets',
148
+ 'non_current_liabilities',
149
+ 'total_assets',
150
+ "total_liabilities",
151
+ "equity"
152
+ ]
153
+
154
+ for index in process_index:
155
+ try:
156
+ finance_dict[index] = StatsProcessor.cal_non_percentage(finance_dict[index], postfix="千元")
157
+ except Exception as e:
158
+ finance_dict[index] = None
159
+
119
160
 
120
161
  @classmethod
121
162
  def process_all(cls, finance_dict):
@@ -135,12 +176,13 @@ class FinanceOverviewProcessor(StatsProcessor):
135
176
  cls.cal_quick_ratio, cls.cal_debt_to_equity_ratio,
136
177
  cls.cal_net_debt_to_equity_ratio, cls.cal_interest_coverage_ratio,
137
178
  cls.cal_debt_to_operating_cash_flow,
138
- cls.cal_debt_to_free_cash_flow, cls.cal_cash_flow_ratio
179
+ cls.cal_debt_to_free_cash_flow, cls.cal_cash_flow_ratio,
139
180
  ]
140
181
 
141
182
  for method in methods:
142
183
  method(finance_dict)
143
184
 
185
+
144
186
  @classmethod
145
187
  def cal_EBIT(cls, finance_dict):
146
188
  """
@@ -224,7 +266,14 @@ class FinanceOverviewProcessor(StatsProcessor):
224
266
  計算每股毛利
225
267
  = (當期營業毛利)÷(當期在外流通股數)
226
268
  """
227
-
269
+ if ('gross_profit' not in finance_dict.keys()):
270
+ try:
271
+ finance_dict['gross_profit'] = (
272
+ finance_dict['revenue'] -
273
+ finance_dict['operating_cost']
274
+ )
275
+ except:
276
+ finance_dict['gross_profit'] = None
228
277
  try:
229
278
  gross_per_share = (finance_dict['gross_profit'] /
230
279
  finance_dict['share_outstanding'])
@@ -267,7 +316,7 @@ class FinanceOverviewProcessor(StatsProcessor):
267
316
  operating_cash_flow_per_share)
268
317
  except (KeyError, ZeroDivisionError, TypeError) as e:
269
318
  finance_dict['operating_cash_flow_per_share'] = None
270
- print(f'operating_cash_flow_per_share because of {str(e)}')
319
+ # print(f'operating_cash_flow_per_share because of {str(e)}')
271
320
 
272
321
  @classmethod
273
322
  def fcf_per_share(cls, finance_dict):
@@ -292,12 +341,15 @@ class FinanceOverviewProcessor(StatsProcessor):
292
341
  計算資產報酬率(ROA)
293
342
  ROA = [ 本期淨利 + 利息費用 × (1-有效稅率) ] ÷(資產總額)
294
343
  """
295
- roa = (
296
- finance_dict['net_income'] + finance_dict['interest'] +
297
- (1 * 0.1) # 有效稅率需要改,這裡先設0.1
298
- ) / finance_dict['inventories']
344
+ try:
345
+ roa = (
346
+ finance_dict['net_income'] + finance_dict['interest'] +
347
+ (1 * 0.1) # 有效稅率需要改,這裡先設0.1
348
+ ) / finance_dict['inventories']
299
349
 
300
- finance_dict["roa"] = StatsProcessor.cal_percentage(roa)
350
+ finance_dict["roa"] = StatsProcessor.cal_percentage(roa)
351
+ except Exception as e:
352
+ finance_dict["roa"] = None
301
353
 
302
354
  @classmethod
303
355
  def cal_roe(cls, finance_dict):
@@ -305,8 +357,11 @@ class FinanceOverviewProcessor(StatsProcessor):
305
357
  計算股東權益報酬率(ROE)
306
358
  ROE = (本期淨利) ÷(權益總額)
307
359
  """
308
- roe = (finance_dict['net_income'] / finance_dict['equity'])
309
- finance_dict['roe'] = StatsProcessor.cal_percentage(roe)
360
+ try:
361
+ roe = (finance_dict['net_income'] / finance_dict['equity'])
362
+ finance_dict['roe'] = StatsProcessor.cal_percentage(roe)
363
+ except Exception as e:
364
+ finance_dict['roe'] = None
310
365
 
311
366
  @classmethod
312
367
  def cal_gross_over_asset(cls, finance_dict):
@@ -315,7 +370,7 @@ class FinanceOverviewProcessor(StatsProcessor):
315
370
  """
316
371
  try:
317
372
  gross_over_asset = (finance_dict['gross_profit'] /
318
- finance_dict['total_asset'])
373
+ finance_dict['total_assets'])
319
374
  finance_dict['gross_over_asset'] = StatsProcessor.cal_percentage(
320
375
  gross_over_asset)
321
376
  except (KeyError, ZeroDivisionError, TypeError) as e:
@@ -331,7 +386,7 @@ class FinanceOverviewProcessor(StatsProcessor):
331
386
  try:
332
387
  roce = ((finance_dict['net_income_before_tax'] +
333
388
  finance_dict['interest']) /
334
- (finance_dict['total_asset'] -
389
+ (finance_dict['total_assets'] -
335
390
  finance_dict['current_liabilities']))
336
391
  finance_dict['roce'] = StatsProcessor.cal_percentage(roce)
337
392
 
@@ -351,7 +406,7 @@ class FinanceOverviewProcessor(StatsProcessor):
351
406
  finance_dict[
352
407
  'gross_profit_margin'] = StatsProcessor.cal_percentage(
353
408
  gross_profit_margin)
354
- except:
409
+ except Exception as e:
355
410
  finance_dict['gross_profit_margin'] = None
356
411
  print(f"gross_profit_margin failed because of {str(e)}")
357
412
 
@@ -409,7 +464,7 @@ class FinanceOverviewProcessor(StatsProcessor):
409
464
  (finance_dict['account_pay'] / finance_dict['revenue']))
410
465
  finance_dict['dso'] = StatsProcessor.cal_non_percentage(
411
466
  dso, to_str=True, postfix="日")
412
- except:
467
+ except Exception as e:
413
468
  finance_dict['dso'] = None
414
469
  print(f"Error calculating 應收帳款收現天數 because of {str(e)}")
415
470
 
@@ -419,11 +474,15 @@ class FinanceOverviewProcessor(StatsProcessor):
419
474
  計算應收帳款佔營收比率
420
475
  = 應收帳款平均餘額 ÷ 營業收入
421
476
  """
422
- account_receive_over_revenue = (finance_dict['account_receive'] /
423
- finance_dict['revenue'])
424
- finance_dict[
425
- "account_receive_over_revenue"] = StatsProcessor.cal_percentage(
426
- account_receive_over_revenue)
477
+ try:
478
+ account_receive_over_revenue = (finance_dict['account_receive'] /
479
+ finance_dict['revenue'])
480
+ finance_dict[
481
+ "account_receive_over_revenue"] = StatsProcessor.cal_percentage(
482
+ account_receive_over_revenue)
483
+ except Exception as e:
484
+ finance_dict[
485
+ "account_receive_over_revenue"] = None
427
486
 
428
487
  @classmethod
429
488
  def cal_dpo(cls, finance_dict):
@@ -513,10 +572,13 @@ class FinanceOverviewProcessor(StatsProcessor):
513
572
  計算資產周轉率
514
573
  營業收入 ÷ 資產總額
515
574
  """
516
- asset_turnover = (finance_dict["revenue"] /
517
- finance_dict["inventories"])
518
- finance_dict["asset_turnover"] = StatsProcessor.cal_percentage(
519
- asset_turnover)
575
+ try:
576
+ asset_turnover = (finance_dict["revenue"] /
577
+ finance_dict["inventories"])
578
+ finance_dict["asset_turnover"] = StatsProcessor.cal_percentage(
579
+ asset_turnover)
580
+ except Exception as e:
581
+ finance_dict["asset_turnover"] = None
520
582
 
521
583
  @classmethod
522
584
  def cal_application_turnover(cls, finance_dict):
@@ -528,11 +590,12 @@ class FinanceOverviewProcessor(StatsProcessor):
528
590
  applcation_turnover = (finance_dict['revenue'] /
529
591
  finance_dict["application"])
530
592
  finance_dict[
531
- 'applcation_turnover'] = StatsProcessor.cal_percentage(
593
+ 'application_turnover'] = StatsProcessor.cal_percentage(
532
594
  applcation_turnover)
533
595
 
534
- except (KeyError, ZeroDivisionError, TypeError) as e:
596
+ except Exception as e:
535
597
  finance_dict['application_turnover'] = None
598
+
536
599
 
537
600
  @classmethod
538
601
  def cal_current_ratio(cls, finance_dict):
@@ -0,0 +1,214 @@
1
+ from .base import StatsFetcher
2
+ from datetime import datetime, timedelta
3
+ import json
4
+ import numpy as np
5
+ import pandas as pd
6
+ from ..utils import StatsDateTime, StatsProcessor
7
+ import importlib.resources as pkg_resources
8
+ import yaml
9
+
10
+
11
+ class InstitutionFetcher(StatsFetcher):
12
+ """
13
+ iFa -> 交易資訊 -> 法人買賣
14
+
15
+ 包括:
16
+ 1. 當日交易
17
+ 2. 一年內交易
18
+ """
19
+
20
+ def __init__(self, ticker, db_client):
21
+ super().__init__(ticker, db_client)
22
+
23
+ def prepare_query(self, start_date, end_date):
24
+ pipeline = super().prepare_query()
25
+
26
+ # target_query = {
27
+ # "date": date,
28
+ # "institution_trading": "$$target_season_data.institution_trading"
29
+ # }
30
+
31
+ pipeline.append({
32
+ "$project": {
33
+ "_id": 0,
34
+ "ticker": 1,
35
+ "company_name": 1,
36
+ "daily_data": {
37
+ "$map": {
38
+ "input": {
39
+ "$filter": {
40
+ "input": "$daily_data",
41
+ "as": "daily",
42
+ "cond": {
43
+ "$and": [{
44
+ "$gte": ["$$daily.date", start_date]
45
+ }, {
46
+ "$lte": ["$$daily.date", end_date]
47
+ }]
48
+ }
49
+ }
50
+ },
51
+ "as": "target_daily_data",
52
+ "in": "$$target_daily_data"
53
+ }
54
+ }
55
+ }
56
+ })
57
+
58
+ return pipeline
59
+
60
+ def collect_data(self, start_date, end_date):
61
+ pipeline = self.prepare_query(start_date, end_date)
62
+
63
+ fetched_data = self.collection.aggregate(pipeline).to_list()
64
+
65
+ return fetched_data[-1]
66
+
67
+ def query_data(self):
68
+ try:
69
+ latest_time = StatsDateTime.get_latest_time(
70
+ self.ticker, self.collection)['last_update_time']
71
+ latest_date = latest_time['institution_trading'][
72
+ 'latest_date']
73
+ date = latest_date.replace(hour=0,
74
+ minute=0,
75
+ second=0,
76
+ microsecond=0)
77
+ except Exception as e:
78
+ print(
79
+ f"No updated time for institution_trading in {self.ticker}, use current time instead"
80
+ )
81
+ date = datetime.now(self.timezone)
82
+ date = date.replace(hour=0, minute=0, second=0, microsecond=0)
83
+
84
+ if (date.hour < 17): # 拿不到今天的資料
85
+ date = date - timedelta(days=1)
86
+
87
+ start_date = date - timedelta(days=365)
88
+
89
+ daily_data = self.collect_data(start_date, end_date=date)
90
+
91
+ daily_data = sorted(daily_data['daily_data'],
92
+ key=lambda x: x['date'],
93
+ reverse=True)
94
+
95
+ table_dict = self.process_data(daily_data)
96
+
97
+ return table_dict
98
+
99
+ def process_data(self, daily_data):
100
+ table_dict = dict()
101
+
102
+ latest_data = daily_data[0]
103
+ yesterday_data = daily_data[1]
104
+
105
+ # 交易價格與昨天交易
106
+ price_dict = {
107
+ "open": latest_data['open'],
108
+ 'close': latest_data['close'],
109
+ 'range': f"{latest_data['low']}-{latest_data['high']}",
110
+ 'volumn': latest_data['volume'] / 1000,
111
+ 'last_open': yesterday_data['open'],
112
+ 'last_close': yesterday_data['close'],
113
+ 'last_range': f"{yesterday_data['low']}-{yesterday_data['high']}",
114
+ 'last_volumn': yesterday_data['volume'] / 1000
115
+ }
116
+ # 一年範圍
117
+ annual_lows = [data['low'] for data in daily_data]
118
+ annual_highs = [data['high'] for data in daily_data]
119
+ lowest = np.min(annual_lows).item()
120
+ highest = np.max(annual_highs).item()
121
+
122
+ price_dict['52weeks_range'] = f"{lowest}-{highest}"
123
+ table_dict['price'] = price_dict
124
+
125
+ # 發行股數 & 市值
126
+
127
+ # 今日法人買賣
128
+ table_dict['latest_trading'] = {
129
+ "date":
130
+ daily_data[0]['date'],
131
+ "table":
132
+ self.process_latest_trading(daily_data[0]['institution_trading'], daily_data[0]['volume'])
133
+ }
134
+ # 一年內法人
135
+ annual_trading = [
136
+ {
137
+ **data['institution_trading'],
138
+ "收盤價": int(data['close'])
139
+ }
140
+ for data in daily_data
141
+ ] # 將close也併入這個表格
142
+ annual_dates = [data['date'] for data in daily_data]
143
+ table_dict['annual_trading'] = self.process_annual_trading(
144
+ annual_dates, annual_trading)
145
+
146
+ return table_dict
147
+
148
+ def process_latest_trading(self, latest_trading, volume):
149
+ latest_table = {
150
+ "foreign": self.default_institution_chart(),
151
+ "mutual": self.default_institution_chart(),
152
+ "prop": self.default_institution_chart(),
153
+ "institutional_investor":self.default_institution_chart(),
154
+ }
155
+
156
+ for key in latest_trading.keys():
157
+ if (key.find("外陸資") >= 0 or key.find("外資") >= 0):
158
+ self.target_institution(latest_trading, latest_table['foreign'], key, volume)
159
+ elif (key.find("自營商") >= 0):
160
+ self.target_institution(latest_trading,latest_table['prop'], key, volume)
161
+ elif (key.find("投信") >= 0):
162
+ self.target_institution(latest_trading,latest_table['mutual'], key, volume)
163
+ elif (key.find("三大法人") >= 0):
164
+ self.target_institution(latest_trading,latest_table['institutional_investor'], key, volume)
165
+
166
+ frames = []
167
+ for category, trades in latest_table.items():
168
+ temp_df = pd.DataFrame(trades).T
169
+ temp_df['category'] = category
170
+ frames.append(temp_df)
171
+
172
+ latest_df = pd.concat(frames)
173
+ latest_df = latest_df.reset_index().rename(columns={'index': 'type'})
174
+ latest_df = latest_df[['type', 'category', 'stock', 'price', 'average_price', 'percentage']]
175
+
176
+ return latest_df
177
+
178
+ def process_annual_trading(self, dates, annual_tradings):
179
+ dates = [date.strftime("%m/%d") for date in dates]
180
+ return pd.DataFrame(annual_tradings, index=dates)
181
+
182
+ def target_institution(self, old_table, new_table, key, volume):
183
+ if (key.find("買進") >= 0):
184
+ self.cal_institution(old_table, new_table['buy'], key, volume)
185
+ elif (key.find("賣出") >= 0):
186
+ self.cal_institution(old_table, new_table['sell'], key, volume)
187
+ elif (key.find("買賣超") >= 0):
188
+ self.cal_institution(old_table, new_table['over_buy_sell'], key, volume)
189
+
190
+ def cal_institution(self, old_table, new_table, key, volume):
191
+ new_table['stock'] = np.round(old_table[key] / 1000, 2).item()
192
+ new_table['percentage'] = np.round((old_table[key] / volume) * 100, 2).item()
193
+
194
+ def default_institution_chart(self):
195
+ return {
196
+ "buy": {
197
+ "stock": 0,
198
+ "price": 0,
199
+ "average_price": 0,
200
+ "percentage": 0
201
+ },
202
+ "sell": {
203
+ "stock": 0,
204
+ "price": 0,
205
+ "average_price": 0,
206
+ "percentage": 0
207
+ },
208
+ "over_buy_sell": {
209
+ "stock": 0,
210
+ "price": 0,
211
+ "average_price": 0,
212
+ "percentage": 0
213
+ },
214
+ }
@@ -64,6 +64,17 @@ class MonthRevenueFetcher(StatsFetcher):
64
64
  def process_data(self, fetched_data):
65
65
 
66
66
  monthly_data = fetched_data['monthly_data']
67
+ for data in monthly_data:
68
+ for key, value in data.items():
69
+ if ("YoY" in key):
70
+ data[key] = StatsProcessor.cal_percentage(value)
71
+ elif ("ratio" in key or 'percentage' in key):
72
+ data[key] = StatsProcessor.cal_non_percentage(value,
73
+ to_str=True,
74
+ postfix="%")
75
+ elif (key not in ('year', 'month')):
76
+ data[key] = StatsProcessor.cal_non_percentage(value,
77
+ postfix="千元")
67
78
  target_month = monthly_data[0]['month']
68
79
  monthly_df = pd.DataFrame(monthly_data)
69
80
  target_month_df = monthly_df[monthly_df['month'] == target_month]
@@ -77,21 +88,26 @@ class MonthRevenueFetcher(StatsFetcher):
77
88
 
78
89
  grand_total_df.rename(index={target_month: f"grand_total"},
79
90
  inplace=True)
80
- month_revenue_df = month_revenue_df.sort_index(ascending = False)
91
+ month_revenue_df = month_revenue_df.sort_index(ascending=False)
81
92
  month_revenue_df = pd.concat([grand_total_df, month_revenue_df],
82
93
  axis=0)
83
94
 
84
- fetched_data['month_revenue'] = month_revenue_df[sorted(month_revenue_df.columns, reverse = True)]
95
+ fetched_data['month_revenue'] = month_revenue_df[sorted(
96
+ month_revenue_df.columns, reverse=True)]
85
97
  # 歷年月營收
86
98
  fetched_data[
87
99
  'this_month_revenue_over_years'] = target_month_df.set_index(
88
- "year")[["revenue", "revenue_increment_ratio", "YoY_1",
89
- "YoY_3", "YoY_5", "YoY_10"]].T
100
+ "year")[[
101
+ "revenue", "revenue_increment_ratio", "YoY_1", "YoY_3",
102
+ "YoY_5", "YoY_10"
103
+ ]].T
90
104
  # 歷年營收成長量
91
105
  fetched_data['grand_total_over_years'] = target_month_df.set_index(
92
- "year")[["grand_total", "grand_total_increment_ratio",
93
- "grand_total_YoY_1", "grand_total_YoY_3",
94
- "grand_total_YoY_5", "grand_total_YoY_10"]].T
106
+ "year")[[
107
+ "grand_total", "grand_total_increment_ratio",
108
+ "grand_total_YoY_1", "grand_total_YoY_3", "grand_total_YoY_5",
109
+ "grand_total_YoY_10"
110
+ ]].T
95
111
 
96
112
  fetched_data.pop("monthly_data")
97
113
 
@@ -115,12 +115,15 @@ class ProfitLoseFetcher(StatsFetcher):
115
115
  for index_name, value_dict in profit_lose.items():
116
116
  # (2020Q1, 項目, 金額或%)
117
117
  for item_name, item in value_dict.items():
118
- if (item_name == 'percentage'):
118
+ if ('percentage' in item_name):
119
119
  if (isinstance(item, (float, int))):
120
- item = np.round(item, 2)
121
- if ('YoY' in item_name):
120
+ item = StatsProcessor.cal_non_percentage(item, to_str=True, postfix="%")
121
+ elif ('YoY' in item_name):
122
122
  if (isinstance(item, (float, int))):
123
- item = np.round(item * 100, 2)
123
+ item = StatsProcessor.cal_percentage(item)
124
+ else:
125
+ if (isinstance(item, (float, int))):
126
+ item = StatsProcessor.cal_non_percentage(item, postfix="千元")
124
127
  try:
125
128
  table_dict[index_name][(time_index, item_name)] = item
126
129
 
@@ -137,10 +140,19 @@ class ProfitLoseFetcher(StatsFetcher):
137
140
  total_table = total_table.replace("N/A", None)
138
141
 
139
142
  for name, setting in self.table_settings.items():
140
- return_dict[name] = StatsProcessor.slice_multi_col_table(
141
- total_table=total_table,
142
- mode=setting['mode'],
143
- target_index=setting['target_index']
144
- if "target_index" in setting.keys() else None)
143
+ if ('target_index' in setting.keys()):
144
+ target_indexes = [target.strip() for target in setting['target_index']]
145
+ else:
146
+ target_indexes = [None]
147
+
148
+ for target_index in target_indexes:
149
+ try:
150
+ return_dict[name] = StatsProcessor.slice_multi_col_table(
151
+ total_table=total_table,
152
+ mode=setting['mode'],
153
+ target_index=target_index)
154
+ break
155
+ except Exception as e:
156
+ continue
145
157
 
146
158
  return return_dict
@@ -3,24 +3,32 @@ balance_sheet:
3
3
 
4
4
  total_asset:
5
5
  mode: value_and_percentage
6
- target_index: 資產總額 負債總額 權益總額
7
-
6
+ target_index:
7
+ - 資產總額 負債總額 權益總額
8
+ - 資產總計 負債總計 權益總計
9
+
8
10
  current_asset:
9
11
  mode: value_and_percentage
10
- target_index: 流動資產合計
12
+ target_index:
13
+ - 流動資產合計
11
14
 
12
15
  non_current_asset:
13
16
  mode: value_and_percentage
14
- target_index: 非流動資產合計
17
+ target_index:
18
+ - 非流動資產合計
15
19
 
16
20
  current_debt:
17
21
  mode: value_and_percentage
18
- target_index: 流動負債合計
22
+ target_index:
23
+ - 流動負債合計
19
24
 
20
25
  non_current_debt:
21
26
  mode: value_and_percentage
22
- target_index: 非流動負債合計
27
+ target_index:
28
+ - 非流動負債合計
23
29
 
24
30
  equity:
25
31
  mode: value_and_percentage
26
- target_index: 權益總額
32
+ target_index:
33
+ - 權益總額
34
+ - 權益總計
@@ -1,89 +1,111 @@
1
1
  # 財務概況
2
2
  revenue:
3
- field: 營業收入合計
3
+ field:
4
+ - 營業收入合計
4
5
  value: value
5
6
 
6
7
  gross_profit:
7
- field: 營業毛利(毛損)淨額
8
+ field:
9
+ - 營業毛利(毛損)淨額
8
10
  value: value
9
11
 
10
12
  operating_income:
11
- field: 營業利益(損失)
13
+ field:
14
+ - 營業利益(損失)
12
15
  value: value
13
16
 
14
17
  net_income:
15
- field: 本期淨利(淨損)
18
+ field:
19
+ - 本期淨利(淨損)
16
20
  value: value
17
21
 
18
22
  tax_fee:
19
- field: 所得稅費用(利益)合計
23
+ field:
24
+ - 所得稅費用(利益)合計
20
25
  value: value
21
26
 
22
27
  # TODO: 以下所爬到的資料都是累計的,Ifa有額外計算當季的變化量
23
28
  operating_cash_flow:
24
- field: 營業活動之淨現金流入(流出)
29
+ field:
30
+ - 營業活動之淨現金流入(流出)
25
31
  value: single_season_value
26
32
 
27
33
  invest_cash_flow:
28
- field: 投資活動之淨現金流入(流出)
34
+ field:
35
+ - 投資活動之淨現金流入(流出)
29
36
  value: single_season_value
30
37
 
31
38
  financing_cash_flow:
32
- field: 籌資活動之淨現金流入(流出)
39
+ field:
40
+ - 籌資活動之淨現金流入(流出)
33
41
  value: single_season_value
34
42
  # ^^^ 以上皆需要額外在DataBase處理
35
43
 
36
44
  # 每股財務狀況
37
45
  capital:
38
- field: 普通股股本
46
+ field:
47
+ - 普通股股本
39
48
  value: value
49
+
40
50
  eps:
41
- field: 基本每股盈餘
51
+ field:
52
+ - 基本每股盈餘
42
53
  value: value
43
54
 
44
55
  # 獲利能力
45
- total_asset:
46
- field: 資產總額
56
+ total_assets:
57
+ field:
58
+ - 資產總額
47
59
  value: value
48
60
 
49
61
  equity:
50
- field: 權益總額
62
+ field:
63
+ - 權益總額
51
64
  value: value
52
65
 
53
66
  net_income_before_tax:
54
- field: 稅前淨利(淨損)
67
+ field:
68
+ - 稅前淨利(淨損)
55
69
  value: value
56
70
 
57
71
  interest:
58
- field: 利息收入
72
+ field:
73
+ - 利息收入
59
74
  value: value
60
75
 
61
76
  operating_expenses:
62
- field: 營業費用合計
77
+ field:
78
+ - 營業費用合計
63
79
  value: value
64
80
 
65
81
  net_income_rate:
66
- field: 本期淨利(淨損)
82
+ field:
83
+ - 本期淨利(淨損)
67
84
  value: percentage
68
85
  # 成長動能
69
86
  revenue_YoY:
70
- field: 營業收入合計
87
+ field:
88
+ - 營業收入合計
71
89
  value: YoY_1
72
90
 
73
91
  gross_prof_YoY:
74
- field: 營業毛利(毛損)淨額
92
+ field:
93
+ - 營業毛利(毛損)淨額
75
94
  value: YoY_1
76
95
 
77
96
  operating_income_YoY:
78
- field: 營業利益(損失)
97
+ field:
98
+ - 營業利益(損失)
79
99
  value: YoY_1
80
100
 
81
101
  net_income_YoY:
82
- field: 本期淨利(淨損)
102
+ field:
103
+ - 本期淨利(淨損)
83
104
  value: YoY_1
84
105
 
85
106
  operating_cash_flow_YoY:
86
- field: 營業活動之淨現金流入(流出)
107
+ field:
108
+ - 營業活動之淨現金流入(流出)
87
109
  value: single_season_YoY
88
110
 
89
111
  # operating_cash_flow_per_share_YoY:
@@ -91,53 +113,73 @@ operating_cash_flow_YoY:
91
113
  # value: YoY_1
92
114
  # 營運指標
93
115
  account_receive:
94
- field: 應收帳款淨額
116
+ field:
117
+ - 應收帳款淨額
95
118
  value: value
96
119
 
97
120
  account_pay:
98
- field: 應付帳款
121
+ field:
122
+ - 應付帳款
99
123
  value: value
100
124
 
101
125
  inventories:
102
- field: 存貨
126
+ field:
127
+ - 存貨
103
128
  value: value
104
129
 
105
130
  operating_cost:
106
- field: 營業成本合計
131
+ field:
132
+ - 營業成本合計
107
133
  value: value
108
134
 
109
135
  application:
110
- field: 不動產、廠房及設備
136
+ field:
137
+ - 不動產、廠房及設備
111
138
  value: value
112
139
 
113
140
  # 財務韌性
114
141
  current_assets:
115
- field: 流動資產合計
142
+ field:
143
+ - 流動資產合計
116
144
  value: value
117
145
 
118
146
  current_liabilities:
119
- field: 流動負債合計
147
+ field:
148
+ - 流動負債合計
120
149
  value: value
121
150
 
122
151
  total_liabilities:
123
- field: 負債總額
152
+ field:
153
+ - 負債總額
124
154
  value: value
125
155
 
126
156
  short_term_liabilities:
127
- field: 短期借款
157
+ field:
158
+ - 短期借款
128
159
  value: value
129
160
 
130
161
  long_term_liabilities:
131
- field: 長期借款
162
+ field:
163
+ - 長期借款
132
164
  value: value
133
165
  #
134
166
  cash_and_cash_equivalents:
135
- field: 現金及約當現金
167
+ field:
168
+ - 現金及約當現金
136
169
  value: value
137
170
 
138
171
  interest_expense:
139
- field: 利息費用
172
+ field:
173
+ - 利息費用
140
174
  value: value
141
175
 
176
+ non_current_assets:
177
+ field:
178
+ - 非流動資產合計
179
+ value: value
142
180
 
181
+ non_current_liabilities:
182
+ field:
183
+ - 非流動負債合計
184
+ value: value
143
185
 
@@ -6,88 +6,116 @@ grand_total_profit_lose:
6
6
 
7
7
  revenue:
8
8
  mode: growth
9
- target_index: 營業收入合計
9
+ target_index:
10
+ - 營業收入合計
11
+ - 利息收入
10
12
 
11
13
  grand_total_revenue:
12
14
  mode: grand_total_growth
13
- target_index: 營業收入合計
15
+ target_index:
16
+ - 營業收入合計
17
+ - 利息收入
14
18
 
15
19
  gross_profit:
16
20
  mode: growth
17
- target_index: 營業毛利(毛損)淨額
21
+ target_index:
22
+ - 營業毛利(毛損)淨額
18
23
 
19
24
  grand_total_gross_profit:
20
25
  mode: grand_total_growth
21
- target_index: 營業毛利(毛損)淨額
26
+ target_index:
27
+ - 營業毛利(毛損)淨額
22
28
 
23
29
  gross_profit_percentage:
24
30
  mode: percentage
25
- target_index: 營業毛利(毛損)淨額
31
+ target_index:
32
+ - 營業毛利(毛損)淨額
26
33
 
27
34
  grand_total_gross_profit_percentage:
28
35
  mode: grand_total_percentage
29
- target_index: 營業毛利(毛損)淨額
36
+ target_index:
37
+ - 營業毛利(毛損)淨額
30
38
  # 營利
31
39
  operating_income:
32
40
  mode: growth
33
- target_index: 營業利益(損失)
41
+ target_index:
42
+ - 營業利益(損失)
34
43
 
35
44
  grand_total_operating_income:
36
45
  mode: grand_total_growth
37
- target_index: 營業利益(損失)
46
+ target_index:
47
+ - 營業利益(損失)
38
48
 
39
49
  operating_income_percentage:
40
50
  mode: percentage
41
- target_index: 營業利益(損失)
51
+ target_index:
52
+ - 營業利益(損失)
42
53
 
43
54
  grand_total_operating_income_percentage:
44
55
  mode: grand_total_percentage
45
- target_index: 營業利益(損失)
56
+ target_index:
57
+ - 營業利益(損失)
46
58
  # 稅前淨利
47
59
  net_income_before_tax:
48
60
  mode: growth
49
- target_index: 稅前淨利(淨損)
61
+ target_index:
62
+ - 稅前淨利(淨損)
50
63
 
51
64
  grand_total_net_income_before_tax:
52
65
  mode: grand_total_growth
53
- target_index: 稅前淨利(淨損)
66
+ target_index:
67
+ - 稅前淨利(淨損)
54
68
 
55
69
  net_income_before_tax_percentage:
56
70
  mode: percentage
57
- target_index: 稅前淨利(淨損)
71
+ target_index:
72
+ - 稅前淨利(淨損)
58
73
 
59
74
  grand_total_net_income_before_tax_percentage:
60
75
  mode: grand_total_percentage
61
- target_index: 稅前淨利(淨損)
76
+ target_index:
77
+ - 稅前淨利(淨損)
62
78
  # 本期淨利
63
79
  net_income:
64
80
  mode: growth
65
- target_index: 本期淨利(淨損)
81
+ target_index:
82
+ - 本期淨利(淨損)
66
83
 
67
84
  grand_total_net_income:
68
85
  mode: grand_total_growth
69
- target_index: 本期淨利(淨損)
86
+ target_index:
87
+ - 本期淨利(淨損)
70
88
 
71
89
  net_income_percentage:
72
90
  mode: percentage
73
- target_index: 本期淨利(淨損)
91
+ target_index:
92
+ - 本期淨利(淨損)
74
93
 
75
94
  grand_total_income_percentage:
76
95
  mode: grand_total_percentage
77
- target_index: 本期淨利(淨損)
96
+ target_index:
97
+ - 本期淨利(淨損)
78
98
  # EPS
79
99
  EPS:
80
100
  mode: value
81
- target_index: 稀釋每股盈餘
101
+ target_index:
102
+ - 基本每股盈餘
103
+ - 基本每股盈餘合計
82
104
 
83
105
  EPS_growth:
84
106
  mode: growth
85
- target_index: 稀釋每股盈餘
107
+ target_index:
108
+ - 基本每股盈餘
109
+ - 基本每股盈餘合計
86
110
 
87
111
  grand_total_EPS:
88
112
  mode: grand_total
89
- target_index: 稀釋每股盈餘
113
+ target_index:
114
+ - 基本每股盈餘
115
+ - 基本每股盈餘合計
90
116
 
91
117
  grand_total_EPS_growth:
92
118
  mode: grand_total_growth
93
- target_index: 稀釋每股盈餘
119
+ target_index:
120
+ - 基本每股盈餘
121
+ - 基本每股盈餘合計
@@ -22,11 +22,14 @@
22
22
  "其他非流動資產": "balance_sheet",
23
23
  "非流動資產合計": "balance_sheet",
24
24
  "資產總額": "balance_sheet",
25
+ "資產總計": "balance_sheet",
25
26
  "短期借款": "balance_sheet",
26
27
  "長期借款": "balance_sheet",
27
28
  "透過損益按公允價值衡量之金融負債-流動": "balance_sheet",
28
29
  "應付票據": "balance_sheet",
29
30
  "應付帳款": "balance_sheet",
31
+ "應收款項-淨額": "balance_sheet",
32
+ "應付款項": "balance_sheet",
30
33
  "應付帳款-關係人": "balance_sheet",
31
34
  "其他應付款": "balance_sheet",
32
35
  "其他應付款項-關係人": "balance_sheet",
@@ -38,6 +41,7 @@
38
41
  "其他非流動負債": "balance_sheet",
39
42
  "非流動負債合計": "balance_sheet",
40
43
  "負債總額": "balance_sheet",
44
+ "負債總計": "balance_sheet",
41
45
  "普通股股本": "balance_sheet",
42
46
  "股本合計": "balance_sheet",
43
47
  "資本公積-發行溢價": "balance_sheet",
@@ -52,10 +56,12 @@
52
56
  "歸屬於母公司業主之權益合計": "balance_sheet",
53
57
  "非控制權益": "balance_sheet",
54
58
  "權益總額": "balance_sheet",
59
+ "權益總計": "balance_sheet",
55
60
  "負債及權益總計": "balance_sheet",
56
61
  "待註銷股本股數(單位:股)": "balance_sheet",
57
62
  "預收股款(權益項下)之約當發行股數(單位:股)": "balance_sheet",
58
63
  "母公司暨子公司所持有之母公司庫藏股股數(單位:股)": "balance_sheet",
64
+ "應收款項-淨額": "balance_sheet",
59
65
  "繼續營業單位稅前淨利(淨損)": "cash_flow",
60
66
  "停業單位稅前淨利(淨損)": "cash_flow",
61
67
  "本期稅前淨利(淨損)": "cash_flow",
@@ -135,6 +141,7 @@
135
141
  "管理費用": "profit_lose",
136
142
  "研究發展費用": "profit_lose",
137
143
  "營業費用合計": "profit_lose",
144
+ "營業費用": "profit_lose",
138
145
  "營業利益(損失)": "profit_lose",
139
146
  "其他收入": "profit_lose",
140
147
  "其他利益及損失淨額": "profit_lose",
@@ -142,6 +149,7 @@
142
149
  "營業外收入及支出合計": "profit_lose",
143
150
  "稅前淨利(淨損)": "profit_lose",
144
151
  "所得稅費用(利益)合計": "profit_lose",
152
+ "所得稅費用(利益)": "profit_lose",
145
153
  "繼續營業單位本期淨利(淨損)": "profit_lose",
146
154
  "本期淨利(淨損)": "profit_lose",
147
155
  "確定福利計畫之再衡量數": "profit_lose",
@@ -155,5 +163,12 @@
155
163
  "母公司業主(綜合損益)": "profit_lose",
156
164
  "非控制權益(綜合損益)": "profit_lose",
157
165
  "基本每股盈餘": "profit_lose",
158
- "稀釋每股盈餘": "profit_lose"
166
+ "稀釋每股盈餘": "profit_lose",
167
+ "淨收益": "profit_lose",
168
+ "利息收入": "profit_lose",
169
+ "利息費用_bank": "profit_lose",
170
+ "利息淨收益": "profit_lose",
171
+ "繼續營業單位稅前損益": "profit_lose",
172
+ "本期稅後淨利(淨損)": "profit_lose",
173
+ "減:利息費用": "profit_lose"
159
174
  }
@@ -152,10 +152,21 @@ class StatsProcessor:
152
152
  @classmethod
153
153
  def cal_non_percentage(cls, value, to_str=False, postfix="元"):
154
154
  if (isinstance(value, (float, int))):
155
+
155
156
  value = np.round(value, 2).item()
157
+ if (postfix == "千元"):
158
+ value *= 1000
159
+ value = int(value)
160
+
161
+ postfix = "元"
162
+
156
163
  if (to_str):
157
- value = f"{value:.2f}{postfix}"
158
- return value
164
+ if (isinstance(value, float)):
165
+ value = f"{value:.2f}{postfix}"
166
+ return value
167
+ elif (isinstance(value, int)):
168
+ value = f"{value}{postfix}"
169
+ return value
159
170
 
160
171
  else:
161
172
  return value
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: neurostats-API
3
- Version: 0.0.9
3
+ Version: 0.0.11
4
4
  Summary: The service of NeuroStats website
5
5
  Home-page: https://github.com/NeurowattStats/NeuroStats_API.git
6
6
  Author: JasonWang@Neurowatt
@@ -19,6 +19,8 @@ Description-Content-Type: text/markdown
19
19
  - [損益表](#損益表)
20
20
  - [資產負債表](#資產負債表)
21
21
  - [現金流量表](#現金流量表)
22
+ - [版本紀錄](#版本紀錄)
23
+
22
24
 
23
25
  ## 檔案架構
24
26
 
@@ -78,7 +80,7 @@ pip install neurostats-API
78
80
  ```Python
79
81
  >>> import neurostats_API
80
82
  >>> print(neurostats_API.__version__)
81
- 0.0.9
83
+ 0.0.10
82
84
  ```
83
85
 
84
86
  ### 得到最新一期的評價資料與歷年評價
@@ -434,6 +436,11 @@ stats_fetcher.query()
434
436
  > 大部分資料缺失是因為尚未計算,僅先填上已經有的資料
435
437
 
436
438
 
437
- ## TODO
438
- - 將utils/fetcher.py中的功能切分到fetchers資料夾中
439
+ ## 版本紀錄
440
+ ### 0.0.10
441
+ - 更新指標的資料型態: 單位為千元乘以1000之後回傳整數
442
+
443
+ - 處理銀行公司在finanace_overview會報錯誤的問題(未完全解決,因銀行公司財報有許多名稱不同,目前都會顯示為None)
439
444
 
445
+ ### 0.0.9
446
+ - 更新指標的資料型態: 單位為日, %, 倍轉為字串
@@ -0,0 +1,27 @@
1
+ neurostats_API/__init__.py,sha256=oR5iCRZvbIRoODxS1VocreTo19N5L8Omvx_AgflzOO0,20
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=27kdeBuM7dNBRcIyQ1u863CYw0P_DQz-I1G6iSFDq-c,357
5
+ neurostats_API/fetchers/balance_sheet.py,sha256=sQv4Gk5uoKURLEdh57YknOQWiyVwaXJ2Mw75jxNqUS0,5804
6
+ neurostats_API/fetchers/base.py,sha256=NW2SFzrimyAIrdJx1LVmTazelyZOAtcj54kJKHc4Vaw,1662
7
+ neurostats_API/fetchers/cash_flow.py,sha256=TY7VAWVXkj5-mzH5Iu0sIE-oV8MvGmmDy0URNotNV1E,7614
8
+ neurostats_API/fetchers/finance_overview.py,sha256=PxUdWY0x030olYMLcCHDBn068JLmCE2RTOce1dxs5vM,27753
9
+ neurostats_API/fetchers/institution.py,sha256=aODtsFyQcnD9PnMeaehMAN9wZdZ2a0EqSSZO57dY9RE,7691
10
+ neurostats_API/fetchers/month_revenue.py,sha256=nixX2llzjCFr2m2YVjxrSfkBusnZPrPb2dRDq1XLGhw,4251
11
+ neurostats_API/fetchers/profit_lose.py,sha256=xlLNsGSy4Azf4HyZyYaX3dFad-ACO-vuQToBooZi1_w,5698
12
+ neurostats_API/fetchers/tech.py,sha256=wH1kkqiETQhF0HAhk-UIiucnZ3EiL85Q-yMWCcVOiFM,11395
13
+ neurostats_API/fetchers/value_invest.py,sha256=O5IKC8Nl7p5-E-1zoyAyWtiDznaxNemeabanmaHDdJs,3327
14
+ neurostats_API/tools/balance_sheet.yaml,sha256=yTxrWh7m4K3LnaNunETidfNzl6S4Bf58VIg9U38XShQ,648
15
+ neurostats_API/tools/cash_flow_percentage.yaml,sha256=fk2Z4eb1JjGFvP134eJatHacB7BgTkBenhDJr83w8RE,1345
16
+ neurostats_API/tools/finance_overview_dict.yaml,sha256=B9nV75StXkrF3yv2-eezzitlJ38eEK86RD_VY6588gQ,2884
17
+ neurostats_API/tools/profit_lose.yaml,sha256=dcO-0J0BC4p06XBNuowu8ux0NTbyZiOkGfy6szHF6fw,2402
18
+ neurostats_API/tools/seasonal_data_field_dict.txt,sha256=X8yc_el6p8BH_3FikTqBVFGsvWdXT6MHXLfKfi44334,8491
19
+ neurostats_API/utils/__init__.py,sha256=FTYKRFzW2XVXdnSHXnS3mQQaHlKF9xGqrMsgZZ2kroc,142
20
+ neurostats_API/utils/data_process.py,sha256=mDznLqAAZ7gFX3LlJkJvtrMPt38Lh5-NONqgnqT5tSY,5990
21
+ neurostats_API/utils/datetime.py,sha256=XJya4G8b_-ZOaBbMXgQjWh2MC4wc-o6goQ7EQJQMWrQ,773
22
+ neurostats_API/utils/db_client.py,sha256=OYe6yazcR4Aa6jYmy47JrryUeh2NnKGqY2K_lSZe6i8,455
23
+ neurostats_API/utils/fetcher.py,sha256=VbrUhjA-GG5AyjPX2SHtFIbZM4dm3jo0RgZzuCbb_Io,40927
24
+ neurostats_API-0.0.11.dist-info/METADATA,sha256=Tddw5SxRekTkTtemDXgYPoiJf9sxICyRkdlFAbvniSM,18529
25
+ neurostats_API-0.0.11.dist-info/WHEEL,sha256=bFJAMchF8aTQGUgMZzHJyDDMPTO3ToJ7x23SLJa1SVo,92
26
+ neurostats_API-0.0.11.dist-info/top_level.txt,sha256=nSlQPMG0VtXivJyedp4Bkf86EOy2TpW10VGxolXrqnU,15
27
+ neurostats_API-0.0.11.dist-info/RECORD,,
@@ -1,26 +0,0 @@
1
- neurostats_API/__init__.py,sha256=9_jSwg7P5SlFv0Ci2ZSYBcAbygp9XV2C8sryRO8tvko,19
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=U_OMG-mLpsVKYnCBrW2OjFuCzvPeVQ__7A676vGzztY,313
5
- neurostats_API/fetchers/balance_sheet.py,sha256=VeWhd8Z2XZnL5RzxmenLzAd4eyK2sWTuiRGkqWsEmzk,5219
6
- neurostats_API/fetchers/base.py,sha256=NW2SFzrimyAIrdJx1LVmTazelyZOAtcj54kJKHc4Vaw,1662
7
- neurostats_API/fetchers/cash_flow.py,sha256=4G4SIUoBSwT-BePmz-SprQ0IJRL2QNWqWdQtlgaRKd4,7371
8
- neurostats_API/fetchers/finance_overview.py,sha256=EVP7k0JkQq3ydXy0f3t2kzy12iIQEwDniTLn98qZ460,25637
9
- neurostats_API/fetchers/month_revenue.py,sha256=QmhMAO8jbkjg2R1LR0TAPE3bmDnyuLNjnD24ZsFkTBU,3501
10
- neurostats_API/fetchers/profit_lose.py,sha256=C0y42RBA-s20XcG6CJ10Rt6Gm_rB6lcvBmIzbTpn64o,5123
11
- neurostats_API/fetchers/tech.py,sha256=wH1kkqiETQhF0HAhk-UIiucnZ3EiL85Q-yMWCcVOiFM,11395
12
- neurostats_API/fetchers/value_invest.py,sha256=O5IKC8Nl7p5-E-1zoyAyWtiDznaxNemeabanmaHDdJs,3327
13
- neurostats_API/tools/balance_sheet.yaml,sha256=dKTMbsYR9EFp48WAzmm_ISHMiJQLyE0V-XWS_gkxmr0,541
14
- neurostats_API/tools/cash_flow_percentage.yaml,sha256=fk2Z4eb1JjGFvP134eJatHacB7BgTkBenhDJr83w8RE,1345
15
- neurostats_API/tools/finance_overview_dict.yaml,sha256=URL1IFqO0j5uOwN3xETHriy_u9lYbLvdwghuznenP2Q,2500
16
- neurostats_API/tools/profit_lose.yaml,sha256=qHBnqG7fR4Pxc_c3n4raL-3l7o5RnABLz9YGOXoaGiA,2086
17
- neurostats_API/tools/seasonal_data_field_dict.txt,sha256=Za1fJR1yERbqrX8TgsS2kmMYMbaye43Gu_5ukUNBCNM,7904
18
- neurostats_API/utils/__init__.py,sha256=FTYKRFzW2XVXdnSHXnS3mQQaHlKF9xGqrMsgZZ2kroc,142
19
- neurostats_API/utils/data_process.py,sha256=m1B4EhCNSzOMfTBDtYCjkQSjbDTAEFC6TNf3NNxV36k,5657
20
- neurostats_API/utils/datetime.py,sha256=XJya4G8b_-ZOaBbMXgQjWh2MC4wc-o6goQ7EQJQMWrQ,773
21
- neurostats_API/utils/db_client.py,sha256=OYe6yazcR4Aa6jYmy47JrryUeh2NnKGqY2K_lSZe6i8,455
22
- neurostats_API/utils/fetcher.py,sha256=VbrUhjA-GG5AyjPX2SHtFIbZM4dm3jo0RgZzuCbb_Io,40927
23
- neurostats_API-0.0.9.dist-info/METADATA,sha256=z--BAc0e6HHBuXSQgc5ikwjPFzTfe-2o02gFLmgY_do,18232
24
- neurostats_API-0.0.9.dist-info/WHEEL,sha256=bFJAMchF8aTQGUgMZzHJyDDMPTO3ToJ7x23SLJa1SVo,92
25
- neurostats_API-0.0.9.dist-info/top_level.txt,sha256=nSlQPMG0VtXivJyedp4Bkf86EOy2TpW10VGxolXrqnU,15
26
- neurostats_API-0.0.9.dist-info/RECORD,,