neurostats-API 0.0.7__tar.gz → 0.0.9__tar.gz
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-0.0.7 → neurostats_API-0.0.9}/PKG-INFO +6 -5
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/README.md +5 -4
- neurostats_API-0.0.9/neurostats_API/__init__.py +1 -0
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API/fetchers/balance_sheet.py +53 -34
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API/fetchers/cash_flow.py +15 -7
- neurostats_API-0.0.9/neurostats_API/fetchers/finance_overview.py +656 -0
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API/fetchers/month_revenue.py +9 -3
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API/fetchers/profit_lose.py +19 -4
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API/fetchers/value_invest.py +14 -5
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API/tools/finance_overview_dict.yaml +15 -8
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API/tools/seasonal_data_field_dict.txt +1 -0
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API/utils/data_process.py +28 -2
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API/utils/datetime.py +8 -0
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API.egg-info/PKG-INFO +6 -5
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/setup.py +1 -1
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/test/test_fetchers.py +2 -0
- neurostats_API-0.0.7/neurostats_API/__init__.py +0 -1
- neurostats_API-0.0.7/neurostats_API/fetchers/finance_overview.py +0 -501
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/MANIFEST.in +0 -0
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API/cli.py +0 -0
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API/fetchers/__init__.py +0 -0
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API/fetchers/base.py +0 -0
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API/fetchers/tech.py +0 -0
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API/main.py +0 -0
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API/tools/balance_sheet.yaml +0 -0
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API/tools/cash_flow_percentage.yaml +0 -0
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API/tools/profit_lose.yaml +0 -0
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API/utils/__init__.py +0 -0
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API/utils/db_client.py +0 -0
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API/utils/fetcher.py +0 -0
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API.egg-info/SOURCES.txt +0 -0
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API.egg-info/dependency_links.txt +0 -0
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/neurostats_API.egg-info/top_level.txt +0 -0
- {neurostats_API-0.0.7 → neurostats_API-0.0.9}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: neurostats_API
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.9
|
4
4
|
Summary: The service of NeuroStats website
|
5
5
|
Home-page: https://github.com/NeurowattStats/NeuroStats_API.git
|
6
6
|
Author: JasonWang@Neurowatt
|
@@ -78,7 +78,7 @@ pip install neurostats-API
|
|
78
78
|
```Python
|
79
79
|
>>> import neurostats_API
|
80
80
|
>>> print(neurostats_API.__version__)
|
81
|
-
0.0.
|
81
|
+
0.0.9
|
82
82
|
```
|
83
83
|
|
84
84
|
### 得到最新一期的評價資料與歷年評價
|
@@ -379,11 +379,12 @@ stats_fetcher.query_data()
|
|
379
379
|
|
380
380
|
### 現金流量表
|
381
381
|
``` Python
|
382
|
-
from neurostats_API.
|
382
|
+
from neurostats_API.fetchers import CashFlowFetcher
|
383
383
|
db_client = DBClient("<連接的DB位置>").get_client()
|
384
|
-
fetcher = StatsFetcher(db_client)
|
385
384
|
ticker = 2330 # 換成tw50內任意ticker
|
386
|
-
|
385
|
+
fetcher = StatsFetcher(ticker, db_client)
|
386
|
+
|
387
|
+
stats_fetcher.query()
|
387
388
|
```
|
388
389
|
#### 回傳
|
389
390
|
```Python
|
@@ -68,7 +68,7 @@ pip install neurostats-API
|
|
68
68
|
```Python
|
69
69
|
>>> import neurostats_API
|
70
70
|
>>> print(neurostats_API.__version__)
|
71
|
-
0.0.
|
71
|
+
0.0.9
|
72
72
|
```
|
73
73
|
|
74
74
|
### 得到最新一期的評價資料與歷年評價
|
@@ -369,11 +369,12 @@ stats_fetcher.query_data()
|
|
369
369
|
|
370
370
|
### 現金流量表
|
371
371
|
``` Python
|
372
|
-
from neurostats_API.
|
372
|
+
from neurostats_API.fetchers import CashFlowFetcher
|
373
373
|
db_client = DBClient("<連接的DB位置>").get_client()
|
374
|
-
fetcher = StatsFetcher(db_client)
|
375
374
|
ticker = 2330 # 換成tw50內任意ticker
|
376
|
-
|
375
|
+
fetcher = StatsFetcher(ticker, db_client)
|
376
|
+
|
377
|
+
stats_fetcher.query()
|
377
378
|
```
|
378
379
|
#### 回傳
|
379
380
|
```Python
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__='0.0.8'
|
@@ -1,10 +1,12 @@
|
|
1
1
|
from .base import StatsFetcher, StatsDateTime
|
2
2
|
import json
|
3
|
+
import numpy as np
|
3
4
|
import pandas as pd
|
4
5
|
from ..utils import StatsDateTime, StatsProcessor
|
5
6
|
import importlib.resources as pkg_resources
|
6
7
|
import yaml
|
7
8
|
|
9
|
+
|
8
10
|
class BalanceSheetFetcher(StatsFetcher):
|
9
11
|
"""
|
10
12
|
對應iFa.ai -> 財務分析 -> 資產負債表
|
@@ -13,7 +15,7 @@ class BalanceSheetFetcher(StatsFetcher):
|
|
13
15
|
def __init__(self, ticker, db_client):
|
14
16
|
super().__init__(ticker, db_client)
|
15
17
|
self.table_settings = StatsProcessor.load_yaml("balance_sheet.yaml")
|
16
|
-
|
18
|
+
|
17
19
|
def prepare_query(self, target_year, target_season):
|
18
20
|
pipeline = super().prepare_query()
|
19
21
|
|
@@ -24,36 +26,42 @@ class BalanceSheetFetcher(StatsFetcher):
|
|
24
26
|
}
|
25
27
|
|
26
28
|
pipeline.append({
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
29
|
+
"$project": {
|
30
|
+
"_id": 0,
|
31
|
+
"ticker": 1,
|
32
|
+
"company_name": 1,
|
33
|
+
"balance_sheets": {
|
34
|
+
"$sortArray": {
|
35
|
+
"input": {
|
36
|
+
"$map": {
|
37
|
+
"input": {
|
38
|
+
"$filter": {
|
39
|
+
"input": "$seasonal_data",
|
40
|
+
"as": "season",
|
41
|
+
"cond": {
|
42
|
+
"$eq":
|
43
|
+
["$$season.season", target_season]
|
44
|
+
}
|
41
45
|
}
|
46
|
+
},
|
47
|
+
"as": "target_season_data",
|
48
|
+
"in": {
|
49
|
+
"year":
|
50
|
+
"$$target_season_data.year",
|
51
|
+
"season":
|
52
|
+
"$$target_season_data.season",
|
53
|
+
"balance_sheet":
|
54
|
+
"$$target_season_data.balance_sheet"
|
42
55
|
}
|
43
|
-
},
|
44
|
-
"as": "target_season_data",
|
45
|
-
"in": {
|
46
|
-
"year": "$$target_season_data.year",
|
47
|
-
"season": "$$target_season_data.season",
|
48
|
-
"balance_sheet": "$$target_season_data.balance_sheet"
|
49
56
|
}
|
50
|
-
}
|
51
|
-
|
52
|
-
|
57
|
+
},
|
58
|
+
"sortBy": {
|
59
|
+
"year": -1
|
60
|
+
} # 按 year 降序排序
|
61
|
+
}
|
53
62
|
}
|
54
63
|
}
|
55
|
-
}
|
56
|
-
})
|
64
|
+
})
|
57
65
|
|
58
66
|
return pipeline
|
59
67
|
|
@@ -67,10 +75,16 @@ class BalanceSheetFetcher(StatsFetcher):
|
|
67
75
|
return fetched_data[-1]
|
68
76
|
|
69
77
|
def query_data(self):
|
70
|
-
|
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
|
71
87
|
|
72
|
-
year = today.year - 1 if (today.season == 1) else today.year
|
73
|
-
season = 4 if (today.season == 1) else today.season - 2
|
74
88
|
fetched_data = self.collect_data(year, season)
|
75
89
|
|
76
90
|
return self.process_data(season, fetched_data)
|
@@ -93,20 +107,26 @@ class BalanceSheetFetcher(StatsFetcher):
|
|
93
107
|
|
94
108
|
time_index = f"{year}Q{target_season}"
|
95
109
|
|
96
|
-
|
110
|
+
# 蒐集整體的keys
|
97
111
|
index_names += list(data['balance_sheet'].keys())
|
98
112
|
balance_sheet = data['balance_sheet']
|
99
113
|
|
100
114
|
for index_name, value_dict in balance_sheet.items():
|
101
115
|
for item_name, item in value_dict.items():
|
102
|
-
try:
|
103
|
-
|
116
|
+
try: # table_dict[項目][(2020Q1, '%')]
|
117
|
+
if (item_name == 'percentage'):
|
118
|
+
if (isinstance(item, (float, int))):
|
119
|
+
item = np.round(item, 2)
|
120
|
+
if ("YoY" in item_name):
|
121
|
+
if (isinstance(item, (float, int))):
|
122
|
+
item = np.round(item * 100, 2)
|
123
|
+
table_dict[index_name][(time_index, item_name)] = item
|
104
124
|
|
105
125
|
except KeyError:
|
106
126
|
if (index_name not in table_dict.keys()):
|
107
127
|
table_dict[index_name] = dict()
|
108
128
|
|
109
|
-
table_dict[index_name][(time_index,item_name)] = item
|
129
|
+
table_dict[index_name][(time_index, item_name)] = item
|
110
130
|
|
111
131
|
total_table = pd.DataFrame.from_dict(table_dict, orient='index')
|
112
132
|
total_table.columns = pd.MultiIndex.from_tuples(total_table.columns)
|
@@ -118,5 +138,4 @@ class BalanceSheetFetcher(StatsFetcher):
|
|
118
138
|
target_index=setting['target_index']
|
119
139
|
if "target_index" in setting.keys() else None)
|
120
140
|
|
121
|
-
print(f"{name}: {return_dict[name].columns}")
|
122
141
|
return return_dict
|
@@ -1,5 +1,6 @@
|
|
1
1
|
from .base import StatsFetcher, StatsDateTime
|
2
2
|
import json
|
3
|
+
import numpy as np
|
3
4
|
import pandas as pd
|
4
5
|
from ..utils import StatsDateTime, StatsProcessor
|
5
6
|
import importlib.resources as pkg_resources
|
@@ -64,9 +65,14 @@ class CashFlowFetcher(StatsFetcher):
|
|
64
65
|
return list(fetched_data)[0]
|
65
66
|
|
66
67
|
def query_data(self):
|
67
|
-
|
68
|
-
|
69
|
-
|
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
|
70
76
|
|
71
77
|
fetched_data = self.collect_data(target_season)
|
72
78
|
|
@@ -127,8 +133,9 @@ class CashFlowFetcher(StatsFetcher):
|
|
127
133
|
'value']
|
128
134
|
if (value['value']):
|
129
135
|
table_dict[time_index][index_name][
|
130
|
-
'percentage'] =
|
131
|
-
|
136
|
+
'percentage'] = np.round(
|
137
|
+
(value['value'] / cash_flow[
|
138
|
+
main_cash_flow_name]['value']) * 100, 2)
|
132
139
|
else:
|
133
140
|
table_dict[time_index][index_name][
|
134
141
|
'percentage'] = None
|
@@ -141,8 +148,9 @@ class CashFlowFetcher(StatsFetcher):
|
|
141
148
|
'value']
|
142
149
|
if (value['value']):
|
143
150
|
table_dict[time_index][index_name][
|
144
|
-
'percentage'] =
|
145
|
-
|
151
|
+
'percentage'] = np.round(
|
152
|
+
(value['value'] / cash_flow[
|
153
|
+
main_cash_flow_name]['value']) * 100, 2)
|
146
154
|
else:
|
147
155
|
table_dict[time_index][index_name][
|
148
156
|
'percentage'] = None
|