neurostats-API 1.0.0rc1__tar.gz → 1.0.0rc3__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.
Files changed (129) hide show
  1. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/PKG-INFO +2 -2
  2. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/README.md +1 -1
  3. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/__init__.py +1 -1
  4. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/db_extractors/daily/twse_chip.py +5 -0
  5. neurostats_api-1.0.0rc3/neurostats_API/async_mode/db_extractors/seasonal/base.py +152 -0
  6. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/daily_chip/twse_chip.py +16 -13
  7. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API.egg-info/PKG-INFO +2 -2
  8. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/setup.py +1 -1
  9. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/test/test_async_fetcher.py +2 -1
  10. neurostats_api-1.0.0rc1/neurostats_API/async_mode/db_extractors/seasonal/base.py +0 -159
  11. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/MANIFEST.in +0 -0
  12. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/__init__.py +0 -0
  13. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/db/__init__.py +0 -0
  14. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/db/base.py +0 -0
  15. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/db/tej.py +0 -0
  16. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/db/twse.py +0 -0
  17. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/db/us.py +0 -0
  18. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/db_extractors/__init__.py +0 -0
  19. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/db_extractors/base.py +0 -0
  20. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/db_extractors/daily/__init__.py +0 -0
  21. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/db_extractors/daily/base.py +0 -0
  22. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/db_extractors/daily/tej_chip.py +0 -0
  23. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/db_extractors/daily/tej_tech.py +0 -0
  24. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/db_extractors/daily/value.py +0 -0
  25. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/db_extractors/daily/yf.py +0 -0
  26. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/db_extractors/month_revenue/__init__.py +0 -0
  27. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/db_extractors/month_revenue/base.py +0 -0
  28. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/db_extractors/month_revenue/twse.py +0 -0
  29. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/db_extractors/seasonal/__init__.py +0 -0
  30. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/db_extractors/seasonal/balance_sheet.py +0 -0
  31. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/db_extractors/seasonal/cashflow.py +0 -0
  32. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/db_extractors/seasonal/profit_lose.py +0 -0
  33. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/db_extractors/seasonal/tej.py +0 -0
  34. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/factory/__init__.py +0 -0
  35. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/factory/extractor_factory.py +0 -0
  36. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/factory/transformer_factory.py +0 -0
  37. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/fetchers/__init__.py +0 -0
  38. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/fetchers/balance_sheet.py +0 -0
  39. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/fetchers/base.py +0 -0
  40. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/fetchers/cash_flow.py +0 -0
  41. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/fetchers/finance_overview.py +0 -0
  42. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/fetchers/month_revenue.py +0 -0
  43. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/fetchers/profit_lose.py +0 -0
  44. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/fetchers/tech.py +0 -0
  45. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/fetchers/tej.py +0 -0
  46. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/fetchers/twse_institution.py +0 -0
  47. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/fetchers/twse_margin.py +0 -0
  48. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/async_mode/fetchers/value.py +0 -0
  49. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/cli.py +0 -0
  50. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/config/company_list/ticker_index_industry_map.json +0 -0
  51. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/config/company_list/tw.json +0 -0
  52. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/config/company_list/us.json +0 -0
  53. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/config/company_list/us_TradingView_list.json +0 -0
  54. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/config/tej_db/tej_db_index.yaml +0 -0
  55. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/config/tej_db/tej_db_percent_index.yaml +0 -0
  56. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/config/tej_db/tej_db_skip_index.yaml +0 -0
  57. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/config/tej_db/tej_db_thousand_index.yaml +0 -0
  58. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/config/twse/balance_sheet.yaml +0 -0
  59. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/config/twse/cash_flow_percentage.yaml +0 -0
  60. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/config/twse/finance_overview_dict.yaml +0 -0
  61. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/config/twse/profit_lose.yaml +0 -0
  62. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/config/twse/seasonal_data_field_dict.txt +0 -0
  63. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/fetchers/__init__.py +0 -0
  64. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/fetchers/balance_sheet.py +0 -0
  65. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/fetchers/base.py +0 -0
  66. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/fetchers/cash_flow.py +0 -0
  67. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/fetchers/finance_overview.py +0 -0
  68. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/fetchers/institution.py +0 -0
  69. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/fetchers/margin_trading.py +0 -0
  70. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/fetchers/month_revenue.py +0 -0
  71. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/fetchers/profit_lose.py +0 -0
  72. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/fetchers/tech.py +0 -0
  73. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/fetchers/tej_finance_report.py +0 -0
  74. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/fetchers/value_invest.py +0 -0
  75. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/main.py +0 -0
  76. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/__init__.py +0 -0
  77. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/balance_sheet/__init__.py +0 -0
  78. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/balance_sheet/base.py +0 -0
  79. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/balance_sheet/twse.py +0 -0
  80. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/balance_sheet/us.py +0 -0
  81. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/base.py +0 -0
  82. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/cash_flow/__init__.py +0 -0
  83. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/cash_flow/base.py +0 -0
  84. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/cash_flow/twse.py +0 -0
  85. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/cash_flow/us.py +0 -0
  86. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/daily_chip/__init__.py +0 -0
  87. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/daily_chip/base.py +0 -0
  88. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/daily_chip/tej.py +0 -0
  89. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/daily_chip/utils/__init__.py +0 -0
  90. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/daily_chip/utils/institution.py +0 -0
  91. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/daily_chip/utils/margin_trading.py +0 -0
  92. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/daily_chip/utils/security_lending.py +0 -0
  93. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/daily_tech/__init__.py +0 -0
  94. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/daily_tech/base.py +0 -0
  95. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/daily_tech/tech.py +0 -0
  96. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/daily_tech/utils/__init__.py +0 -0
  97. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/daily_tech/utils/processor.py +0 -0
  98. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/finance_overview/__init__.py +0 -0
  99. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/finance_overview/agent_overview.py +0 -0
  100. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/finance_overview/base.py +0 -0
  101. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/finance_overview/stats_overview.py +0 -0
  102. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/month_revenue/__init__.py +0 -0
  103. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/month_revenue/base.py +0 -0
  104. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/month_revenue/twse.py +0 -0
  105. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/profit_lose/__init__.py +0 -0
  106. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/profit_lose/base.py +0 -0
  107. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/profit_lose/twse.py +0 -0
  108. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/profit_lose/us.py +0 -0
  109. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/tej/__init__.py +0 -0
  110. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/tej/base.py +0 -0
  111. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/tej/finance_statement.py +0 -0
  112. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/value/__init__.py +0 -0
  113. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/value/base.py +0 -0
  114. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/value/tej.py +0 -0
  115. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/transformers/value/twse.py +0 -0
  116. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/utils/__init__.py +0 -0
  117. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/utils/calculate_value.py +0 -0
  118. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/utils/data_process.py +0 -0
  119. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/utils/datetime.py +0 -0
  120. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/utils/db_client.py +0 -0
  121. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/utils/exception.py +0 -0
  122. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API/utils/logger.py +0 -0
  123. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API.egg-info/SOURCES.txt +0 -0
  124. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API.egg-info/dependency_links.txt +0 -0
  125. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API.egg-info/requires.txt +0 -0
  126. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/neurostats_API.egg-info/top_level.txt +0 -0
  127. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/setup.cfg +0 -0
  128. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/test/test_fetchers.py +0 -0
  129. {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc3}/test/test_tej.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: neurostats_API
