neurostats-API 0.0.8__py3-none-any.whl → 0.0.10__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 +1 @@
1
- __version__='0.0.8'
1
+ __version__='0.0.10'
@@ -75,10 +75,16 @@ class BalanceSheetFetcher(StatsFetcher):
75
75
  return fetched_data[-1]
76
76
 
77
77
  def query_data(self):
78
- today = StatsDateTime.get_today()
78
+ try:
79
+ latest_time = StatsDateTime.get_latest_time(
80
+ self.ticker, self.collection)['last_update_time']
81
+ year = latest_time['seasonal_data']['latest_year']
82
+ season = latest_time['seasonal_data']['latest_season']
83
+ except Exception as e:
84
+ today = StatsDateTime.get_today()
85
+ year = today.year - 1 if (today.season == 1) else today.year
86
+ season = 4 if (today.season == 1) else today.season - 1
79
87
 
80
- year = today.year - 1 if (today.season == 1) else today.year
81
- season = 4 if (today.season == 1) else today.season - 2
82
88
  fetched_data = self.collect_data(year, season)
83
89
 
84
90
  return self.process_data(season, fetched_data)
@@ -126,10 +132,17 @@ class BalanceSheetFetcher(StatsFetcher):
126
132
  total_table.columns = pd.MultiIndex.from_tuples(total_table.columns)
127
133
 
128
134
  for name, setting in self.table_settings.items():
129
- return_dict[name] = StatsProcessor.slice_multi_col_table(
130
- total_table=total_table,
131
- mode=setting['mode'],
132
- target_index=setting['target_index']
133
- if "target_index" in setting.keys() else None)
134
-
135
+ if ('target_index' in setting.keys()):
136
+ target_indexes = [target_index.strip() for target_index in setting['target_index']]
137
+ else:
138
+ target_indexes = [None]
139
+ for target_index in target_indexes:
140
+ try:
141
+ return_dict[name] = StatsProcessor.slice_multi_col_table(
142
+ total_table=total_table,
143
+ mode=setting['mode'],
144
+ target_index=target_index)
145
+ break
146
+ except Exception as e:
147
+ continue
135
148
  return return_dict
@@ -65,9 +65,14 @@ class CashFlowFetcher(StatsFetcher):
65
65
  return list(fetched_data)[0]
66
66
 
67
67
  def query_data(self):
68
- today = StatsDateTime.get_today()
69
-
70
- target_season = today.season - 1 if (today.season > 1) else 4
68
+
69
+ try:
70
+ latest_time = StatsDateTime.get_latest_time(self.ticker, self.collection)['last_update_time']
71
+ target_season = latest_time['seasonal_data']['latest_season']
72
+
73
+ except:
74
+ today = StatsDateTime.get_today()
75
+ target_season = today.season - 1 if (today.season > 1) else 4
71
76
 
72
77
  fetched_data = self.collect_data(target_season)
73
78
 
@@ -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
 
@@ -83,16 +87,31 @@ class FinanceOverviewFetcher(StatsFetcher):
83
87
  return fetched_data[0]
84
88
 
85
89
  def query_data(self):
86
- today = StatsDateTime.get_today()
87
90
 
88
- year = today.year - 1 if (today.season == 1) else today.year
89
- season = 4 if (today.season == 1) else today.season - 1
91
+ try:
92
+ latest_time = StatsDateTime.get_latest_time(
93
+ self.ticker, self.collection)['last_update_time']
94
+ year = latest_time['seasonal_data']['latest_year']
95
+ season = latest_time['seasonal_data']['latest_season']
96
+ except Exception as e:
97
+ today = StatsDateTime.get_today()
98
+ year = today.year - 1 if (today.season == 1) else today.year
99
+ season = 4 if (today.season == 1) else today.season - 1
100
+
90
101
  fetched_data = self.collect_data(year, season)
91
102
  finance_dict = fetched_data['seasonal_data'][0]
92
103
  FinanceOverviewProcessor.process_rate(finance_dict)
93
104
  FinanceOverviewProcessor.process_all(finance_dict)
