neurostats-API 1.0.0rc3__tar.gz → 1.0.0rc5__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 (130) hide show
  1. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/PKG-INFO +2 -2
  2. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/README.md +1 -1
  3. neurostats_api-1.0.0rc5/neurostats_API/__init__.py +29 -0
  4. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/fetchers/tech.py +2 -2
  5. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/balance_sheet/twse.py +23 -18
  6. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/balance_sheet/us.py +17 -9
  7. neurostats_api-1.0.0rc5/neurostats_API/transformers/base.py +158 -0
  8. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/cash_flow/twse.py +2 -0
  9. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/daily_chip/twse_chip.py +1 -1
  10. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/finance_overview/stats_overview.py +19 -4
  11. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/month_revenue/twse.py +6 -1
  12. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/profit_lose/twse.py +1 -1
  13. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/profit_lose/us.py +1 -0
  14. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/tej/finance_statement.py +1 -1
  15. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/value/twse.py +1 -1
  16. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API.egg-info/PKG-INFO +2 -2
  17. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/setup.py +1 -1
  18. neurostats_api-1.0.0rc3/neurostats_API/__init__.py +0 -15
  19. neurostats_api-1.0.0rc3/neurostats_API/transformers/base.py +0 -110
  20. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/MANIFEST.in +0 -0
  21. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/__init__.py +0 -0
  22. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/db/__init__.py +0 -0
  23. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/db/base.py +0 -0
  24. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/db/tej.py +0 -0
  25. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/db/twse.py +0 -0
  26. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/db/us.py +0 -0
  27. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/db_extractors/__init__.py +0 -0
  28. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/db_extractors/base.py +0 -0
  29. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/db_extractors/daily/__init__.py +0 -0
  30. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/db_extractors/daily/base.py +0 -0
  31. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/db_extractors/daily/tej_chip.py +0 -0
  32. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/db_extractors/daily/tej_tech.py +0 -0
  33. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/db_extractors/daily/twse_chip.py +0 -0
  34. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/db_extractors/daily/value.py +0 -0
  35. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/db_extractors/daily/yf.py +0 -0
  36. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/db_extractors/month_revenue/__init__.py +0 -0
  37. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/db_extractors/month_revenue/base.py +0 -0
  38. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/db_extractors/month_revenue/twse.py +0 -0
  39. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/db_extractors/seasonal/__init__.py +0 -0
  40. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/db_extractors/seasonal/balance_sheet.py +0 -0
  41. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/db_extractors/seasonal/base.py +0 -0
  42. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/db_extractors/seasonal/cashflow.py +0 -0
  43. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/db_extractors/seasonal/profit_lose.py +0 -0
  44. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/db_extractors/seasonal/tej.py +0 -0
  45. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/factory/__init__.py +0 -0
  46. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/factory/extractor_factory.py +0 -0
  47. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/factory/transformer_factory.py +0 -0
  48. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/fetchers/__init__.py +0 -0
  49. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/fetchers/balance_sheet.py +0 -0
  50. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/fetchers/base.py +0 -0
  51. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/fetchers/cash_flow.py +0 -0
  52. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/fetchers/finance_overview.py +0 -0
  53. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/fetchers/month_revenue.py +0 -0
  54. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/fetchers/profit_lose.py +0 -0
  55. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/fetchers/tej.py +0 -0
  56. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/fetchers/twse_institution.py +0 -0
  57. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/fetchers/twse_margin.py +0 -0
  58. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/async_mode/fetchers/value.py +0 -0
  59. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/cli.py +0 -0
  60. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/config/company_list/ticker_index_industry_map.json +0 -0
  61. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/config/company_list/tw.json +0 -0
  62. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/config/company_list/us.json +0 -0
  63. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/config/company_list/us_TradingView_list.json +0 -0
  64. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/config/tej_db/tej_db_index.yaml +0 -0
  65. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/config/tej_db/tej_db_percent_index.yaml +0 -0
  66. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/config/tej_db/tej_db_skip_index.yaml +0 -0
  67. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/config/tej_db/tej_db_thousand_index.yaml +0 -0
  68. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/config/twse/balance_sheet.yaml +0 -0
  69. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/config/twse/cash_flow_percentage.yaml +0 -0
  70. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/config/twse/finance_overview_dict.yaml +0 -0
  71. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/config/twse/profit_lose.yaml +0 -0
  72. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/config/twse/seasonal_data_field_dict.txt +0 -0
  73. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/fetchers/__init__.py +0 -0
  74. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/fetchers/balance_sheet.py +0 -0
  75. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/fetchers/base.py +0 -0
  76. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/fetchers/cash_flow.py +0 -0
  77. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/fetchers/finance_overview.py +0 -0
  78. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/fetchers/institution.py +0 -0
  79. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/fetchers/margin_trading.py +0 -0
  80. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/fetchers/month_revenue.py +0 -0
  81. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/fetchers/profit_lose.py +0 -0
  82. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/fetchers/tech.py +0 -0
  83. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/fetchers/tej_finance_report.py +0 -0
  84. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/fetchers/value_invest.py +0 -0
  85. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/main.py +0 -0
  86. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/__init__.py +0 -0
  87. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/balance_sheet/__init__.py +0 -0
  88. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/balance_sheet/base.py +0 -0
  89. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/cash_flow/__init__.py +0 -0
  90. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/cash_flow/base.py +0 -0
  91. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/cash_flow/us.py +0 -0
  92. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/daily_chip/__init__.py +0 -0
  93. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/daily_chip/base.py +0 -0
  94. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/daily_chip/tej.py +0 -0
  95. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/daily_chip/utils/__init__.py +0 -0
  96. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/daily_chip/utils/institution.py +0 -0
  97. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/daily_chip/utils/margin_trading.py +0 -0
  98. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/daily_chip/utils/security_lending.py +0 -0
  99. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/daily_tech/__init__.py +0 -0
  100. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/daily_tech/base.py +0 -0
  101. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/daily_tech/tech.py +0 -0
  102. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/daily_tech/utils/__init__.py +0 -0
  103. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/daily_tech/utils/processor.py +0 -0
  104. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/finance_overview/__init__.py +0 -0
  105. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/finance_overview/agent_overview.py +0 -0
  106. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/finance_overview/base.py +0 -0
  107. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/month_revenue/__init__.py +0 -0
  108. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/month_revenue/base.py +0 -0
  109. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/profit_lose/__init__.py +0 -0
  110. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/profit_lose/base.py +0 -0
  111. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/tej/__init__.py +0 -0
  112. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/tej/base.py +0 -0
  113. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/value/__init__.py +0 -0
  114. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/value/base.py +0 -0
  115. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/transformers/value/tej.py +0 -0
  116. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/utils/__init__.py +0 -0
  117. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/utils/calculate_value.py +0 -0
  118. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/utils/data_process.py +0 -0
  119. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/utils/datetime.py +0 -0
  120. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/utils/db_client.py +0 -0
  121. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/utils/exception.py +0 -0
  122. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API/utils/logger.py +0 -0
  123. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API.egg-info/SOURCES.txt +0 -0
  124. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API.egg-info/dependency_links.txt +0 -0
  125. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API.egg-info/requires.txt +0 -0
  126. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/neurostats_API.egg-info/top_level.txt +0 -0
  127. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/setup.cfg +0 -0
  128. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/test/test_async_fetcher.py +0 -0
  129. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/test/test_fetchers.py +0 -0
  130. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc5}/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.0rc3
