neurostats-API 1.0.0rc2__py3-none-any.whl → 1.0.0rc4__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,4 +1,4 @@
1
- __version__='1.0.0rc2'
1
+ __version__='1.0.0rc4'
2
2
 
3
3
  from .fetchers import (
4
4
  AgentFinanceOverviewFetcher,
@@ -12,4 +12,18 @@ from .fetchers import (
12
12
  TechFetcher,
13
13
  TEJStockPriceFetcher,
14
14
  ProfitLoseFetcher,
15
+ )
16
+
17
+ from .async_mode import (
18
+ AsyncAgentOverviewFetcher,
19
+ AsyncBalanceSheetFetcher,
20
+ AsyncCashFlowFetcher,
21
+ AsyncFinanceOverviewFetcher,
22
+ AsyncMonthlyRevenueFetcher,
23
+ AsyncProfitLoseFetcher,
24
+ AsyncTechFetcher,
25
+ AsyncTEJSeasonalFetcher,
26
+ AsyncTWSEInstitutionFetcher,
27
+ AsyncTWSEMarginFetcher,
28
+ AsyncTWSEStatsValueFetcher
15
29
  )
@@ -68,7 +68,7 @@ class AsyncBaseSeasonalDBExtractor(BaseDBExtractor):
68
68
 
69
69
  query = {
70
70
  "ticker": self.ticker,
71
- "chart_name": {"$exists": True}
71
+ chart_name: {"$exists": True}
72
72
  }
73
73
 
74
74
  query = self._update_query_with_year_season(
@@ -1,19 +1,24 @@
1
1
  from .base import BaseBalanceSheetTransformer
2
2
  from neurostats_API.utils import StatsProcessor
3
3
 
4
+
4
5
  class TWSEBalanceSheetTransformer(BaseBalanceSheetTransformer):
6
+
5
7
  def __init__(self, ticker, company_name, zone):
6
8
  super().__init__(ticker, company_name, zone)
7
9
 
8
- self.table_settings = StatsProcessor.load_yaml("twse/balance_sheet.yaml")
10
+ self.table_settings = StatsProcessor.load_yaml(
11
+ "twse/balance_sheet.yaml"
12
+ )
9
13
  self.return_keys = [
10
- 'balance_sheet', 'total_asset', 'current_asset', 'non_current_asset',
11
- 'current_debt', 'non_current_debt', 'equity', 'balance_sheet_all', 'balance_sheet_YoY'
14
+ 'balance_sheet', 'total_asset', 'current_asset',
15
+ 'non_current_asset', 'current_debt', 'non_current_debt', 'equity',
16
+ 'balance_sheet_all', 'balance_sheet_YoY'
12
17
  ]
13
18
 
14
19
  self.stats_df = None
15
20
  self.new_df = None
16
-
21
+
17
22
  def process_transform(self, fetched_data):
18
23
  if (not fetched_data):
19
24
  return self._get_empty_structure()
@@ -21,12 +26,10 @@ class TWSEBalanceSheetTransformer(BaseBalanceSheetTransformer):
21
26
  processed_data = self._process_fn(fetched_data)
22
27
 
23
28
  return processed_data
29
+
24
30
  def _process_fn(self, fetched_data):
25
-
26
- return_dict = {
27
- "ticker": self.ticker,
28
- "company_name": self.company_name
29
- }
31
+
32
+ return_dict = {"ticker": self.ticker, "company_name": self.company_name}
30
33
 
31
34
  target_season = fetched_data[0]['season']
32
35
 
@@ -36,18 +39,22 @@ class TWSEBalanceSheetTransformer(BaseBalanceSheetTransformer):
36
39
  # 轉換格式 (元 / 千元 / %)
37
40
  self.stats_df = StatsProcessor.expand_value_percentage(self.stats_df)
38
41
  self.stats_df = self._apply_process_unit_pipeline(
39
- self.stats_df,
40
- postfix_list=['_value', "_percentage"]
42
+ self.stats_df, postfix_list=['_value', "_percentage"]
41
43
  )
42
44
 
43
45
  self.new_df = self._process_twse_to_tej_format(fetched_data)
44
46
  # 轉換格式 (元 / 千元 / %)
45
47
  self.new_df = self._apply_process_unit_pipeline(
46
- self.new_df,
47
- postfix_list=['_value', "_percentage"]
48
+ self.new_df, postfix_list=['_value', "_percentage"]
48
49
  )
49
50
 
50
- total_table_YoY = self._slice_target_season(self.new_df.T, target_season)
51
+ self.new_dict = self.new_df.to_dict()
52
+ self.new_df = self._cal_QoQ(self.new_dict)
53
+ self.new_df = self.new_df.T
54
+
55
+ total_table_YoY = self._slice_target_season(
56
+ self.new_df, target_season
57
+ )
51
58
 
52
59
  return_dict.update(
53
60
  {
@@ -60,17 +67,15 @@ class TWSEBalanceSheetTransformer(BaseBalanceSheetTransformer):
60
67
  self._process_target_columns(return_dict, self.stats_df)
61
68
 
62
69
  return return_dict
63
-
70
+
64
71
  def _process_target_columns(self, return_dict, stats_df):
65
72
  for name, setting in self.table_settings.items():
66
73
  target_indexes = setting.get('target_index', [None])
67
74
  for target_index in target_indexes:
68
75
  try:
69
76
  return_dict[name] = StatsProcessor.slice_old_table(
70
- total_table=stats_df,
71
- target_index=target_index
77
+ total_table=stats_df, target_index=target_index
72
78
  )
73
79
  break
74
80
  except Exception as e:
75
81
  continue
76
-
@@ -2,10 +2,12 @@ import abc
2
2
  from neurostats_API.utils import StatsProcessor, YoY_Calculator
3
3
  import pandas as pd
4
4
 
5
+
5
6
  class BaseTransformer(abc.ABC):
6
7
  """
7
8
  Transformer用途: 轉換資料為fetcher可使用的格式
8
9
  """
10
+
9
11
  def __init__(self, ticker, company_name, zone):
10
12
  self.ticker = ticker
11
13
  self.company_name = company_name
@@ -13,7 +15,6 @@ class BaseTransformer(abc.ABC):
13
15
  self.zone = zone
14
16
  self.return_keys = []
15
17
 
16
-
17
18
  @abc.abstractmethod
18
19
  def process_transform(self):
19
20
  pass
@@ -23,27 +24,36 @@ class BaseTransformer(abc.ABC):
23
24
  indexes = value_dict.keys()
24
25
  new_dict = {}
25
26
 
26
-
27
27
  for key in indexes:
28
28
  new_dict.update(
29
29
  {
30
- f"{key}_{sub_key}": value_dict[key].get(sub_key, None)
30
+ f"{key}_{sub_key}": value_dict[key].get(sub_key, None)
31
31
  for sub_key in target_keys
32
32
  }
33
33
  )
34
+
34
35
  return new_dict
35
-
36
+
36
37
  @staticmethod
37
38
  def _process_unit(data_df, postfix):
38
39
 
39
40
  lambda_map = {
40
- "_value": lambda x: StatsProcessor.cal_non_percentage(x, postfix="千元"),
41
- "_percentage": lambda x : StatsProcessor.cal_non_percentage(x, to_str=True, postfix="%"),
42
- '_growth': lambda x : StatsProcessor.cal_non_percentage(x, to_str=True, postfix="%"),
43
- "_YoY_1": StatsProcessor.cal_percentage,
44
- "_YoY_3": StatsProcessor.cal_percentage,
45
- "_YoY_5": StatsProcessor.cal_percentage,
46
- "_YoY_10": StatsProcessor.cal_percentage
41
+ "_value":
42
+ lambda x: StatsProcessor.cal_non_percentage(x, postfix="千元"),
43
+ "_percentage":
44
+ lambda x: StatsProcessor.
45
+ cal_non_percentage(x, to_str=True, postfix="%"),
46
+ '_growth':
47
+ lambda x: StatsProcessor.
48
+ cal_non_percentage(x, to_str=True, postfix="%"),
49
+ "_YoY_1":
50
+ StatsProcessor.cal_percentage,
51
+ "_YoY_3":
52
+ StatsProcessor.cal_percentage,
53
+ "_YoY_5":
54
+ StatsProcessor.cal_percentage,
55
+ "_YoY_10":
56
+ StatsProcessor.cal_percentage
47
57
  }
48
58
 
49
59
  process_fn = lambda_map.get(postfix)
@@ -51,33 +61,36 @@ class BaseTransformer(abc.ABC):
51
61
  postfix_cols = data_df.loc[:, postfix_cols].columns
52
62
 
53
63
  if (postfix == "_value"):
54
- postfix_cols = [col for col in postfix_cols if not ("eps" in col or "每股盈餘" in col)]
55
-
64
+ postfix_cols = [
65
+ col for col in postfix_cols
66
+ if not ("eps" in col or "每股盈餘" in col)
67
+ ]
68
+
56
69
  if (postfix == '_growth'):
57
- data_df[postfix_cols] =data_df[postfix_cols].map(
58
- lambda x: x * 100.0 if isinstance(x, float) else x
70
+ data_df[postfix_cols] = data_df[postfix_cols].map(
71
+ lambda x: x * 100.0 if isinstance(x, float) else x
59
72
  )
60
73
 
61
- data_df[postfix_cols] = (
62
- data_df[postfix_cols].map(
63
- process_fn
64
- )
65
- )
74
+ data_df[postfix_cols] = (data_df[postfix_cols].map(process_fn))
66
75
 
67
76
  return data_df
68
77
 
69
- def _apply_process_unit_pipeline(self, data_df, postfix_list = ["_value", "percentage"]):
78
+ def _apply_process_unit_pipeline(
79
+ self, data_df, postfix_list=["_value", "percentage"]
80
+ ):
70
81
  for postfix in postfix_list:
71
82
  data_df = self._process_unit(data_df, postfix)
72
83
  return data_df
73
84
 
74
85
  @staticmethod
75
86
  def _slice_target_season(stats_df, target_season):
76
- target_season_columns = stats_df.columns.str.endswith(f"Q{target_season}")
87
+ target_season_columns = stats_df.columns.str.endswith(
88
+ f"Q{target_season}"
89
+ )
77
90
  stats_df = stats_df.loc[:, target_season_columns]
78
91
 
79
92
  return stats_df
80
-
93
+
81
94
  def _get_empty_structure(self):
82
95
  return_dict = {
83
96
  "warning": "No data fetched",
@@ -87,11 +100,12 @@ class BaseTransformer(abc.ABC):
87
100
 
88
101
  return_dict.update(
89
102
  {
90
- key: pd.DataFrame(columns= pd.Index([], name = 'date')) for key in self.return_keys
103
+ key: pd.DataFrame(columns=pd.Index([], name='date'))
104
+ for key in self.return_keys
91
105
  }
92
106
  )
93
107
  return return_dict
94
-
108
+
95
109
  def _process_value(self, value):
96
110
  if isinstance(value, str) and "%" in value:
97
111
  value = value.replace("%", "")
@@ -99,7 +113,7 @@ class BaseTransformer(abc.ABC):
99
113
  return float(value)
100
114
  except (ValueError, TypeError):
101
115
  return None
102
-
116
+
103
117
  def _calculate_growth(self, this_value, last_value, delta):
104
118
  try:
105
119
  return YoY_Calculator.cal_growth(
@@ -107,4 +121,38 @@ class BaseTransformer(abc.ABC):
107
121
  ) * 100
108
122
  except Exception:
109
123
  return None
110
-
124
+
125
+ def _cal_QoQ(self, data_dict):
126
+ """
127
+ data_dict: {"<key>_value": {"2020Q1": <value>, ....}, "<key>_percentage": {"2020Q1": <value>, ....}}
128
+ """
129
+
130
+ return_dict = data_dict.copy()
131
+
132
+ for key, datas in data_dict.items():
133
+ if (key.endswith("_value")):
134
+ main_key = key.split("_")[0]
135
+ temp_growth_dict = dict()
136
+ for year_season, value in datas.items():
137
+
138
+ year, season = year_season.split('Q')
139
+ year, season = int(year), int(season)
140
+
141
+ last_year, last_season = (
142
+ year, season - 1
143
+ ) if season != 1 else (year - 1, 4)
144
+
145
+ last_value = datas.get(f"{last_year}Q{last_season}", None)
146
+
147
+ growth = YoY_Calculator.cal_growth(
148
+ value, last_value, delta=1
149
+ )
150
+ if (growth):
151
+ growth = growth * 100
152
+ growth = f"{growth:.2f}%"
153
+
154
+ temp_growth_dict[year_season] = growth
155
+
156
+ return_dict[f"{main_key}_growth"] = growth
157
+ return_df = pd.DataFrame.from_dict(return_dict)
158
+ return return_df
@@ -52,6 +52,8 @@ class TWSECashFlowTransformer(BaseCashFlowTransformer):
52
52
  return self._get_empty_structure()
53
53
 
54
54
  data_df = self._process_twse_to_tej_format(fetched_data)
55
+ data_df = self._cal_QoQ(data_df.T.to_dict())
56
+ data_df = data_df.T
55
57
  target_season = fetched_data[0]['season']
56
58
 
57
59
  data_df_YoY = self._slice_target_season(data_df, target_season)
@@ -27,12 +27,27 @@ class FinanceOverviewTransformer(BaseFinanceOverviewTransformer):
27
27
  return processed_data_dict
28
28
 
29
29
  def _filter_target_data(self, balance_sheet, profit_lose, cash_flow):
30
+ balance_sheet = balance_sheet[-1]
31
+ cash_flow = cash_flow[-1]
32
+ profit_lose = profit_lose[-1]
33
+ seasons = [
34
+ (int(report['year']), int(report['season']))
35
+ for report in (balance_sheet, profit_lose, cash_flow)
36
+ ]
37
+
38
+ max_date = max(seasons)
39
+ year, season = max_date
40
+
30
41
  data_dict = {
31
- 'balance_sheet': balance_sheet[-1]['balance_sheet'],
32
- 'profit_lose': profit_lose[-1]['profit_lose'],
33
- "cash_flow": cash_flow[-1]['cash_flow']
42
+ 'balance_sheet': balance_sheet['balance_sheet'],
43
+ 'profit_lose': profit_lose['profit_lose'],
44
+ "cash_flow": cash_flow['cash_flow']
34
45
  }
35
- filtered_dict = {}
46
+ filtered_dict = {
47
+ "year": year,
48
+ "season": season
49
+ }
50
+
36
51
 
37
52
  for key, target_sets in self.target_fields.items():
38
53
  try:
@@ -105,7 +105,7 @@ class TWSEProfitLoseTransformer(BaseProfitLoseTransformer):
105
105
  return_dict.update({
106
106
  "profit_lose": stats_main_page_df,
107
107
  "grand_total_profit_lose": stats_grand_total_df,
108
- "profit_lose_all": self.new_df.T,
108
+ "profit_lose_all": self.new_df,
109
109
  "profit_lose_YoY": new_df_YoY
110
110
  })
111
111
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: neurostats_API
3
- Version: 1.0.0rc2
3
+ Version: 1.0.0rc4
4
4
  Summary: The service of NeuroStats website
5
5
  Home-page: https://github.com/NeurowattStats/NeuroStats_API.git
6
6
  Author: JasonWang@Neurowatt
@@ -71,7 +71,7 @@ pip install neurostats-API
71
71
  ```Python
72
72
  >>> import neurostats_API
73
73
  >>> print(neurostats_API.__version__)
74
- 1.0.0rc2
74
+ 1.0.0rc4
75
75
  ```
76
76
 
77
77
  ### 下載舊版
@@ -1,4 +1,4 @@
1
- neurostats_API/__init__.py,sha256=58rMdx6r5TIsGQzFXciGec5dDXE4IAHXd4j7caKw624,323
1
+ neurostats_API/__init__.py,sha256=_uiy9Ft_P0W543jiIeLSo575-z7QQrPbVPoJr3UKbm8,675
2
2
  neurostats_API/cli.py,sha256=UJSWLIw03P24p-gkBb6JSEI5dW5U12UvLf1L8HjQD-o,873
3
3
  neurostats_API/main.py,sha256=QcsfmWivg2Dnqw3MTJWiI0QvEiRs0VuH-BjwQHFCv00,677
4
4
  neurostats_API/async_mode/__init__.py,sha256=arSINQm3O3g-IwfOSLsGraEj2icJbkuW0t5HLPQ4Xk8,348
@@ -21,7 +21,7 @@ neurostats_API/async_mode/db_extractors/month_revenue/base.py,sha256=pXK6MEQtwCh
21
21
  neurostats_API/async_mode/db_extractors/month_revenue/twse.py,sha256=54HT6ISZYC9uFx-YAcWQN4r3rKuZN0fbC5zgsJE46Ic,197
22
22
  neurostats_API/async_mode/db_extractors/seasonal/__init__.py,sha256=sotZHTbuGH2am48hb0bIGVs3K_14PgMKsO-FEQzF0dI,236
23
23
  neurostats_API/async_mode/db_extractors/seasonal/balance_sheet.py,sha256=67OzGUxZbt7LQ9m3uTcnPPhEYQ17ygEH-Kv1eaR1X2Y,560
24
- neurostats_API/async_mode/db_extractors/seasonal/base.py,sha256=1Un39qDmckL-eL_-QM4BS8M5CCmALZv4g0m6799ez8g,4664
24
+ neurostats_API/async_mode/db_extractors/seasonal/base.py,sha256=VwaZ5fzZ40lHjo8xR_SumD7hTDwnIxiWrtY3fHm3kMA,4662
25
25
  neurostats_API/async_mode/db_extractors/seasonal/cashflow.py,sha256=2yOIOMFic9DTeEyhD2xD_tGrtSWb-LirUnN1a5ka_3A,293
26
26
  neurostats_API/async_mode/db_extractors/seasonal/profit_lose.py,sha256=AMKMVIVIBWTRk2b_A33OUuTLrCwc-xYj5fIL4YjLnug,564
27
27
  neurostats_API/async_mode/db_extractors/seasonal/tej.py,sha256=SqObDqR3uOnxXGF12VQz7Rzw7B5YAimY1-nR0ImLkaY,2591
@@ -66,14 +66,14 @@ neurostats_API/fetchers/tech.py,sha256=TsS8m25Otc3_2jTYITFe-wNHlDWcfWsHIxhOrqL8q
66
66
  neurostats_API/fetchers/tej_finance_report.py,sha256=mlIm2Qzs8-Xlzeb8uET8qGPWD3VGUx3g8qFFcY4UbAw,13022
67
67
  neurostats_API/fetchers/value_invest.py,sha256=QxQS2GcoLIU9ZBDEo8iRK2yHd8YLmBS70Bq42F3IsSw,8295
68
68
  neurostats_API/transformers/__init__.py,sha256=AJ0SkJ9P65gbdHPSygYw1X2I-KRJO20q20lLVP-JViE,676
69
- neurostats_API/transformers/base.py,sha256=ju6PCoc9CNo-sdGCYnozQ2_l8KBSHEEe5W2ua8HxzR0,3422
69
+ neurostats_API/transformers/base.py,sha256=cw_1pjtZOhbzMRNl9jcfsUNxjJkiNOWOjZFNXwpfkqs,4794
70
70
  neurostats_API/transformers/balance_sheet/__init__.py,sha256=RCScBsR3zeC5UdyuiHD1CGRQufoFL5LkN8WbtI5JeA4,87
71
71
  neurostats_API/transformers/balance_sheet/base.py,sha256=sEap9uHe-nri8F4gPV_FCVm0Qe6KWgpHt6a2ryAPd_8,1676
72
- neurostats_API/transformers/balance_sheet/twse.py,sha256=ZJKfRN4HkmmcbJsYY3t1Q6ufq0ri8btba5O9EhREW_g,2710
72
+ neurostats_API/transformers/balance_sheet/twse.py,sha256=ghQWvacJvJSEqu7RtNqICE5gK_N_AKWSvpfYv5Eioiw,2800
73
73
  neurostats_API/transformers/balance_sheet/us.py,sha256=WS1JjShLcs9oGov4Bdaggs_eTIzb8SSutVKKKbAK7Ts,897
74
74
  neurostats_API/transformers/cash_flow/__init__.py,sha256=KJs5kfjRV0ahy842ZVLvQuZS02YxT-w0cMNHfU0ngFE,79
75
75
  neurostats_API/transformers/cash_flow/base.py,sha256=6Lt44O-xg658-jEFYBHOF2cgD0PGiKK43257uQMSetk,4392
76
- neurostats_API/transformers/cash_flow/twse.py,sha256=_ZIiZrjXSBCxgpXRgXe8MYWFWlDSVQVEb06P90LOezA,2351
76
+ neurostats_API/transformers/cash_flow/twse.py,sha256=srrmTmFheJig3el5jQIW8YBgpZVUOq-Af2zM4NxLm7s,2432
77
77
  neurostats_API/transformers/cash_flow/us.py,sha256=nRJajeDz4HNkv42NosoP0Jir4tIA0ybhIZu9zHkjAEM,1304
78
78
  neurostats_API/transformers/daily_chip/__init__.py,sha256=e-yvQ94J3dkzRbhZwOiAkyt_ub9bRQ7pAVDbO-61Grw,43
79
79
  neurostats_API/transformers/daily_chip/base.py,sha256=KBsnpACakJh2W-k4Kvv-dVNnSNbUCGMeqvQsTQkz-aE,184
@@ -91,13 +91,13 @@ neurostats_API/transformers/daily_tech/utils/processor.py,sha256=9zOjVFyWqzRXD5j
91
91
  neurostats_API/transformers/finance_overview/__init__.py,sha256=mWFn13YrugExrSQ7oJvnvP95W20_rQ1wOesrZY3XnSU,107
92
92
  neurostats_API/transformers/finance_overview/agent_overview.py,sha256=DA7zLTslqiYCKIzC8wKKJK7f2cz2KpTOhqy-qDQmDrc,1974
93
93
  neurostats_API/transformers/finance_overview/base.py,sha256=uksr5sUhbaL12ZBH3cUtR1Q0NzpQ8C36FwfwluB8uYE,29669
94
- neurostats_API/transformers/finance_overview/stats_overview.py,sha256=pRstGTw7flYQ8nDFHA8BioWRGXBTu_T2GBuzm5us0xM,2498
94
+ neurostats_API/transformers/finance_overview/stats_overview.py,sha256=ml-u6BHCSKaTebvDAOBgyJfT6o3LCmluCfneABn1ysw,2884
95
95
  neurostats_API/transformers/month_revenue/__init__.py,sha256=fNj-FNJgl7yhYeswd3UFZEcSNoDF4kL6Mkspjom2cSo,47
96
96
  neurostats_API/transformers/month_revenue/base.py,sha256=cDswLIZ7UBJX3insyI3NPunxOva9Pf-6TEW15tHjn4s,1881
97
97
  neurostats_API/transformers/month_revenue/twse.py,sha256=-QhPI3hRc7PPWmFarsbBINauv6LdwXlyR_hIR6alh34,5642
98
98
  neurostats_API/transformers/profit_lose/__init__.py,sha256=oOPyakP1wDnmq7bsxgEm4vu1uWtUR34dd3Oegk9kvq0,83
99
99
  neurostats_API/transformers/profit_lose/base.py,sha256=BJZjE1GmWBI3ayjDkzrtQTrn0vjTSVckPbrQ_u6zEl0,3125
100
- neurostats_API/transformers/profit_lose/twse.py,sha256=kpIEk7D309umdt5xRvmMDvNfuwS53CwqpIhczCKwrCo,5402
100
+ neurostats_API/transformers/profit_lose/twse.py,sha256=RwAJWQBdsjFaLlW-HL6oUGxLAd8jXPpp6ljVB8uOfhQ,5400
101
101
  neurostats_API/transformers/profit_lose/us.py,sha256=QzAd2N_1Dqqb2TEPCLkqxsfp62gOMffbSOgr6FFODRM,804
102
102
  neurostats_API/transformers/tej/__init__.py,sha256=WihARZhphkvApsKr4U0--68m1M-Dc_rpV7xoV2fUV7E,61
103
103
  neurostats_API/transformers/tej/base.py,sha256=YD6M3Iok-KXb5EDhqa_fUzJ-zWXLeoXPsavdDJD-ks4,5436
@@ -113,7 +113,7 @@ neurostats_API/utils/datetime.py,sha256=XJya4G8b_-ZOaBbMXgQjWh2MC4wc-o6goQ7EQJQM
113
113
  neurostats_API/utils/db_client.py,sha256=OYe6yazcR4Aa6jYmy47JrryUeh2NnKGqY2K_lSZe6i8,455
114
114
  neurostats_API/utils/exception.py,sha256=yv92GVh5uHV1BgRmO4DwJcX_PtE0-TSgQoo3VnZ5hOQ,277
115
115
  neurostats_API/utils/logger.py,sha256=egBiiPGTi5l1FoX_o6EvdGh81R0_k8hFPctSxq8RCoo,693
116
- neurostats_API-1.0.0rc2.dist-info/METADATA,sha256=xQ479cEYQ3A48QpJlltoMehvj3mG6fxyT09XjWru4SU,2964
117
- neurostats_API-1.0.0rc2.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
118
- neurostats_API-1.0.0rc2.dist-info/top_level.txt,sha256=nSlQPMG0VtXivJyedp4Bkf86EOy2TpW10VGxolXrqnU,15
119
- neurostats_API-1.0.0rc2.dist-info/RECORD,,
116
+ neurostats_API-1.0.0rc4.dist-info/METADATA,sha256=powkqVobJNpKzC-H4kX4IjnmL9WMR7CLMbCAdGX3Kdk,2964
117
+ neurostats_API-1.0.0rc4.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
118
+ neurostats_API-1.0.0rc4.dist-info/top_level.txt,sha256=nSlQPMG0VtXivJyedp4Bkf86EOy2TpW10VGxolXrqnU,15
119
+ neurostats_API-1.0.0rc4.dist-info/RECORD,,