105
+ self.fill_nan_index(finance_dict)
106
+ FinanceOverviewProcessor.process_thousand_dollar(finance_dict)
94
107
  fetched_data['seasonal_data'] = finance_dict
108
+
95
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
96
115
 
97
116
 
98
117
  class FinanceOverviewProcessor(StatsProcessor):
@@ -109,6 +128,34 @@ class FinanceOverviewProcessor(StatsProcessor):
109
128
  else:
110
129
  finance_dict[key] = StatsProcessor.cal_non_percentage(
111
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
112
159
 
113
160
  @classmethod
114
161
  def process_all(cls, finance_dict):
@@ -128,12 +175,16 @@ class FinanceOverviewProcessor(StatsProcessor):
128
175
  cls.cal_quick_ratio, cls.cal_debt_to_equity_ratio,
129
176
  cls.cal_net_debt_to_equity_ratio, cls.cal_interest_coverage_ratio,
130
177
  cls.cal_debt_to_operating_cash_flow,
131
- cls.cal_debt_to_free_cash_flow, cls.cal_cash_flow_ratio
178
+ cls.cal_debt_to_free_cash_flow, cls.cal_cash_flow_ratio,
179
+
180
+ # process to 千元
181
+ cls.process_thousand_dollar
132
182
  ]
133
183
 
134
184
  for method in methods:
135
185
  method(finance_dict)
136
186
 
187
+
137
188
  @classmethod
138
189
  def cal_EBIT(cls, finance_dict):
139
190
  """
@@ -142,7 +193,8 @@ class FinanceOverviewProcessor(StatsProcessor):
142
193
  """
143
194
  try:
144
195
  EBIT = (finance_dict['revenue'] - finance_dict['operating_cost'] -
145
- finance_dict['operating_expenses'] - finance_dict['tax_fee'])
196
+ finance_dict['operating_expenses'] -
197
+ finance_dict['tax_fee'])
146
198
  finance_dict['EBIT'] = StatsProcessor.cal_non_percentage(EBIT)
147
199
  except (KeyError, ZeroDivisionError, TypeError) as e:
148
200
  finance_dict['EBIT'] = None
@@ -216,7 +268,14 @@ class FinanceOverviewProcessor(StatsProcessor):
216
268
  計算每股毛利
217
269
  = (當期營業毛利)÷(當期在外流通股數)
218
270
  """
219
-
271
+ if ('gross_profit' not in finance_dict.keys()):
272
+ try:
273
+ finance_dict['gross_profit'] = (
274
+ finance_dict['revenue'] -
275
+ finance_dict['operating_cost']
276
+ )
277
+ except:
278
+ finance_dict['gross_profit'] = None
220
279
  try:
221
280
  gross_per_share = (finance_dict['gross_profit'] /
222
281
  finance_dict['share_outstanding'])
@@ -259,7 +318,7 @@ class FinanceOverviewProcessor(StatsProcessor):
259
318
  operating_cash_flow_per_share)
260
319
  except (KeyError, ZeroDivisionError, TypeError) as e:
261
320
  finance_dict['operating_cash_flow_per_share'] = None
262
- print(f'operating_cash_flow_per_share because of {str(e)}')
321
+ # print(f'operating_cash_flow_per_share because of {str(e)}')
263
322
 
264
323
  @classmethod
265
324
  def fcf_per_share(cls, finance_dict):
@@ -284,12 +343,15 @@ class FinanceOverviewProcessor(StatsProcessor):
284
343
  計算資產報酬率(ROA)
285
344
  ROA = [ 本期淨利 + 利息費用 × (1-有效稅率) ] ÷(資產總額)
286
345
  """
287
- roa = (
288
- finance_dict['net_income'] + finance_dict['interest'] +
289
- (1 * 0.1) # 有效稅率需要改,這裡先設0.1
290
- ) / finance_dict['inventories']
346
+ try:
347
+ roa = (
348
+ finance_dict['net_income'] + finance_dict['interest'] +
349
+ (1 * 0.1) # 有效稅率需要改,這裡先設0.1
350
+ ) / finance_dict['inventories']
291
351
 