3
- Version: 1.0.0rc1
3
+ Version: 1.0.0rc3
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.0rc1
74
+ 1.0.0rc2
75
75
  ```
76
76
 
77
77
  ### 下載舊版
@@ -54,7 +54,7 @@ pip install neurostats-API
54
54
  ```Python
55
55
  >>> import neurostats_API
56
56
  >>> print(neurostats_API.__version__)
57
- 1.0.0rc1
57
+ 1.0.0rc2
58
58
  ```
59
59
 
60
60
  ### 下載舊版
@@ -1,4 +1,4 @@
1
- __version__='1.0.0rc1'
1
+ __version__='1.0.0rc3'
2
2
 
3
3
  from .fetchers import (
4
4
  AgentFinanceOverviewFetcher,
@@ -34,6 +34,11 @@ class AsyncTWSEChipDBExtractor(BaseDailyTechDBExtractor):
34
34
 
35
35
  def _prepare_query(self, start_date=None, end_date=None, get_latest = False):
36
36
  query, projection, sort = super()._prepare_query(start_date, end_date, get_latest)
37
+ query.update(
38
+ {
39
+ self.target_column: {"$exists" : True}
40
+ }
41
+ )
37
42
  projection.update(
38
43
  {
39
44
  'date': 1,
@@ -0,0 +1,152 @@
1
+ from ..base import BaseDBExtractor
2
+ from datetime import datetime
3
+ import json
4
+ import pandas as pd
5
+ from pymongo import ASCENDING, DESCENDING
6
+ from neurostats_API.async_mode.db import TWSEDBClient, USDBClient
7
+ from neurostats_API.utils import StatsDateTime, StatsProcessor, NotSupportedError
8
+ import yaml
9
+
10
+
11
+ class AsyncBaseSeasonalDBExtractor(BaseDBExtractor):
12
+
13
+ def __init__(self, ticker, client):
14
+ super().__init__(ticker, client)
15
+
16
+ self.collection_name_map = self._get_collection_map()
17
+ self.collection_name = self._get_collection_name()
18
+ if (self.collection_name is None):
19
+ raise NotSupportedError(
20
+ f"{self.__class__.__name__} only supports {list(self.collection_name_map.keys())}, got {self.zone} with ticker = \"{self.ticker}\""
21
+ )
22
+ self.collection = self.db_client.get_collection(self.collection_name)
23
+
24
+ self.column_name_map = None
25
+
26
+ async def query_data(
27
+ self,
28
+ start_date=None,
29
+ end_date=None,
30
+ get_latest=False # 決定是否只取得最新一筆資料
31
+ ):
32
+ if (start_date is None):
33
+ start_date = "1991-01-01"
34
+ if (end_date is None):
35
+ end_date = self._get_today()
36
+
37
+ start_year, start_season = self._get_year_and_season(date=start_date)
38
+ end_year, end_season = self._get_year_and_season(date=end_date)
39
+
40
+ query, projection, sort = self._prepare_query(
41
+ start_year, start_season, end_year, end_season, get_latest
42
+ )
43
+ cursor = self.collection.find(query, projection).sort(sort)
44
+
45
+ if (get_latest):
46
+ cursor = cursor.limit(1)
47
+
48
+ fetched_data = [data async for data in cursor]
49
+
50
+ return fetched_data
51
+
52
+ def _get_collection_name(self):
53
+
54
+ return self.collection_name_map.get(self.zone, None)
55
+
56
+ def _get_collection_map(self):
57
+ return {"tw": "twse_seasonal_report", "us": "us_fundamentals"}
58
+
59
+ def _prepare_query(
60
+ self,
61
+ start_year=None,
62
+ start_season=None,
63
+ end_year=None,
64
+ end_season=None,
65
+ get_latest=False
66
+ ):
67
+ chart_name = self.column_name_map.get(self.get_zone(), None)
68
+
69
+ query = {
70
+ "ticker": self.ticker,
71
+ chart_name: {"$exists": True}
72
+ }
73
+
74
+ query = self._update_query_with_year_season(
75
+ query, start_year, start_season, end_year, end_season
76
+ )
77
+
78
+ projection = {
79
+ "_id": 0,
80
+ "ticker": 1,
81
+ "year": 1,
82
+ "season": 1,
83
+ chart_name: 1,
84
+ }
85
+
86
+ if (get_latest):
87
+ sort = [("year", DESCENDING), ("season", DESCENDING)]
88
+ else:
89
+ sort = [("year", ASCENDING), ("season", ASCENDING)]
90
+
91
+ return query, projection, sort
92
+
93
+ def _get_year_and_season(self, date):
94
+ if (isinstance(date, str)):
95
+ date = datetime.strptime(date, "%Y-%m-%d")
96
+
97
+ year = date.year
98
+ month = date.month
99
+
100
+ season = (month - 1) // 3 + 1
101
+
102
+ return year, season
103
+
104
+ def _update_query_with_year_season(
105
+ self, query, start_year, start_season, end_year, end_season
106
+ ):
107
+ if all(v is not None for v in [start_year, start_season]):
108
+ # 大於start_year條件
109
+ query.update(
110
+ {
111
+ "$or": [
112
+ {
113
+ "year": {
114
+ "$gt": start_year
115
+ }
116
+ },
117
+ {
118
+ "year": start_year,
119
+ "season": {
120
+ "$gte": start_season
121
+ }
122
+ },
123
+ ]
124
+ }
125
+ )
126
+
127
+ if all(v is not None for v in [end_year, end_season]):
128
+ # 小於end_year條件
129
+ query.update(
130
+ {
131
+ "$and":
132
+ query.get("$and", []) + [
133
+ {
134
+ "$or": [
135
+ {
136
+ "year": {
137
+ "$lt": end_year
138
+ }
139
+ },
140
+ {
141
+ "year": end_year,
142
+ "season": {
143
+ "$lte": end_season
144
+ }
145
+ },
146
+ ]
147
+ }
148
+ ]
149
+ }
150
+ )
151
+
152
+ return query
@@ -62,7 +62,9 @@ class TWSEChipTransformer(BaseChipTransformer):
62
62
  def _process_latest(self, latest_data: dict, latest_tech: dict, key: str):
63
63
  latest_trade = latest_data.get(key)
64
64
  return {
65
- "date": latest_data.get('date', datetime.today().strftime("%Y-%m-%d")),
65
+ "date":
66
+ latest_data.get('date',
67
+ datetime.today().strftime("%Y-%m-%d")),
66
68
  **self._process_latest_trading(latest_trade, latest_tech, key)
67
69
  }
68
70
 
@@ -182,8 +184,8 @@ class TWSEChipTransformer(BaseChipTransformer):
182
184
  )
183
185
  elif (key.find("三大法人") >= 0):
184
186
  self._target_institution(
185
- latest_trading, latest_table['institutional_investor'], key,
186
- volume
187
+ latest_trading, latest_table['institutional_investor'],
188
+ key, volume
187
189
  )
188
190
  # 計算合計
189
191
  for unit in ['stock', 'percentage']:
@@ -321,18 +323,16 @@ class TWSEChipTransformer(BaseChipTransformer):
321
323
  2).item()
322
324
 
323
325
  def _process_latest_margin(self, latest_trading, *args):
326
+
324
327
  def _default_margin_chart():
325
- dafault_dict = {
326
- "financing": {},
327
- "short_selling": {}
328
- }
328
+ dafault_dict = {"financing": {}, "short_selling": {}}
329
329
  return {
330
330
  "margin_trading": pd.DataFrame.from_dict(dafault_dict),
331
331
  "security_offset": None
332
332
  }
333
-
333
+
334
334
  if (latest_trading is None):
335
- return _default_margin_chart()
335
+ return _default_margin_chart()
336
336
 
337
337
  latest_trading['financing']['現償'] = latest_trading['financing'].pop(
338
338
  '現金償還'
@@ -354,14 +354,17 @@ class TWSEChipTransformer(BaseChipTransformer):
354
354
  }
355
355
 
356
356
  def _process_latest_security(self, latest_trading, *args):
357
+
357
358
  def _default_margin_chart():
358
- return {
359
+ return {
359
360
  "stock_lending":
360
- pd.DataFrame(index = ["當日賣出", "現償", "當日還券", "當日調整", "當日餘額", "次一營業日可限額"])
361
+ pd.DataFrame(
362
+ index=["當日賣出", "現償", "當日還券", "當日調整", "當日餘額", "次一營業日可限額"]
363
+ )
361
364
  }
362
-
365
+
363
366
  if (latest_trading is None):
364
- return _default_margin_chart()
367
+ return _default_margin_chart()
365
368
 
366
369
  latest_stock_lending = latest_trading['stock_lending']
367
370
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: neurostats_API
3
- Version: 1.0.0rc1
3
+ Version: 1.0.0rc3
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.0rc1
74
+ 1.0.0rc2
75
75
  ```
