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.
@@ -97,81 +97,78 @@ class BaseTEJFetcher(abc.ABC):
97
97
 
98
98
  return latest_date
99
99
 
100
- def cal_YoY(
101
- self, data_dict: dict, start_year: int, end_year: int, season: int):
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
- try:
106
- year_data = data_dict[f"{year}Q{season}"].copy()
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
- year_keys = list(year_data.keys())
111
- for key in year_keys:
112
- if (key in 'season'):
122
+
123
+ for key in list(year_data.keys()):
124
+ if key == "season":
113
125
  continue
114
-
115
- if (isinstance(year_data[key], (int, float))):
116
- temp_dict = {"value": year_data[key]}
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
- for i, time_index in enumerate(data_dict.keys()):
140
- year, season = time_index.split("Q")
141
- year = int(year)
142
- season = int(season)
143
- if (season == 1):
144
- last_year = year - 1
145
- last_season = 4
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,20 @@
1
+ TWN/AINVFQ1:
2
+ - coid
3
+ - mdate
4
+ - key3
5
+ - 'no'
6
+ - sem
7
+ - merg
8
+ - curr
9
+ - annd
10
+ - fin_ind
11
+ TWN/AFESTM1:
12
+ - coid
13
+ - mdate
14
+ - key3
15
+ - 'no'
16
+ - sem
17
+ - merg
18
+ - curr
19
+ - annd
20
+ - fin_ind
@@ -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
- value = int(value)
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
- value = f"{value:.2f}{postfix}"
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.20
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>=2.2.0
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.16
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
- 'bp41':
759
+ 'bp41':
751
760
  2024Q3 2024Q2 2024Q1
752
761
  value 7.082005e+07 6.394707e+07 5.761001e+07
753
- growth 1.074791e+01 1.099994e+01 5.532101e-01,
754
- 'bp51':
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 -1.083335e+00 1.726663e+00 -4.159542e-01
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 3.170357e+01 -1.329596e+01 4.130744e+01
766
- YoY_3 1.729171e+01 9.556684e+00 1.883274e+01
767
- YoY_5 1.389090e+01 1.215242e+01 1.642914e+01
768
- YoY_10 1.255138e+01 1.356297e+01 1.559702e+01
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 -1.972987e+00 2.934499e+01 3.179539e+01
773
- YoY_3 1.866752e+01 2.766851e+01 2.638677e+01
774
- YoY_5 2.068132e+01 2.479698e+01 1.815106e+01
775
- YoY_10 1.420500e+01 1.586797e+01 1.551364e+01
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=Gw1pUFJtl-ot5kp7v_1ueTA7Y__-mghNqD3kFlbVBTc,6515
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=nixX2llzjCFr2m2YVjxrSfkBusnZPrPb2dRDq1XLGhw,4251
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=VZximF1Lct3r-E01VwcDX0Zj_CIVSvpdEAuU9I9OsJc,14007
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=A--dzOsu42jRxqqCD41gTtjE5rhEBYmhB6y-AnCvo5U,8986
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.20.dist-info/METADATA,sha256=uG49C2eYBlTroejgDPkECjyfkRxBp7APAGxAihksMo0,30997
29
- neurostats_API-0.0.20.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
30
- neurostats_API-0.0.20.dist-info/top_level.txt,sha256=nSlQPMG0VtXivJyedp4Bkf86EOy2TpW10VGxolXrqnU,15
31
- neurostats_API-0.0.20.dist-info/RECORD,,
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,,