3
+ Version: 1.0.0rc5
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.0rc5
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.0rc2
57
+ 1.0.0rc5
58
58
  ```
59
59
 
60
60
  ### 下載舊版
@@ -0,0 +1,29 @@
1
+ __version__='1.0.0rc5'
2
+
3
+ from .fetchers import (
4
+ AgentFinanceOverviewFetcher,
5
+ BalanceSheetFetcher,
6
+ CashFlowFetcher,
7
+ FinanceOverviewFetcher,
8
+ FinanceReportFetcher,
9
+ InstitutionFetcher,
10
+ MarginTradingFetcher,
11
+ MonthRevenueFetcher,
12
+ TechFetcher,
13
+ TEJStockPriceFetcher,
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
29
+ )
@@ -157,7 +157,7 @@ class AsyncTechFetcher(AsyncBaseFetcher):
157
157
  start_date, end_date
158
158
  )
159
159
 
160
- if (len(fetched_data) > 0):
160
+ if (fetched_data):
161
161
  df = pd.DataFrame(fetched_data)
162
162
  return df
163
163
  else:
@@ -171,7 +171,7 @@ class AsyncTechFetcher(AsyncBaseFetcher):
171
171
  start_date, end_date
172
172
  )
173
173
 
174
- if (len(fetched_data) > 0):
174
+ if (fetched_data):
175
175
  df = pd.DataFrame(fetched_data)
176
176
  df = df.rename(
177
177
  columns={
@@ -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
-
@@ -1,24 +1,32 @@
1
1
  from .base import BaseBalanceSheetTransformer
2
2
  from neurostats_API.utils import StatsProcessor
3
3
 
4
+
4
5
  class USBalanceSheetTransformer(BaseBalanceSheetTransformer):
5
- def __init__(self, ticker, company_name, zone):
6
+
7
+ def __init__(self, ticker, company_name, zone):
6
8
  super().__init__(ticker, company_name, zone)
7
9
 
8
10
  self.data_df = None
9
-
11
+ self.return_keys = [
12
+ 'balance_sheet',
13
+ 'balance_sheet_YoY'
14
+ ]
15
+
10
16
  def process_transform(self, fetched_data):
11
- return_dict = {
12
- "ticker": self.ticker,
13
- "company_name": self.company_name
14
- }
17
+ if (not fetched_data):
18
+ return self._get_empty_structure()
19
+
20
+ return_dict = {"ticker": self.ticker, "company_name": self.company_name}
15
21
 
16
22
  # QoQ表格
17
23
  self.data_df = self._process_us_format(fetched_data)
18
-
24
+
19
25
  # YoY表格
20
26
  target_season = fetched_data[0]['season']
21
- total_table_YoY = self._slice_target_season(self.data_df.T, target_season)
27
+ total_table_YoY = self._slice_target_season(
28
+ self.data_df.T, target_season
29
+ )
22
30
 
23
31
  return_dict.update(
24
32
  {
@@ -27,4 +35,4 @@ class USBalanceSheetTransformer(BaseBalanceSheetTransformer):
27
35
  }
28
36
  )
29
37
 
30
- return return_dict
38
+ return return_dict
@@ -0,0 +1,158 @@
1
+ import abc
2
+ from neurostats_API.utils import StatsProcessor, YoY_Calculator
3
+ import pandas as pd
4
+
5
+
6
+ class BaseTransformer(abc.ABC):
7
+ """
8
+ Transformer用途: 轉換資料為fetcher可使用的格式
9
+ """
10
+
11
+ def __init__(self, ticker, company_name, zone):
12
+ self.ticker = ticker
13
+ self.company_name = company_name
14
+
15
+ self.zone = zone
16
+ self.return_keys = []
17
+
18
+ @abc.abstractmethod
19
+ def process_transform(self):
20
+ pass
21
+
22
+ @classmethod
23
+ def flatten_dict(cls, value_dict, target_keys):
24
+ indexes = value_dict.keys()
25
+ new_dict = {}
26
+
27
+ for key in indexes:
28
+ new_dict.update(
29
+ {
30
+ f"{key}_{sub_key}": value_dict[key].get(sub_key, None)
31
+ for sub_key in target_keys
32
+ }
33
+ )
34
+
35
+ return new_dict
36
+
37
+ @staticmethod
38
+ def _process_unit(data_df, postfix):
39
+
40
+ lambda_map = {
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
57
+ }
58
+
59
+ process_fn = lambda_map.get(postfix)
60
+ postfix_cols = data_df.columns.str.endswith(postfix)
61
+ postfix_cols = data_df.loc[:, postfix_cols].columns
62
+
63
+ if (postfix == "_value"):
64
+ postfix_cols = [
65
+ col for col in postfix_cols
66
+ if not ("eps" in col or "每股盈餘" in col)
67
+ ]
68
+
69
+ if (postfix == '_growth'):
70
+ data_df[postfix_cols] = data_df[postfix_cols].map(
71
+ lambda x: x * 100.0 if isinstance(x, float) else x
72
+ )
73
+
74
+ data_df[postfix_cols] = (data_df[postfix_cols].map(process_fn))
75
+
76
+ return data_df
77
+
78
+ def _apply_process_unit_pipeline(
79
+ self, data_df, postfix_list=["_value", "percentage"]
80
+ ):
81
+ for postfix in postfix_list:
82
+ data_df = self._process_unit(data_df, postfix)
83
+ return data_df
84
+
85
+ @staticmethod
86
+ def _slice_target_season(stats_df, target_season):
87
+ target_season_columns = stats_df.columns.str.endswith(
88
+ f"Q{target_season}"
89
+ )
90
+ stats_df = stats_df.loc[:, target_season_columns]
91
+
92
+ return stats_df
93
+
94
+ def _get_empty_structure(self):
95
+ return_dict = {
96
+ "warning": "No data fetched",
97
+ "ticker": self.ticker,
98
+ "company_name": self.company_name
99
+ }
100
+
101
+ return_dict.update(
102
+ {
103
+ key: pd.DataFrame(columns=pd.Index([], name='index'))
104
+ for key in self.return_keys
105
+ }
106
+ )
107
+ return return_dict
108
+
109
+ def _process_value(self, value):
110
+ if isinstance(value, str) and "%" in value:
111
+ value = value.replace("%", "")
112
+ try:
113
+ return float(value)
114
+ except (ValueError, TypeError):
115
+ return None
116
+
117
+ def _calculate_growth(self, this_value, last_value, delta):
118
+ try:
119
+ return YoY_Calculator.cal_growth(
120
+ this_value, last_value, delta
121
+ ) * 100
122
+ except Exception:
123
+ return None
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)
@@ -35,7 +35,7 @@ class TWSEChipTransformer(BaseChipTransformer):
35
35
 
36
36
  tech_dict = {data['date']: data for data in tech_data}
37
37
  latest_tech = tech_data[-1]
38
- if (len(fetched_data) < 1):
38
+ if (not fetched_data):
39
39
  return_dict['latest_trading'].update(
40
40
  self._process_latest({}, latest_tech, key)
41
41
  )
@@ -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:
@@ -1,4 +1,5 @@
1
1
  from .base import BaseMonthRevenueTransformer
2
+ from datetime import datetime
2
3
  from neurostats_API.utils import StatsProcessor, YoY_Calculator
3
4
  import pandas as pd
4
5
 
@@ -8,6 +9,8 @@ class TWSEMonthlyRevenueTransformer(BaseMonthRevenueTransformer):
8
9
 
9
10
  self.data_df = None
10
11
  def process_transform(self, fetched_data):
12
+ if (not fetched_data):
13
+ return self._get_empty_structure()
11
14
  self.data_df = self._process_data(fetched_data)
12
15
  target_month = fetched_data[0]['month']
13
16
 
@@ -97,10 +100,12 @@ class TWSEMonthlyRevenueTransformer(BaseMonthRevenueTransformer):
97
100
  return df[df['date'] != "0/0"].set_index('date').T
98
101
 
99
102
 
100
- def _get_empty_structure(self, target_year, target_month):
103
+ def _get_empty_structure(self):
101
104
  """
102
105
  Exception 發生時回傳
103
106
  """
107
+ target_date = datetime.today()
108
+ target_year, target_month = target_date.year, target_date.month
104
109
  recent_date = [f"{target_year}/{target_month}"]
105
110
  for _ in range(11):
106
111
  target_year, target_month = (target_year - 1, 12) if target_month == 1 else (target_year, target_month - 1)
@@ -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
 
@@ -6,6 +6,7 @@ class USProfitLoseTransformer(BaseProfitLoseTransformer):
6
6
  def __init__(self, ticker, company_name, zone):
7
7
  super().__init__(ticker, company_name, zone)
8
8
  self.data_df = None
9
+ self.return_keys = ['profit_lose']
9
10
 
10
11
  def process_transform(self, fetched_data):
11
12
 
@@ -35,7 +35,7 @@ class TEJFinanceStatementTransformer(BaseTEJTransformer):
35
35
  use_cal=True,
36
36
  indexes=None
37
37
  ):
38
- if (len(fetched_data) == 0):
38
+ if (not fetched_data):
39
39
  raise NoDataError(f"No data found in collection: TEJ_finance_statement, ticker={self.ticker}")
40
40
 
41
41
  target_season = fetched_data[-1]['season']
@@ -35,7 +35,7 @@ class TWSEHistoryValueTransformer(TWSEValueTransformer):
35
35
  return return_dict
36
36
 
37
37
  def process_latest(self, daily_data):
38
- if len(daily_data) < 1:
38
+ if (not daily_data):
39
39
  return self._get_empty_structure()
40
40
 
41
41
  daily_data = daily_data[-1]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: neurostats_API
3
- Version: 1.0.0rc3
3
+ Version: 1.0.0rc5
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.0rc5
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.0rc3',
5
+ version='1.0.0rc5',
6
6
  long_description=open('README.md', 'r', encoding='utf-8').read(),
7
7
  long_description_content_type='text/markdown',
8
8
  install_requires=[
@@ -1,15 +0,0 @@
1
- __version__='1.0.0rc3'
2
-
3
- from .fetchers import (
4
- AgentFinanceOverviewFetcher,
5
- BalanceSheetFetcher,
6
- CashFlowFetcher,
7
- FinanceOverviewFetcher,
8
- FinanceReportFetcher,
9
- InstitutionFetcher,
10
- MarginTradingFetcher,
11
- MonthRevenueFetcher,
12
- TechFetcher,
13
- TEJStockPriceFetcher,
14
- ProfitLoseFetcher,
15
- )
@@ -1,110 +0,0 @@
1
- import abc
2
- from neurostats_API.utils import StatsProcessor, YoY_Calculator
3
- import pandas as pd
4
-
5
- class BaseTransformer(abc.ABC):
6
- """
7
- Transformer用途: 轉換資料為fetcher可使用的格式
8
- """
9
- def __init__(self, ticker, company_name, zone):
10
- self.ticker = ticker
11
- self.company_name = company_name
12
-
13
- self.zone = zone
14
- self.return_keys = []
15
-
16
-
17
- @abc.abstractmethod
18
- def process_transform(self):
19
- pass
20
-
21
- @classmethod
22
- def flatten_dict(cls, value_dict, target_keys):
23
- indexes = value_dict.keys()
24
- new_dict = {}
25
-
26
-
27
- for key in indexes:
28
- new_dict.update(
29
- {
30
- f"{key}_{sub_key}": value_dict[key].get(sub_key, None)
31
- for sub_key in target_keys
32
- }
33
- )
34
- return new_dict
35
-
36
- @staticmethod
37
- def _process_unit(data_df, postfix):
38
-
39
- 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
47
- }
48
-
49
- process_fn = lambda_map.get(postfix)
50
- postfix_cols = data_df.columns.str.endswith(postfix)
51
- postfix_cols = data_df.loc[:, postfix_cols].columns
52
-
53
- if (postfix == "_value"):
54
- postfix_cols = [col for col in postfix_cols if not ("eps" in col or "每股盈餘" in col)]
55
-
56
- 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
59
- )
60
-
61
- data_df[postfix_cols] = (
62
- data_df[postfix_cols].map(
63
- process_fn
64
- )
65
- )
66
-
67
- return data_df
68
-
69
- def _apply_process_unit_pipeline(self, data_df, postfix_list = ["_value", "percentage"]):
70
- for postfix in postfix_list:
71
- data_df = self._process_unit(data_df, postfix)
72
- return data_df
73
-
74
- @staticmethod
75
- def _slice_target_season(stats_df, target_season):
76
- target_season_columns = stats_df.columns.str.endswith(f"Q{target_season}")
77
- stats_df = stats_df.loc[:, target_season_columns]
78
-
79
- return stats_df
80
-
81
- def _get_empty_structure(self):
82
- return_dict = {
83
- "warning": "No data fetched",
84
- "ticker": self.ticker,
85
- "company_name": self.company_name
86
- }
87
-
88
- return_dict.update(
89
- {
90
- key: pd.DataFrame(columns= pd.Index([], name = 'date')) for key in self.return_keys
91
- }
92
- )
93
- return return_dict
94
-
95
- def _process_value(self, value):
96
- if isinstance(value, str) and "%" in value:
97
- value = value.replace("%", "")
98
- try:
99
- return float(value)
100
- except (ValueError, TypeError):
101
- return None
102
-
103
- def _calculate_growth(self, this_value, last_value, delta):
104
- try:
105
- return YoY_Calculator.cal_growth(
106
- this_value, last_value, delta
107
- ) * 100
108
- except Exception:
109
- return None
110
-