76
76
 
77
77
  ### 下載舊版
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name='neurostats_API',
5
- version='1.0.0rc1',
5
+ version='1.0.0rc3',
6
6
  long_description=open('README.md', 'r', encoding='utf-8').read(),
7
7
  long_description_content_type='text/markdown',
8
8
  install_requires=[
@@ -7,7 +7,7 @@ from pymongo import AsyncMongoClient
7
7
 
8
8
 
9
9
  mongo_uri = "mongodb://neurowatt:neurodb123@db.neurowatt.ai:27017/neurowatt"
10
- tickers = ["-1234"]
10
+ tickers = ["AAPL", "2330", "1260", "-1234"]
11
11
 
12
12
  client = AsyncMongoClient(mongo_uri)
13
13
 
@@ -229,6 +229,7 @@ def print_dict_summary(data: dict, indent: int = 1):
229
229
  prefix = " " * indent
230
230
  for key, value in data.items():
231
231
  if isinstance(value, pd.DataFrame):
232
+ assert value.shape!= (0, 0)
232
233
  print(f"{prefix} \"{key}\": DataFrame shape = {value.shape}")
233
234
  elif isinstance(value, pd.Series):
234
235
  print(f"{prefix} \"{key}\": Series shape = {value.shape}")
@@ -1,159 +0,0 @@
1
- from ..base import BaseDBExtractor
2
- from datetime import datetime
3
- import json
4
- import pandas as pd
5
- from pymongo import ASCENDING, DESCENDING
6
- from neurostats_API.async_mode.db import TWSEDBClient, USDBClient
7
- from neurostats_API.utils import StatsDateTime, StatsProcessor, NotSupportedError
8
- import yaml
9
-
10
- class AsyncBaseSeasonalDBExtractor(BaseDBExtractor):
11
-
12
- def __init__(self, ticker, client):
13
- super().__init__(ticker, client)
14
-
15
- self.collection_name_map = self._get_collection_map()
16
- self.collection_name = self._get_collection_name()
17
- if (self.collection_name is None):
18
- raise NotSupportedError(
19
- f"{self.__class__.__name__} only supports {list(self.collection_name_map.keys())}, got {self.zone} with ticker = \"{self.ticker}\""
20
- )
21
- self.collection = self.db_client.get_collection(
22
- self.collection_name
23
- )
24
-
25
- self.column_name_map = None
26
-
27
-
28
-
29
-
30
- async def query_data(
31
- self,
32
- start_date = None,
33
- end_date = None,
34
- get_latest = False # 決定是否只取得最新一筆資料
35
- ):
36
- if (start_date is None):
37
- start_date = "1991-01-01"
38
- if (end_date is None):
39
- end_date = self._get_today()
40
-
41
- start_year, start_season = self._get_year_and_season(
42
- date = start_date
43
- )
44
- end_year, end_season = self._get_year_and_season(
45
- date = end_date
46
- )
47
-
48
- query, projection, sort = self._prepare_query(
49
- start_year,
50
- start_season,
51
- end_year,
52
- end_season,
53
- get_latest
54
- )
55
- cursor = self.collection.find(query, projection).sort(sort)
56
-
57
- if (get_latest):
58
- cursor = cursor.limit(1)
59
-
60
- fetched_data = [data async for data in cursor]
61
-
62
- return fetched_data
63
-
64
- def _get_collection_name(self):
65
-
66
- return self.collection_name_map.get(self.zone, None)
67
-
68
- def _get_collection_map(self):
69
- return {
70
- "tw": "twse_seasonal_report",
71
- "us": "us_fundamentals"
72
- }
73
-
74
- def _prepare_query(
75
- self,
76
- start_year = None,
77
- start_season = None,
78
- end_year = None,
79
- end_season = None,
80
- get_latest = False
81
- ):
82
- chart_name = self.column_name_map.get(self.get_zone(), None)
83
-
84
- query = {
85
- "ticker": self.ticker
86
- }
87
-
88
- query = self._update_query_with_year_season(
89
- query,
90
- start_year,
91
- start_season,
92
- end_year,
93
- end_season
94
- )
95
-
96
- projection = {
97
- "_id": 0,
98
- "ticker": 1,
99
- "year": 1,
100
- "season": 1,
101
- chart_name: 1,
102
- }
103
-
104
- if (get_latest):
105
- sort = [
106
- ("year", DESCENDING),
107
- ("season", DESCENDING)
108
- ]
109
- else:
110
- sort = [
111
- ("year", ASCENDING),
112
- ("season", ASCENDING)
113
- ]
114
-
115
- return query, projection, sort
116
-
117
-
118
- def _get_year_and_season(self, date):
119
- if (isinstance(date, str)):
120
- date = datetime.strptime(date, "%Y-%m-%d")
121
-
122
- year = date.year
123
- month = date.month
124
-
125
- season = (month - 1) // 3 + 1
126
-
127
- return year, season
128
-
129
- def _update_query_with_year_season(
130
- self,
131
- query,
132
- start_year,
133
- start_season,
134
- end_year,
135
- end_season
136
- ):
137
- if all(v is not None for v in [start_year, start_season]):
138
- # 大於start_year條件
139
- query.update({
140
- "$or": [
141
- {"year": {"$gt": start_year}},
142
- {"year": start_year, "season": {"$gte": start_season}},
143
- ]
144
- })
145
-
146
- if all(v is not None for v in [end_year, end_season]):
147
- # 小於end_year條件
148
- query.update({
149
- "$and": query.get("$and", []) + [
150
- {
151
- "$or": [
152
- {"year": {"$lt": end_year}},
153
- {"year": end_year, "season": {"$lte": end_season}},
154
- ]
155
- }
156
- ]
157
- })
158
-
159
- return query