neurostats-API 1.0.0rc1__tar.gz → 1.0.0rc2__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-1.0.0rc1 → neurostats_api-1.0.0rc2}/PKG-INFO +2 -2
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/README.md +1 -1
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/__init__.py +1 -1
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db_extractors/daily/twse_chip.py +5 -0
- neurostats_api-1.0.0rc2/neurostats_API/async_mode/db_extractors/seasonal/base.py +152 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/daily_chip/twse_chip.py +16 -13
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API.egg-info/PKG-INFO +2 -2
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/setup.py +1 -1
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/test/test_async_fetcher.py +1 -1
- neurostats_api-1.0.0rc1/neurostats_API/async_mode/db_extractors/seasonal/base.py +0 -159
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/MANIFEST.in +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/__init__.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db/__init__.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db/base.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db/tej.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db/twse.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db/us.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db_extractors/__init__.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db_extractors/base.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db_extractors/daily/__init__.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db_extractors/daily/base.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db_extractors/daily/tej_chip.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db_extractors/daily/tej_tech.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db_extractors/daily/value.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db_extractors/daily/yf.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db_extractors/month_revenue/__init__.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db_extractors/month_revenue/base.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db_extractors/month_revenue/twse.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db_extractors/seasonal/__init__.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db_extractors/seasonal/balance_sheet.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db_extractors/seasonal/cashflow.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db_extractors/seasonal/profit_lose.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db_extractors/seasonal/tej.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/factory/__init__.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/factory/extractor_factory.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/factory/transformer_factory.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/fetchers/__init__.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/fetchers/balance_sheet.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/fetchers/base.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/fetchers/cash_flow.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/fetchers/finance_overview.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/fetchers/month_revenue.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/fetchers/profit_lose.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/fetchers/tech.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/fetchers/tej.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/fetchers/twse_institution.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/fetchers/twse_margin.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/fetchers/value.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/cli.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/config/company_list/ticker_index_industry_map.json +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/config/company_list/tw.json +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/config/company_list/us.json +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/config/company_list/us_TradingView_list.json +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/config/tej_db/tej_db_index.yaml +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/config/tej_db/tej_db_percent_index.yaml +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/config/tej_db/tej_db_skip_index.yaml +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/config/tej_db/tej_db_thousand_index.yaml +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/config/twse/balance_sheet.yaml +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/config/twse/cash_flow_percentage.yaml +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/config/twse/finance_overview_dict.yaml +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/config/twse/profit_lose.yaml +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/config/twse/seasonal_data_field_dict.txt +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/fetchers/__init__.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/fetchers/balance_sheet.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/fetchers/base.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/fetchers/cash_flow.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/fetchers/finance_overview.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/fetchers/institution.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/fetchers/margin_trading.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/fetchers/month_revenue.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/fetchers/profit_lose.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/fetchers/tech.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/fetchers/tej_finance_report.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/fetchers/value_invest.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/main.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/__init__.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/balance_sheet/__init__.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/balance_sheet/base.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/balance_sheet/twse.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/balance_sheet/us.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/base.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/cash_flow/__init__.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/cash_flow/base.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/cash_flow/twse.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/cash_flow/us.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/daily_chip/__init__.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/daily_chip/base.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/daily_chip/tej.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/daily_chip/utils/__init__.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/daily_chip/utils/institution.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/daily_chip/utils/margin_trading.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/daily_chip/utils/security_lending.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/daily_tech/__init__.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/daily_tech/base.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/daily_tech/tech.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/daily_tech/utils/__init__.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/daily_tech/utils/processor.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/finance_overview/__init__.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/finance_overview/agent_overview.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/finance_overview/base.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/finance_overview/stats_overview.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/month_revenue/__init__.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/month_revenue/base.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/month_revenue/twse.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/profit_lose/__init__.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/profit_lose/base.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/profit_lose/twse.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/profit_lose/us.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/tej/__init__.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/tej/base.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/tej/finance_statement.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/value/__init__.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/value/base.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/value/tej.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/value/twse.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/utils/__init__.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/utils/calculate_value.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/utils/data_process.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/utils/datetime.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/utils/db_client.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/utils/exception.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/utils/logger.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API.egg-info/SOURCES.txt +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API.egg-info/dependency_links.txt +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API.egg-info/requires.txt +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API.egg-info/top_level.txt +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/setup.cfg +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/test/test_fetchers.py +0 -0
- {neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/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.
|
3
|
+
Version: 1.0.0rc2
|
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.
|
74
|
+
1.0.0rc2
|
75
75
|
```
|
76
76
|
|
77
77
|
### 下載舊版
|
@@ -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":
|
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'],
|
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
|
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(
|
361
|
+
pd.DataFrame(
|
362
|
+
index=["當日賣出", "現償", "當日還券", "當日調整", "當日餘額", "次一營業日可限額"]
|
363
|
+
)
|
361
364
|
}
|
362
|
-
|
365
|
+
|
363
366
|
if (latest_trading is None):
|
364
|
-
return
|
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.
|
3
|
+
Version: 1.0.0rc2
|
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.
|
74
|
+
1.0.0rc2
|
75
75
|
```
|
76
76
|
|
77
77
|
### 下載舊版
|
@@ -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
|
File without changes
|
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/db_extractors/base.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/factory/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/fetchers/__init__.py
RENAMED
File without changes
|
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/fetchers/base.py
RENAMED
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/fetchers/cash_flow.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/fetchers/tech.py
RENAMED
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/fetchers/tej.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/async_mode/fetchers/value.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/config/company_list/tw.json
RENAMED
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/config/company_list/us.json
RENAMED
File without changes
|
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/config/tej_db/tej_db_index.yaml
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/config/twse/balance_sheet.yaml
RENAMED
File without changes
|
File without changes
|
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/config/twse/profit_lose.yaml
RENAMED
File without changes
|
File without changes
|
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/fetchers/balance_sheet.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/fetchers/finance_overview.py
RENAMED
File without changes
|
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/fetchers/margin_trading.py
RENAMED
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/fetchers/month_revenue.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/fetchers/tej_finance_report.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/balance_sheet/us.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/cash_flow/base.py
RENAMED
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/cash_flow/twse.py
RENAMED
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/cash_flow/us.py
RENAMED
File without changes
|
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/daily_chip/base.py
RENAMED
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/daily_chip/tej.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/daily_tech/base.py
RENAMED
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/daily_tech/tech.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/profit_lose/base.py
RENAMED
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/profit_lose/twse.py
RENAMED
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/profit_lose/us.py
RENAMED
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/tej/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/value/__init__.py
RENAMED
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/value/base.py
RENAMED
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/value/tej.py
RENAMED
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API/transformers/value/twse.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{neurostats_api-1.0.0rc1 → neurostats_api-1.0.0rc2}/neurostats_API.egg-info/dependency_links.txt
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|