neurostats-API 0.0.20__py3-none-any.whl → 0.0.21b0__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/fetchers/base.py +59 -62
- neurostats_API/fetchers/month_revenue.py +48 -1
- neurostats_API/fetchers/tej_finance_report.py +35 -1
- neurostats_API/tools/tej_db/tej_db_percent_index.yaml +44 -0
- neurostats_API/tools/tej_db/tej_db_skip_index.yaml +20 -0
- neurostats_API/tools/tej_db/tej_db_thousand_index.yaml +71 -0
- neurostats_API/utils/data_process.py +8 -2
- {neurostats_API-0.0.20.dist-info → neurostats_API-0.0.21b0.dist-info}/METADATA +24 -15
- {neurostats_API-0.0.20.dist-info → neurostats_API-0.0.21b0.dist-info}/RECORD +12 -9
- /neurostats_API/tools/{tej_db_index.yaml → tej_db/tej_db_index.yaml} +0 -0
- {neurostats_API-0.0.20.dist-info → neurostats_API-0.0.21b0.dist-info}/WHEEL +0 -0
- {neurostats_API-0.0.20.dist-info → neurostats_API-0.0.21b0.dist-info}/top_level.txt +0 -0
neurostats_API/fetchers/base.py
CHANGED
@@ -97,81 +97,78 @@ class BaseTEJFetcher(abc.ABC):
|
|
97
97
|
|
98
98
|
return latest_date
|
99
99
|
|
100
|
-
def
|
101
|
-
|
100
|
+
def process_value(self, value):
|
101
|
+
if isinstance(value, str) and "%" in value:
|
102
|
+
value = value.replace("%", "")
|
103
|
+
try:
|
104
|
+
return float(value)
|
105
|
+
except (ValueError, TypeError):
|
106
|
+
return None
|
107
|
+
|
108
|
+
def calculate_growth(self, this_value, last_value, delta):
|
109
|
+
try:
|
110
|
+
return YoY_Calculator.cal_growth(this_value, last_value, delta) * 100
|
111
|
+
except Exception:
|
112
|
+
return None
|
113
|
+
|
114
|
+
def cal_YoY(self, data_dict: dict, start_year: int, end_year: int, season: int):
|
102
115
|
year_shifts = [1, 3, 5, 10]
|
103
116
|
return_dict = {}
|
117
|
+
|
104
118
|
for year in range(start_year, end_year + 1):
|
105
|
-
|
106
|
-
|
107
|
-
except KeyError as e:
|
119
|
+
year_data = data_dict.get(f"{year}Q{season}", {}).copy()
|
120
|
+
if not year_data:
|
108
121
|
continue
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
if (key in 'season'):
|
122
|
+
|
123
|
+
for key in list(year_data.keys()):
|
124
|
+
if key == "season":
|
113
125
|
continue
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
for shift in year_shifts:
|
119
|
-
this_value = year_data[key]
|
120
|
-
try:
|
121
|
-
past_year = year - shift
|
122
|
-
last_value = data_dict[f"{past_year}Q{season}"][key]
|
123
|
-
temp_dict[f"YoY_{shift}"] = YoY_Calculator.cal_growth(
|
124
|
-
this_value, last_value, delta=shift) * 100
|
125
|
-
except Exception as e:
|
126
|
-
temp_dict[f"YoY_{shift}"] = None
|
127
|
-
|
128
|
-
year_data[key] = temp_dict
|
129
|
-
|
130
|
-
else:
|
126
|
+
|
127
|
+
this_value = self.process_value(year_data[key])
|
128
|
+
if this_value is None:
|
131
129
|
year_data.pop(key)
|
132
|
-
|
130
|
+
continue
|
131
|
+
|
132
|
+
temp_dict = {"value": year_data[key]}
|
133
|
+
for shift in year_shifts:
|
134
|
+
past_year = year - shift
|
135
|
+
last_value = data_dict.get(f"{past_year}Q{season}", {}).get(key)
|
136
|
+
last_value = self.process_value(last_value)
|
137
|
+
growth = self.calculate_growth(this_value, last_value, shift) if last_value is not None else None
|
138
|
+
|
139
|
+
temp_dict[f"YoY_{shift}"] = (f"{growth:.2f}%" if growth else None)
|
140
|
+
year_data[key] = temp_dict
|
141
|
+
|
133
142
|
return_dict[f"{year}Q{season}"] = year_data
|
134
|
-
|
143
|
+
|
135
144
|
return return_dict
|
136
145
|
|
137
146
|
def cal_QoQ(self, data_dict):
|
138
147
|
return_dict = {}
|
139
|
-
|
140
|
-
|
141
|
-
year = int(
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
else:
|
147
|
-
last_year = year
|
148
|
-
last_season = season - 1
|
149
|
-
|
150
|
-
this_data = data_dict[time_index]
|
151
|
-
this_keys = list(this_data.keys())
|
152
|
-
for key in this_keys:
|
153
|
-
if (key in 'season'):
|
148
|
+
|
149
|
+
for time_index, this_data in data_dict.items():
|
150
|
+
year, season = map(int, time_index.split("Q"))
|
151
|
+
last_year, last_season = (year - 1, 4) if season == 1 else (year, season - 1)
|
152
|
+
|
153
|
+
for key in list(this_data.keys()):
|
154
|
+
if key == "season":
|
154
155
|
continue
|
155
|
-
|
156
|
-
this_value = this_data[key]
|
157
|
-
|
158
|
-
if (isinstance(this_value, (int, float))):
|
159
|
-
temp_dict = {"value": this_value}
|
160
|
-
|
161
|
-
try:
|
162
|
-
last_value = data_dict[f"{last_year}Q{last_season}"][
|
163
|
-
key]['value']
|
164
|
-
|
165
|
-
temp_dict['growth'] = YoY_Calculator.cal_growth(
|
166
|
-
this_value, last_value, delta=1) * 100
|
167
|
-
except Exception as e:
|
168
|
-
temp_dict['growth'] = None
|
169
|
-
|
170
|
-
this_data[key] = temp_dict
|
171
|
-
|
172
|
-
else:
|
156
|
+
|
157
|
+
this_value = self.process_value(this_data[key])
|
158
|
+
if this_value is None:
|
173
159
|
this_data.pop(key)
|
160
|
+
continue
|
161
|
+
|
162
|
+
temp_dict = {"value": this_data[key]}
|
163
|
+
last_value = data_dict.get(f"{last_year}Q{last_season}", {}).get(key, {}).get('value')
|
164
|
+
last_value = self.process_value(last_value)
|
165
|
+
growth = self.calculate_growth(this_value, last_value, 1) if last_value is not None else None
|
166
|
+
temp_dict['growth'] = (f"{growth:.2f}%" if growth else None)
|
167
|
+
|
168
|
+
this_data[key] = temp_dict
|
169
|
+
|
174
170
|
return_dict[time_index] = this_data
|
171
|
+
|
175
172
|
return return_dict
|
176
173
|
|
177
174
|
def get_dict_of_df(self, data_dict):
|
@@ -200,4 +197,4 @@ class BaseTEJFetcher(abc.ABC):
|
|
200
197
|
if period == "all":
|
201
198
|
return datetime.strptime("1991-01-01", "%Y-%m-%d")
|
202
199
|
|
203
|
-
return date - period_mapping.get(period, timedelta(days=0)) # 預設為不變
|
200
|
+
return date - period_mapping.get(period, timedelta(days=0)) # 預設為不變"
|
@@ -1,7 +1,7 @@
|
|
1
1
|
from .base import StatsFetcher, StatsDateTime
|
2
2
|
import json
|
3
3
|
import pandas as pd
|
4
|
-
from ..utils import StatsDateTime, StatsProcessor
|
4
|
+
from ..utils import StatsDateTime, StatsProcessor, YoY_Calculator
|
5
5
|
import importlib.resources as pkg_resources
|
6
6
|
import yaml
|
7
7
|
|
@@ -77,7 +77,9 @@ class MonthRevenueFetcher(StatsFetcher):
|
|
77
77
|
postfix="千元")
|
78
78
|
target_month = monthly_data[0]['month']
|
79
79
|
monthly_df = pd.DataFrame(monthly_data)
|
80
|
+
|
80
81
|
target_month_df = monthly_df[monthly_df['month'] == target_month]
|
82
|
+
annual_month_df = monthly_df[monthly_df['month'] == 12]
|
81
83
|
month_revenue_df = monthly_df.pivot(index='month',
|
82
84
|
columns='year',
|
83
85
|
values='revenue')
|
@@ -86,6 +88,10 @@ class MonthRevenueFetcher(StatsFetcher):
|
|
86
88
|
columns='year',
|
87
89
|
values='grand_total')
|
88
90
|
|
91
|
+
annual_total_df = annual_month_df.pivot(index='month',
|
92
|
+
columns='year',
|
93
|
+
values='grand_total')
|
94
|
+
|
89
95
|
grand_total_df.rename(index={target_month: f"grand_total"},
|
90
96
|
inplace=True)
|
91
97
|
month_revenue_df = month_revenue_df.sort_index(ascending=False)
|
@@ -111,4 +117,45 @@ class MonthRevenueFetcher(StatsFetcher):
|
|
111
117
|
|
112
118
|
fetched_data.pop("monthly_data")
|
113
119
|
|
120
|
+
fetched_data['recent_month_revenue'] = self.get_recent_revenue_grwoth(
|
121
|
+
monthly_data, grand_total_dict=annual_total_df.to_dict(), interval = 12
|
122
|
+
)
|
123
|
+
|
114
124
|
return fetched_data
|
125
|
+
|
126
|
+
def get_recent_revenue_grwoth(self, monthly_data, grand_total_dict, interval: int = 12):
|
127
|
+
recent_month_data = monthly_data[:interval + 1]
|
128
|
+
|
129
|
+
MoMs = [
|
130
|
+
YoY_Calculator.cal_growth(this_value['revenue'], last_value['revenue'], delta = 1)
|
131
|
+
for this_value, last_value in zip(
|
132
|
+
recent_month_data[:12], recent_month_data[1:13]
|
133
|
+
)
|
134
|
+
]
|
135
|
+
|
136
|
+
recent_month_data = {
|
137
|
+
"date" : [f"{data['year']}/{data['month']}" for data in recent_month_data[:interval]],
|
138
|
+
"revenue" : [data['revenue'] for data in recent_month_data[:interval]],
|
139
|
+
"MoM" : [f"{(data * 100):.2f}%" for data in MoMs],
|
140
|
+
"YoY" : [f"{data['revenue_increment_ratio']}" for data in recent_month_data[:interval]],
|
141
|
+
"total_YoY": [f"{data['grand_total_increment_ratio']}" for data in recent_month_data[:interval]],
|
142
|
+
}
|
143
|
+
|
144
|
+
# accum_YoY
|
145
|
+
# accum_YoY 為 Davis提出的定義
|
146
|
+
# 2024/6的累計YoY(accum_YoY) 為 2024累計到6月為止的總營收/2023年度總營收
|
147
|
+
accum_YoYs = []
|
148
|
+
for data in monthly_data[:interval]:
|
149
|
+
try:
|
150
|
+
year = data['year'] - 1
|
151
|
+
total = grand_total_dict[year][12]
|
152
|
+
accum_YoY = round((data['grand_total'] / total) * 100, 2)
|
153
|
+
accum_YoYs.append(f"{accum_YoY}%")
|
154
|
+
except Exception as e:
|
155
|
+
accum_YoYs.append(None)
|
156
|
+
|
157
|
+
recent_month_data['accum_YoY'] = accum_YoYs
|
158
|
+
|
159
|
+
recent_month_df = pd.DataFrame(recent_month_data).set_index('date').T
|
160
|
+
|
161
|
+
return recent_month_df
|
@@ -27,8 +27,16 @@ class FinanceReportFetcher(BaseTEJFetcher):
|
|
27
27
|
self.db = self.client[db_name]
|
28
28
|
self.collection = self.db[collection_name]
|
29
29
|
|
30
|
-
index_dict = StatsProcessor.load_yaml("tej_db_index.yaml")
|
30
|
+
index_dict = StatsProcessor.load_yaml("tej_db/tej_db_index.yaml")
|
31
|
+
thousand_dict = StatsProcessor.load_yaml("tej_db/tej_db_thousand_index.yaml")
|
32
|
+
percent_dict = StatsProcessor.load_yaml("tej_db/tej_db_percent_index.yaml")
|
33
|
+
skip_dict = StatsProcessor.load_yaml("tej_db/tej_db_percent_index.yaml")
|
31
34
|
self.check_index = set(index_dict[collection_name])
|
35
|
+
self.skip_index = set(skip_dict[collection_name])
|
36
|
+
|
37
|
+
self.thousand_index_list = list(thousand_dict[collection_name])
|
38
|
+
self.percent_index_list = list(percent_dict[collection_name])
|
39
|
+
|
32
40
|
|
33
41
|
def get(
|
34
42
|
self,
|
@@ -234,6 +242,8 @@ class FinanceReportFetcher(BaseTEJFetcher):
|
|
234
242
|
keys=["year", "season"],
|
235
243
|
delimeter="Q",
|
236
244
|
data_key=report_type)
|
245
|
+
|
246
|
+
data_dict = self.transform_value(data_dict)
|
237
247
|
|
238
248
|
if (use_cal):
|
239
249
|
data_with_QoQ = self.cal_QoQ(data_dict)
|
@@ -347,6 +357,8 @@ class FinanceReportFetcher(BaseTEJFetcher):
|
|
347
357
|
keys=['year', 'season'],
|
348
358
|
data_key=report_type,
|
349
359
|
delimeter='Q')
|
360
|
+
|
361
|
+
data_dict = self.transform_value(data_dict)
|
350
362
|
|
351
363
|
if (use_cal):
|
352
364
|
data_with_YoY = self.cal_YoY(
|
@@ -360,7 +372,29 @@ class FinanceReportFetcher(BaseTEJFetcher):
|
|
360
372
|
data_df = pd.DataFrame.from_dict(data_dict)
|
361
373
|
data_df = data_df.iloc[:, ::-1]
|
362
374
|
return data_df
|
375
|
+
|
376
|
+
def transform_value(self, data_dict):
|
377
|
+
"""
|
378
|
+
處理千元, %等單位
|
379
|
+
"""
|
363
380
|
|
381
|
+
data_df = pd.DataFrame.from_dict(data_dict)
|
382
|
+
|
383
|
+
process_set = set(data_df.index).intersection(set(self.thousand_index_list))
|
384
|
+
process_list = list(process_set)
|
385
|
+
data_df.loc[process_list] = data_df.loc[process_list].map(
|
386
|
+
lambda x : StatsProcessor.cal_non_percentage(x, postfix="千元")
|
387
|
+
)
|
388
|
+
|
389
|
+
process_set = set(data_df.index).intersection(set(self.percent_index_list))
|
390
|
+
process_list = list(process_set)
|
391
|
+
data_df.loc[process_list] = data_df.loc[process_list].map(
|
392
|
+
lambda x : f"{x}%"
|
393
|
+
)
|
394
|
+
|
395
|
+
data_dict = data_df.to_dict()
|
396
|
+
|
397
|
+
return data_dict
|
364
398
|
|
365
399
|
class TEJStockPriceFetcher(BaseTEJFetcher):
|
366
400
|
|
@@ -0,0 +1,44 @@
|
|
1
|
+
TWN/AINVFQ1:
|
2
|
+
- taxrate
|
3
|
+
- r104
|
4
|
+
- r115
|
5
|
+
- r105
|
6
|
+
- r106
|
7
|
+
- r107
|
8
|
+
- r108
|
9
|
+
- r201
|
10
|
+
- r112
|
11
|
+
- r401
|
12
|
+
- r402
|
13
|
+
- r403
|
14
|
+
- r404
|
15
|
+
- r405
|
16
|
+
- r408
|
17
|
+
- r409
|
18
|
+
- r410
|
19
|
+
- r502
|
20
|
+
- r501
|
21
|
+
- r205
|
22
|
+
- r505
|
23
|
+
- r517
|
24
|
+
- r512
|
25
|
+
- r509
|
26
|
+
- r608
|
27
|
+
- r616
|
28
|
+
- r610
|
29
|
+
- r607
|
30
|
+
- r613
|
31
|
+
- r612
|
32
|
+
- r609
|
33
|
+
- r614
|
34
|
+
- r611
|
35
|
+
TWN/AFESTM1:
|
36
|
+
- r105
|
37
|
+
- r106
|
38
|
+
- r107
|
39
|
+
- r108
|
40
|
+
- r401
|
41
|
+
- r402
|
42
|
+
- r403
|
43
|
+
- r404
|
44
|
+
- r405
|
@@ -0,0 +1,71 @@
|
|
1
|
+
TWN/AINVFQ1:
|
2
|
+
- bp11
|
3
|
+
- bp21
|
4
|
+
- bp22
|
5
|
+
- bp31
|
6
|
+
- bp41
|
7
|
+
- bp51
|
8
|
+
- bp53
|
9
|
+
- bp61
|
10
|
+
- bp62
|
11
|
+
- bp63
|
12
|
+
- bp64
|
13
|
+
- bp65
|
14
|
+
- bf11
|
15
|
+
- bf12
|
16
|
+
- bf21
|
17
|
+
- bf22
|
18
|
+
- bf41
|
19
|
+
- bf42
|
20
|
+
- bf43
|
21
|
+
- bf44
|
22
|
+
- bf45
|
23
|
+
- bf99
|
24
|
+
- bsca
|
25
|
+
- bsnca
|
26
|
+
- bsta
|
27
|
+
- bscl
|
28
|
+
- bsncl
|
29
|
+
- bstl
|
30
|
+
- bsse
|
31
|
+
- bslse
|
32
|
+
- debt
|
33
|
+
- quick
|
34
|
+
- ppe
|
35
|
+
- ar
|
36
|
+
- ip12
|
37
|
+
- ip22
|
38
|
+
- ip31
|
39
|
+
- ip51
|
40
|
+
- iv41
|
41
|
+
- if11
|
42
|
+
- isibt
|
43
|
+
- isni
|
44
|
+
- isnip
|
45
|
+
- eps
|
46
|
+
- ispsd
|
47
|
+
- gm
|
48
|
+
- opi
|
49
|
+
- nri
|
50
|
+
- ri
|
51
|
+
- nopi
|
52
|
+
- ebit
|
53
|
+
- cip31
|
54
|
+
- cscfo
|
55
|
+
- cscfi
|
56
|
+
- cscff
|
57
|
+
- person
|
58
|
+
- shares
|
59
|
+
- wavg
|
60
|
+
- r304
|
61
|
+
- r305
|
62
|
+
- r306
|
63
|
+
- r316
|
64
|
+
- r834
|
65
|
+
TWN/AFESTM1:
|
66
|
+
- ip12
|
67
|
+
- gm
|
68
|
+
- opi
|
69
|
+
- isibt
|
70
|
+
- isni
|
71
|
+
- isnip
|
@@ -187,13 +187,19 @@ class StatsProcessor:
|
|
187
187
|
value = np.round(value, 2).item()
|
188
188
|
if (postfix == "千元"):
|
189
189
|
value *= 1000
|
190
|
-
|
190
|
+
try:
|
191
|
+
value = int(value)
|
192
|
+
except Exception as e:
|
193
|
+
pass
|
191
194
|
|
192
195
|
postfix = "元"
|
193
196
|
|
194
197
|
if (to_str):
|
195
198
|
if (isinstance(value, float)):
|
196
|
-
|
199
|
+
try:
|
200
|
+
value = f"{value:.2f}{postfix}"
|
201
|
+
except Exception as e:
|
202
|
+
value = f"{value}{postfix}"
|
197
203
|
return value
|
198
204
|
elif (isinstance(value, int)):
|
199
205
|
value = f"{value}{postfix}"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: neurostats_API
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.21b0
|
4
4
|
Summary: The service of NeuroStats website
|
5
5
|
Home-page: https://github.com/NeurowattStats/NeuroStats_API.git
|
6
6
|
Author: JasonWang@Neurowatt
|
@@ -8,7 +8,7 @@ Author-email: jason@neurowatt.ai
|
|
8
8
|
Requires-Python: >=3.6
|
9
9
|
Description-Content-Type: text/markdown
|
10
10
|
Requires-Dist: numpy
|
11
|
-
Requires-Dist: pandas
|
11
|
+
Requires-Dist: pandas
|
12
12
|
Requires-Dist: pymongo
|
13
13
|
Requires-Dist: pytz
|
14
14
|
Requires-Dist: python-dotenv
|
@@ -89,7 +89,7 @@ pip install neurostats-API
|
|
89
89
|
```Python
|
90
90
|
>>> import neurostats_API
|
91
91
|
>>> print(neurostats_API.__version__)
|
92
|
-
0.0.
|
92
|
+
0.0.21b0
|
93
93
|
```
|
94
94
|
|
95
95
|
### 得到最新一期的評價資料與歷年評價
|
@@ -236,6 +236,15 @@ data = fetcher.query_data()
|
|
236
236
|
grand_total_YoY_5 1.691300e+02 ... NaN
|
237
237
|
grand_total_YoY_10 NaN ... NaN
|
238
238
|
|
239
|
+
"recent_month_revenue":
|
240
|
+
date 2024/11 2024/10 ... 2024/1 2023/12
|
241
|
+
revenue 51243946000 45451116000 ... 56451418000 55329015000
|
242
|
+
MoM 12.75% -14.77% ... 2.03% -0.52%
|
243
|
+
YoY -7.87% -30.00% ... -7.36% -11.13%
|
244
|
+
total_YoY -6.93% -6.84% ... -7.36% -15.97%
|
245
|
+
accum_YoY 85.84% 78.65% ... 7.92% 84.03%
|
246
|
+
# total_YoY為當月累計營收 / 上一年的當月累計營收
|
247
|
+
# accum_YoY為當月累計營收 / 上一年的總營收
|
239
248
|
|
240
249
|
}
|
241
250
|
```
|
@@ -747,14 +756,14 @@ bp51 3.111298e+09 3.173919e+09 2.453840e+09
|
|
747
756
|
```Python
|
748
757
|
# fetch_mode = fetcher.FetchMode.QOQ
|
749
758
|
{
|
750
|
-
|
759
|
+
'bp41':
|
751
760
|
2024Q3 2024Q2 2024Q1
|
752
761
|
value 7.082005e+07 6.394707e+07 5.761001e+07
|
753
|
-
growth
|
754
|
-
|
762
|
+
growth 10.75% 11.00% 0.55%,
|
763
|
+
'bp51':
|
755
764
|
2024Q3 2024Q2 2024Q1
|
756
765
|
value 3.111298e+09 3.145373e+09 3.091985e+09
|
757
|
-
growth
|
766
|
+
growth -1.08% 1.73% -0.42%
|
758
767
|
}
|
759
768
|
|
760
769
|
# fetch_mode = fetcher.FetchMode.YOY
|
@@ -762,17 +771,17 @@ growth -1.083335e+00 1.726663e+00 -4.159542e-01
|
|
762
771
|
'bp41':
|
763
772
|
2024Q3 2023Q3 2022Q3
|
764
773
|
value 7.082005e+07 5.377231e+07 6.201822e+07
|
765
|
-
YoY_1
|
766
|
-
YoY_3
|
767
|
-
YoY_5
|
768
|
-
YoY_10
|
774
|
+
YoY_1 31.70% -13.30% 41.31%
|
775
|
+
YoY_3 17.29% 9.56% 18.83%
|
776
|
+
YoY_5 13.89% 12.15% 16.43%
|
777
|
+
YoY_10 12.55% 13.56% 15.60% ,
|
769
778
|
'bp51':
|
770
779
|
2024Q3 2023Q3 2022Q3
|
771
780
|
value 3.111298e+09 3.173919e+09 2.453840e+09
|
772
|
-
YoY_1
|
773
|
-
YoY_3
|
774
|
-
YoY_5
|
775
|
-
YoY_10
|
781
|
+
YoY_1 -1.97% 29.34% 31.80%
|
782
|
+
YoY_3 18.67% 27.67% 26.39%
|
783
|
+
YoY_5 20.68% 24.80% 18.15%
|
784
|
+
YoY_10 14.20% 15.87% 15.51%
|
776
785
|
}
|
777
786
|
```
|
778
787
|
|
@@ -3,29 +3,32 @@ neurostats_API/cli.py,sha256=UJSWLIw03P24p-gkBb6JSEI5dW5U12UvLf1L8HjQD-o,873
|
|
3
3
|
neurostats_API/main.py,sha256=QcsfmWivg2Dnqw3MTJWiI0QvEiRs0VuH-BjwQHFCv00,677
|
4
4
|
neurostats_API/fetchers/__init__.py,sha256=KCw-yRSDFa3fw83u73LJ9OVop7gRl_YQYlQq-cITxuo,511
|
5
5
|
neurostats_API/fetchers/balance_sheet.py,sha256=sQv4Gk5uoKURLEdh57YknOQWiyVwaXJ2Mw75jxNqUS0,5804
|
6
|
-
neurostats_API/fetchers/base.py,sha256=
|
6
|
+
neurostats_API/fetchers/base.py,sha256=_F73cDpsnoA6_sgJc0lEH9OkpAHY2KdNI0WKHQCaX9g,6746
|
7
7
|
neurostats_API/fetchers/cash_flow.py,sha256=TY7VAWVXkj5-mzH5Iu0sIE-oV8MvGmmDy0URNotNV1E,7614
|
8
8
|
neurostats_API/fetchers/finance_overview.py,sha256=PxUdWY0x030olYMLcCHDBn068JLmCE2RTOce1dxs5vM,27753
|
9
9
|
neurostats_API/fetchers/institution.py,sha256=UrcBc6t7u7CnEwUsf6YmLbbJ8VncdWpq8bCz17q2dgs,11168
|
10
10
|
neurostats_API/fetchers/margin_trading.py,sha256=lQImtNdvaBoSlKhJvQ3DkH3HjSSgKRJz4ZZpyR5-Z4I,10433
|
11
|
-
neurostats_API/fetchers/month_revenue.py,sha256=
|
11
|
+
neurostats_API/fetchers/month_revenue.py,sha256=W2RkBD8tRWkNaS_9p1ZuprwyDuw7mfl7rFFsYbLp8LQ,6313
|
12
12
|
neurostats_API/fetchers/profit_lose.py,sha256=EN9Y0iamcAaHMZdjHXO6b_2buLnORssf8ZS7A0hi74s,5896
|
13
13
|
neurostats_API/fetchers/tech.py,sha256=mcwfE3xzZNmo6P7NS37wQBFnCt4f0uwxWUDSOC00I7M,13428
|
14
|
-
neurostats_API/fetchers/tej_finance_report.py,sha256=
|
14
|
+
neurostats_API/fetchers/tej_finance_report.py,sha256=yGoj4AUGspOYq1qmlI6AfLHzpBFkQPK1y1x4Nz0_UqM,15346
|
15
15
|
neurostats_API/fetchers/value_invest.py,sha256=b_x2Dpgs8VBU5HdG8ocKtfIEkqhU-Q0S5n6RxuFuM2g,7467
|
16
16
|
neurostats_API/tools/balance_sheet.yaml,sha256=6XygNG_Ybb1Xkk1e39LMLKr7ATvaCP3xxuwFbgNl6dA,673
|
17
17
|
neurostats_API/tools/cash_flow_percentage.yaml,sha256=fk2Z4eb1JjGFvP134eJatHacB7BgTkBenhDJr83w8RE,1345
|
18
18
|
neurostats_API/tools/finance_overview_dict.yaml,sha256=B9nV75StXkrF3yv2-eezzitlJ38eEK86RD_VY6588gQ,2884
|
19
19
|
neurostats_API/tools/profit_lose.yaml,sha256=iyp9asYJ04vAxk_HBUDse_IBy5oVvYHpwsyACg5YEeg,3029
|
20
20
|
neurostats_API/tools/seasonal_data_field_dict.txt,sha256=X8yc_el6p8BH_3FikTqBVFGsvWdXT6MHXLfKfi44334,8491
|
21
|
-
neurostats_API/tools/tej_db_index.yaml,sha256=lu-cmbB6dhx0eUlBSkyzXWqPKlwRtEvqlMTAh2y0oHs,969
|
21
|
+
neurostats_API/tools/tej_db/tej_db_index.yaml,sha256=lu-cmbB6dhx0eUlBSkyzXWqPKlwRtEvqlMTAh2y0oHs,969
|
22
|
+
neurostats_API/tools/tej_db/tej_db_percent_index.yaml,sha256=-rBSdOoYs5UB9H6Y3FE5PTqV9meXEFZD2KhSlAQ_4Eg,323
|
23
|
+
neurostats_API/tools/tej_db/tej_db_skip_index.yaml,sha256=EL9QOy9FRsaqHjp52j9kHg_uZNeiNaf6uOqTieaXCDY,157
|
24
|
+
neurostats_API/tools/tej_db/tej_db_thousand_index.yaml,sha256=nBY1srmcTqnlhgGVBY_tJO4DYYEaUn4AKljbrS7ScSA,513
|
22
25
|
neurostats_API/utils/__init__.py,sha256=0tJCRmlJq2aDwcNNW-oEaA9H0OxTJMFvjpVYtG4AvZU,186
|
23
26
|
neurostats_API/utils/calculate_value.py,sha256=lUKSsWU76XRmDUcmi4eDjoQxjb3vWpAAKInF9w49VNI,782
|
24
|
-
neurostats_API/utils/data_process.py,sha256=
|
27
|
+
neurostats_API/utils/data_process.py,sha256=kaSJ9Sj6xCrANCo4jjU-6jlU8_HKcQlAv_PFiHer2lA,9199
|
25
28
|
neurostats_API/utils/datetime.py,sha256=XJya4G8b_-ZOaBbMXgQjWh2MC4wc-o6goQ7EQJQMWrQ,773
|
26
29
|
neurostats_API/utils/db_client.py,sha256=OYe6yazcR4Aa6jYmy47JrryUeh2NnKGqY2K_lSZe6i8,455
|
27
30
|
neurostats_API/utils/fetcher.py,sha256=VbrUhjA-GG5AyjPX2SHtFIbZM4dm3jo0RgZzuCbb_Io,40927
|
28
|
-
neurostats_API-0.0.
|
29
|
-
neurostats_API-0.0.
|
30
|
-
neurostats_API-0.0.
|
31
|
-
neurostats_API-0.0.
|
31
|
+
neurostats_API-0.0.21b0.dist-info/METADATA,sha256=vp15gv34e2NJGRUTK_SQwjXkm0igges5QsVo0hmG36s,31622
|
32
|
+
neurostats_API-0.0.21b0.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
|
33
|
+
neurostats_API-0.0.21b0.dist-info/top_level.txt,sha256=nSlQPMG0VtXivJyedp4Bkf86EOy2TpW10VGxolXrqnU,15
|
34
|
+
neurostats_API-0.0.21b0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|