292
- finance_dict["roa"] = StatsProcessor.cal_percentage(roa)
352
+ finance_dict["roa"] = StatsProcessor.cal_percentage(roa)
353
+ except Exception as e:
354
+ finance_dict["roa"] = None
293
355
 
294
356
  @classmethod
295
357
  def cal_roe(cls, finance_dict):
@@ -297,8 +359,11 @@ class FinanceOverviewProcessor(StatsProcessor):
297
359
  計算股東權益報酬率(ROE)
298
360
  ROE = (本期淨利) ÷(權益總額)
299
361
  """
300
- roe = (finance_dict['net_income'] / finance_dict['equity'])
301
- finance_dict['roe'] = StatsProcessor.cal_percentage(roe)
362
+ try:
363
+ roe = (finance_dict['net_income'] / finance_dict['equity'])
364
+ finance_dict['roe'] = StatsProcessor.cal_percentage(roe)
365
+ except Exception as e:
366
+ finance_dict['roe'] = None
302
367
 
303
368
  @classmethod
304
369
  def cal_gross_over_asset(cls, finance_dict):
@@ -307,7 +372,7 @@ class FinanceOverviewProcessor(StatsProcessor):
307
372
  """
308
373
  try:
309
374
  gross_over_asset = (finance_dict['gross_profit'] /
310
- finance_dict['total_asset'])
375
+ finance_dict['total_assets'])
311
376
  finance_dict['gross_over_asset'] = StatsProcessor.cal_percentage(
312
377
  gross_over_asset)
313
378
  except (KeyError, ZeroDivisionError, TypeError) as e:
@@ -323,7 +388,7 @@ class FinanceOverviewProcessor(StatsProcessor):
323
388
  try:
324
389
  roce = ((finance_dict['net_income_before_tax'] +
325
390
  finance_dict['interest']) /
326
- (finance_dict['total_asset'] -
391
+ (finance_dict['total_assets'] -
327
392
  finance_dict['current_liabilities']))
328
393
  finance_dict['roce'] = StatsProcessor.cal_percentage(roce)
329
394
 
@@ -343,7 +408,7 @@ class FinanceOverviewProcessor(StatsProcessor):
343
408
  finance_dict[
344
409
  'gross_profit_margin'] = StatsProcessor.cal_percentage(
345
410
  gross_profit_margin)
346
- except:
411
+ except Exception as e:
347
412
  finance_dict['gross_profit_margin'] = None
348
413
  print(f"gross_profit_margin failed because of {str(e)}")
349
414
 
@@ -401,7 +466,7 @@ class FinanceOverviewProcessor(StatsProcessor):
401
466
  (finance_dict['account_pay'] / finance_dict['revenue']))
402
467
  finance_dict['dso'] = StatsProcessor.cal_non_percentage(
403
468
  dso, to_str=True, postfix="日")
404
- except:
469
+ except Exception as e:
405
470
  finance_dict['dso'] = None
406
471
  print(f"Error calculating 應收帳款收現天數 because of {str(e)}")
407
472
 
@@ -411,11 +476,15 @@ class FinanceOverviewProcessor(StatsProcessor):
411
476
  計算應收帳款佔營收比率
412
477
  = 應收帳款平均餘額 ÷ 營業收入
413
478
  """
414
- account_receive_over_revenue = (finance_dict['account_receive'] /
415
- finance_dict['revenue'])
416
- finance_dict[
417
- "account_receive_over_revenue"] = StatsProcessor.cal_percentage(
418
- account_receive_over_revenue)
479
+ try:
480
+ account_receive_over_revenue = (finance_dict['account_receive'] /
481
+ finance_dict['revenue'])
482
+ finance_dict[
483
+ "account_receive_over_revenue"] = StatsProcessor.cal_percentage(
484
+ account_receive_over_revenue)
485
+ except Exception as e:
486
+ finance_dict[
487
+ "account_receive_over_revenue"] = None
419
488
 
420
489
  @classmethod
421
490
  def cal_dpo(cls, finance_dict):
@@ -505,10 +574,13 @@ class FinanceOverviewProcessor(StatsProcessor):
505
574
  計算資產周轉率
506
575
  營業收入 ÷ 資產總額
507
576
  """
