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.
- neurostats_API/__init__.py +1 -1
- neurostats_API/fetchers/balance_sheet.py +22 -9
- neurostats_API/fetchers/cash_flow.py +8 -3
- neurostats_API/fetchers/finance_overview.py +109 -36
- neurostats_API/fetchers/institution.py +114 -0
- neurostats_API/fetchers/month_revenue.py +9 -3
- neurostats_API/fetchers/profit_lose.py +22 -8
- neurostats_API/fetchers/value_invest.py +14 -5
- neurostats_API/tools/balance_sheet.yaml +15 -7
- neurostats_API/tools/finance_overview_dict.yaml +76 -34
- neurostats_API/tools/profit_lose.yaml +50 -22
- neurostats_API/tools/seasonal_data_field_dict.txt +16 -1
- neurostats_API/utils/data_process.py +13 -2
- neurostats_API/utils/datetime.py +8 -0
- {neurostats_API-0.0.8.dist-info → neurostats_API-0.0.10.dist-info}/METADATA +11 -4
- neurostats_API-0.0.10.dist-info/RECORD +27 -0
- neurostats_API-0.0.8.dist-info/RECORD +0 -26
- {neurostats_API-0.0.8.dist-info → neurostats_API-0.0.10.dist-info}/WHEEL +0 -0
- {neurostats_API-0.0.8.dist-info → neurostats_API-0.0.10.dist-info}/top_level.txt +0 -0
neurostats_API/__init__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__='0.0.
|
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
|
-
|
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
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
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
|
-
|
69
|
-
|
70
|
-
|
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
|
-
|
35
|
-
|
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
|
-
|
40
|
-
|
41
|
-
|
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
|
-
|
89
|
-
|
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'] -
|
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
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
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
|
-
|
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
|
-
|
301
|
-
|
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['
|
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['
|
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
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
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
|
-
|
509
|
-
|
510
|
-
|
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
|
-
'
|
595
|
+
'application_turnover'] = StatsProcessor.cal_percentage(
|
524
596
|
applcation_turnover)
|
525
597
|
|
526
|
-
except
|
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
|
-
|
50
|
-
|
51
|
-
|
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
|
-
|
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
|
-
|
81
|
-
|
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
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
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
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
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
|
-
|
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
|
158
|
-
|
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
|
neurostats_API/utils/datetime.py
CHANGED
@@ -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.
|
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.
|
83
|
+
0.0.10
|
82
84
|
```
|
83
85
|
|
84
86
|
### 得到最新一期的評價資料與歷年評價
|
@@ -434,6 +436,11 @@ stats_fetcher.query()
|
|
434
436
|
> 大部分資料缺失是因為尚未計算,僅先填上已經有的資料
|
435
437
|
|
436
438
|
|
437
|
-
##
|
438
|
-
|
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,,
|
File without changes
|
File without changes
|