508
- asset_turnover = (finance_dict["revenue"] /
509
- finance_dict["inventories"])
510
- finance_dict["asset_turnover"] = StatsProcessor.cal_percentage(
511
- asset_turnover)
577
+ try:
578
+ asset_turnover = (finance_dict["revenue"] /
579
+ finance_dict["inventories"])
580
+ finance_dict["asset_turnover"] = StatsProcessor.cal_percentage(
581
+ asset_turnover)
582
+ except Exception as e:
583
+ finance_dict["asset_turnover"] = None
512
584
 
513
585
  @classmethod
514
586
  def cal_application_turnover(cls, finance_dict):
@@ -520,11 +592,12 @@ class FinanceOverviewProcessor(StatsProcessor):
520
592
  applcation_turnover = (finance_dict['revenue'] /
521
593
  finance_dict["application"])
522
594
  finance_dict[
523
- 'applcation_turnover'] = StatsProcessor.cal_percentage(
595
+ 'application_turnover'] = StatsProcessor.cal_percentage(
524
596
  applcation_turnover)
525
597
 
526
- except (KeyError, ZeroDivisionError, TypeError) as e:
598
+ except Exception as e:
527
599
  finance_dict['application_turnover'] = None
600
+
528
601
 
529
602
  @classmethod
530
603
  def cal_current_ratio(cls, finance_dict):
@@ -0,0 +1,114 @@
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
+ raise(NotImplementedError("InstitutionFetcher : Not done yet"))
22
+ super().__init__(ticker, db_client)
23
+
24
+ def prepare_query(self, start_date, end_date):
25
+ pipeline = super().prepare_query()
26
+
27
+ target_query = {
28
+ "date": date,
29
+ "institution_trading": "$$target_season_data.institution_trading"
30
+ }
31
+
32
+
33
+ pipeline.append({
34
+ "$project": {
35
+ "_id": 0,
36
+ "ticker": 1,
37
+ "company_name": 1,
38
+ "profit_loses": {
39
+ "$map": {
40
+ "input": {
41
+ "$filter": {
42
+ "input": "$daily_data",
43
+ "as": "daily",
44
+ "cond": {
45
+ "$and": [
46
+ {"$gte": ["$$daily.date", start_date]},
47
+ {"$lte": ["$$daily.date", end_date]}
48
+ ]
49
+ }
50
+ }
51
+ },
52
+ "as": "target_daily_data",
53
+ "in": "$$target_daily_data"
54
+ }
55
+ }
56
+ }
57
+ })
58
+
59
+ return pipeline
60
+
61
+ def collect_data(self, date):
62
+ pipeline = self.prepare_query(date)
63
+
64
+ fetched_data = self.collection.aggregate(pipeline).to_list()
65
+
66
+ return fetch_data[-1]
67
+
68
+ def query_data(self):
69
+ try:
70
+ latest_time = StatsDateTime.get_latest_time(
71
+ self.ticker, self.collection)['last_update_time']
72
+ latest_date = latest_time['daily_data']['institution_trading']['last_update']
73
+ date = latest_date.replace(hour=0, minute=0, second=0, microsecond=0)
74
+ except Exception as e:
75
+ print(f"No updated time for institution_trading in {self.ticker}, use current time instead")
76
+ date = datetime.now(self.timezone)
77
+ date = date.replace(hour=0, minute=0, second=0, microsecond=0)
78
+
79
+ if (date.hour < 17): # 拿不到今天的資料
80
+ date = date - timedelta(days=1)
81
+
82
+ start_date = start_date - timedelta(days=365)
83
+
84
+ daily_data = self.collect_data(date)
85
+
86
+ daily_data = sorted(daily_data['daily_data'], key = lambda x : x['date'], reverse = True)
87
+
88
+ self.process_data(self.ticker, daily_data)
89
+
90
+ def process_data(self, daily_data):
91
+ table_dict = dict()
92
+
93
+ latest_data = daily_data[0]
94
+ yesterday_data = daily_data[1]
95
+
96
+ # 交易價格與昨天交易
97
+ table_dict = {
98
+ "open": latest_data['open'],
99
+ 'close': latest_data['close'],
100
+ 'range': f"{latest_data['high']}-{latest_data['low']}",
101
+ 'volumn': latest_data['volumn'] / 1000
102
+
103
+ }
104
+
105
+ # 今日法人買賣
106
+
107
+ # 一年內法人
108
+
109
+
110
+
111
+
112
+
113
+
114
+
@@ -46,9 +46,15 @@ class MonthRevenueFetcher(StatsFetcher):
46
46
  return fetched_data[-1]
47
47
 
48
48
  def query_data(self):
49
- today = StatsDateTime.get_today()
50
- target_month = today.month
51
- target_year = today.year
49
+ try:
50
+ latest_time = StatsDateTime.get_latest_time(
51
+ self.ticker, self.collection)['last_update_time']
52
+ target_year = latest_time['monthly_data']['latest_year']
53
+ target_month = latest_time['monthly_data']['latest_month']
54
+ except Exception as e:
55
+ today = StatsDateTime.get_today()
56
+ target_month = today.month
57
+ target_year = today.year
52
58
 
53
59
  # Query data
54
60
  fetched_data = self.collect_data(target_year, target_month)
@@ -75,10 +75,15 @@ class ProfitLoseFetcher(StatsFetcher):
75
75
  return list(fetched_data)[-1]
76
76
 
77
77
  def query_data(self):
78
- today = StatsDateTime.get_today()
78
+ try:
79
+ latest_time = StatsDateTime.get_latest_time(
80
+ self.ticker, self.collection)['last_update_time']
81
+ target_season = latest_time['seasonal_data']['latest_season']
82
+ except Exception as e:
83
+ today = StatsDateTime.get_today()
79
84
 
80
- target_season = today.season
81
- target_season = target_season - 1 if target_season > 1 else 4
85
+ target_season = today.season
86
+ target_season = target_season - 1 if target_season > 1 else 4
82
87
 
83
88
  fetched_data = self.collect_data(target_season)
84
89
 
@@ -132,10 +137,19 @@ class ProfitLoseFetcher(StatsFetcher):
132
137
  total_table = total_table.replace("N/A", None)
133
138
 
134
139
  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
+ if ('target_index' in setting.keys()):
141
+ target_indexes = [target.strip() for target in setting['target_index']]
142
+ else:
143
+ target_indexes = [None]
144
+
145
+ for target_index in target_indexes:
146
+ try:
147
+ return_dict[name] = StatsProcessor.slice_multi_col_table(
148
+ total_table=total_table,
149
+ mode=setting['mode'],
150
+ target_index=target_index)
151
+ break
152
+ except Exception as e:
153
+ continue
140
154
 
141
155
  return return_dict
@@ -54,11 +54,20 @@ class ValueFetcher(StatsFetcher):
54
54
  return pipeline
55
55
 
56
56
  def query_data(self):
57
- today = StatsDateTime.get_today()
58
-
59
- this_year = today.year - 1911
60
- start_date = (today.date - timedelta(days=31))
61
- end_date = today.date
57
+ try:
58
+ latest_time = StatsDateTime.get_latest_time(
59
+ self.ticker, self.collection)['last_update_time']
60
+ target_year = latest_time['daily_data']['last_update'].year
61
+ start_date = latest_time['daily_data']['last_update'] - timedelta(days=31)
62
+ end_date = latest_time['daily_data']['last_update']
63
+
64
+ except Exception as e:
65
+ today = StatsDateTime.get_today()
66
+ target_year = today.year
67
+ start_date = (today.date - timedelta(days=31))
68
+ end_date = today.date
69
+
70
+ this_year = target_year - 1911
62
71
 
63
72
  fetched_data = self.collect_data(start_date, end_date)
64
73
 
@@ -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
@@ -19,3 +19,11 @@ class StatsDateTime():
19
19
 
20
20
  return StatsDateTime(today, this_year, this_month, this_day,
21
21
  this_season)
22
+
23
+ @classmethod
24
+ def get_latest_time(cls, ticker, collection):
25
+ return collection.find_one(
26
+ { "ticker" : ticker },
27
+ { "_id": 0, "last_update_time": 1 }
28
+ )
29
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: neurostats-API
3
- Version: 0.0.8
3
+ Version: 0.0.10
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.8
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=WzeHQJ3r8kPKWXSBuphad80I6bJ-GJORgQF6wSrYmhI,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=U_OMG-mLpsVKYnCBrW2OjFuCzvPeVQ__7A676vGzztY,313
5
+ neurostats_API/fetchers/balance_sheet.py,sha256=3FzVuDPm88tgljvu5gIxVXcZYQWebMrGnM5_ch9Vdgw,5549
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=hmMurCSCEjYBQ6gRmVgoX6T57g8MjsdWec6LdVztVoE,27813
9
+ neurostats_API/fetchers/institution.py,sha256=EYxPebJrcCMm7fW2nBlu4bVsksMMxgcQh16jJ1NxP6I,3384
10
+ neurostats_API/fetchers/month_revenue.py,sha256=QmhMAO8jbkjg2R1LR0TAPE3bmDnyuLNjnD24ZsFkTBU,3501
11
+ neurostats_API/fetchers/profit_lose.py,sha256=nc9YVi5kv3_loF8m82h3Fxpms7573_rPP9OM36bCK3A,5455
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.10.dist-info/METADATA,sha256=2zDomUXohUsLpnl4MeD6anZimrhnWvd8n0Rv8d4qkUk,18529
25
+ neurostats_API-0.0.10.dist-info/WHEEL,sha256=bFJAMchF8aTQGUgMZzHJyDDMPTO3ToJ7x23SLJa1SVo,92
26
+ neurostats_API-0.0.10.dist-info/top_level.txt,sha256=nSlQPMG0VtXivJyedp4Bkf86EOy2TpW10VGxolXrqnU,15
27
+ neurostats_API-0.0.10.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=kOpk_83qeNgfhjF44UEmma8k6V6qTsIaFYiEcSVV20A,4910
6
- neurostats_API/fetchers/base.py,sha256=NW2SFzrimyAIrdJx1LVmTazelyZOAtcj54kJKHc4Vaw,1662
7
- neurostats_API/fetchers/cash_flow.py,sha256=5xN5YPGb7i4slDYe_KI2ucL4kh733iC5LLOEmm4J8mM,7137
8
- neurostats_API/fetchers/finance_overview.py,sha256=-cUb4wWr02xKhNCAXLuduhpvXsO0b14hJLqJqhagooY,25307
9
- neurostats_API/fetchers/month_revenue.py,sha256=RNA7ROl2vm8Xbib3k50p_1shsHDVSKIbHkyNiRa8yMw,3182
10
- neurostats_API/fetchers/profit_lose.py,sha256=aCvcTbe1FjR3oi8QIDZg0c6G7-r0B-cCdfj6Rtlw0Jw,4870
11
- neurostats_API/fetchers/tech.py,sha256=wH1kkqiETQhF0HAhk-UIiucnZ3EiL85Q-yMWCcVOiFM,11395
12
- neurostats_API/fetchers/value_invest.py,sha256=tg8yELbVnTFTEclrwgXnCRW377KkcoLiP-Gk2pyM-9Y,2886
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=I9CIgZdE5OMzUciOS5wvapOVEIrXG_0Qb6iDKfIod6c,574
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.8.dist-info/METADATA,sha256=SCspApNeq7b9pflJC30SaOVCdZtQjBIbh6QOps9HnGw,18232
24
- neurostats_API-0.0.8.dist-info/WHEEL,sha256=bFJAMchF8aTQGUgMZzHJyDDMPTO3ToJ7x23SLJa1SVo,92
25
- neurostats_API-0.0.8.dist-info/top_level.txt,sha256=nSlQPMG0VtXivJyedp4Bkf86EOy2TpW10VGxolXrqnU,15
26
- neurostats_API-0.0.8.dist-info/RECORD,,