neurostats-API 1.0.0rc3__tar.gz → 1.0.0rc4__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.0rc4}/PKG-INFO +2 -2
  2. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/README.md +1 -1
  3. neurostats_api-1.0.0rc4/neurostats_API/__init__.py +29 -0
  4. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/balance_sheet/twse.py +23 -18
  5. neurostats_api-1.0.0rc4/neurostats_API/transformers/base.py +158 -0
  6. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/cash_flow/twse.py +2 -0
  7. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/finance_overview/stats_overview.py +19 -4
  8. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/profit_lose/twse.py +1 -1
  9. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API.egg-info/PKG-INFO +2 -2
  10. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/setup.py +1 -1
  11. neurostats_api-1.0.0rc3/neurostats_API/__init__.py +0 -15
  12. neurostats_api-1.0.0rc3/neurostats_API/transformers/base.py +0 -110
  13. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/MANIFEST.in +0 -0
  14. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/__init__.py +0 -0
  15. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/db/__init__.py +0 -0
  16. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/db/base.py +0 -0
  17. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/db/tej.py +0 -0
  18. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/db/twse.py +0 -0
  19. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/db/us.py +0 -0
  20. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/db_extractors/__init__.py +0 -0
  21. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/db_extractors/base.py +0 -0
  22. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/db_extractors/daily/__init__.py +0 -0
  23. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/db_extractors/daily/base.py +0 -0
  24. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/db_extractors/daily/tej_chip.py +0 -0
  25. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/db_extractors/daily/tej_tech.py +0 -0
  26. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/db_extractors/daily/twse_chip.py +0 -0
  27. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/db_extractors/daily/value.py +0 -0
  28. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/db_extractors/daily/yf.py +0 -0
  29. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/db_extractors/month_revenue/__init__.py +0 -0
  30. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/db_extractors/month_revenue/base.py +0 -0
  31. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/db_extractors/month_revenue/twse.py +0 -0
  32. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/db_extractors/seasonal/__init__.py +0 -0
  33. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/db_extractors/seasonal/balance_sheet.py +0 -0
  34. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/db_extractors/seasonal/base.py +0 -0
  35. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/db_extractors/seasonal/cashflow.py +0 -0
  36. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/db_extractors/seasonal/profit_lose.py +0 -0
  37. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/db_extractors/seasonal/tej.py +0 -0
  38. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/factory/__init__.py +0 -0
  39. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/factory/extractor_factory.py +0 -0
  40. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/factory/transformer_factory.py +0 -0
  41. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/fetchers/__init__.py +0 -0
  42. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/fetchers/balance_sheet.py +0 -0
  43. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/fetchers/base.py +0 -0
  44. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/fetchers/cash_flow.py +0 -0
  45. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/fetchers/finance_overview.py +0 -0
  46. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/fetchers/month_revenue.py +0 -0
  47. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/fetchers/profit_lose.py +0 -0
  48. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/fetchers/tech.py +0 -0
  49. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/fetchers/tej.py +0 -0
  50. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/fetchers/twse_institution.py +0 -0
  51. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/fetchers/twse_margin.py +0 -0
  52. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/async_mode/fetchers/value.py +0 -0
  53. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/cli.py +0 -0
  54. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/config/company_list/ticker_index_industry_map.json +0 -0
  55. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/config/company_list/tw.json +0 -0
  56. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/config/company_list/us.json +0 -0
  57. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/config/company_list/us_TradingView_list.json +0 -0
  58. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/config/tej_db/tej_db_index.yaml +0 -0
  59. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/config/tej_db/tej_db_percent_index.yaml +0 -0
  60. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/config/tej_db/tej_db_skip_index.yaml +0 -0
  61. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/config/tej_db/tej_db_thousand_index.yaml +0 -0
  62. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/config/twse/balance_sheet.yaml +0 -0
  63. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/config/twse/cash_flow_percentage.yaml +0 -0
  64. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/config/twse/finance_overview_dict.yaml +0 -0
  65. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/config/twse/profit_lose.yaml +0 -0
  66. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/config/twse/seasonal_data_field_dict.txt +0 -0
  67. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/fetchers/__init__.py +0 -0
  68. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/fetchers/balance_sheet.py +0 -0
  69. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/fetchers/base.py +0 -0
  70. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/fetchers/cash_flow.py +0 -0
  71. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/fetchers/finance_overview.py +0 -0
  72. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/fetchers/institution.py +0 -0
  73. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/fetchers/margin_trading.py +0 -0
  74. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/fetchers/month_revenue.py +0 -0
  75. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/fetchers/profit_lose.py +0 -0
  76. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/fetchers/tech.py +0 -0
  77. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/fetchers/tej_finance_report.py +0 -0
  78. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/fetchers/value_invest.py +0 -0
  79. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/main.py +0 -0
  80. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/__init__.py +0 -0
  81. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/balance_sheet/__init__.py +0 -0
  82. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/balance_sheet/base.py +0 -0
  83. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/balance_sheet/us.py +0 -0
  84. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/cash_flow/__init__.py +0 -0
  85. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/cash_flow/base.py +0 -0
  86. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/cash_flow/us.py +0 -0
  87. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/daily_chip/__init__.py +0 -0
  88. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/daily_chip/base.py +0 -0
  89. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/daily_chip/tej.py +0 -0
  90. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/daily_chip/twse_chip.py +0 -0
  91. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/daily_chip/utils/__init__.py +0 -0
  92. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/daily_chip/utils/institution.py +0 -0
  93. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/daily_chip/utils/margin_trading.py +0 -0
  94. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/daily_chip/utils/security_lending.py +0 -0
  95. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/daily_tech/__init__.py +0 -0
  96. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/daily_tech/base.py +0 -0
  97. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/daily_tech/tech.py +0 -0
  98. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/daily_tech/utils/__init__.py +0 -0
  99. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/daily_tech/utils/processor.py +0 -0
  100. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/finance_overview/__init__.py +0 -0
  101. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/finance_overview/agent_overview.py +0 -0
  102. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/finance_overview/base.py +0 -0
  103. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/month_revenue/__init__.py +0 -0
  104. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/month_revenue/base.py +0 -0
  105. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/month_revenue/twse.py +0 -0
  106. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/profit_lose/__init__.py +0 -0
  107. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/profit_lose/base.py +0 -0
  108. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/profit_lose/us.py +0 -0
  109. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/tej/__init__.py +0 -0
  110. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/tej/base.py +0 -0
  111. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/tej/finance_statement.py +0 -0
  112. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/value/__init__.py +0 -0
  113. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/value/base.py +0 -0
  114. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/value/tej.py +0 -0
  115. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/transformers/value/twse.py +0 -0
  116. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/utils/__init__.py +0 -0
  117. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/utils/calculate_value.py +0 -0
  118. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/utils/data_process.py +0 -0
  119. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/utils/datetime.py +0 -0
  120. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/utils/db_client.py +0 -0
  121. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/utils/exception.py +0 -0
  122. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API/utils/logger.py +0 -0
  123. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API.egg-info/SOURCES.txt +0 -0
  124. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API.egg-info/dependency_links.txt +0 -0
  125. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API.egg-info/requires.txt +0 -0
  126. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/neurostats_API.egg-info/top_level.txt +0 -0
  127. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/setup.cfg +0 -0
  128. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/test/test_async_fetcher.py +0 -0
  129. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/test/test_fetchers.py +0 -0
  130. {neurostats_api-1.0.0rc3 → neurostats_api-1.0.0rc4}/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.0rc4
4
4
  Summary: The service of NeuroStats website
5
5
  Home-page: https://github.com/NeurowattStats/NeuroStats_API.git
6
6
  Author: JasonWang@Neurowatt
@@ -71,7 +71,7 @@ pip install neurostats-API
71
71
  ```Python
72
72
  >>> import neurostats_API
73
73
  >>> print(neurostats_API.__version__)
74
- 1.0.0rc2
74
+ 1.0.0rc4
75
75
  ```
76
76
 
77
77
  ### 下載舊版
@@ -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.0rc4
58
58
  ```
59
59
 
60
60
  ### 下載舊版
@@ -0,0 +1,29 @@
1
+ __version__='1.0.0rc4'
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
+ )
@@ -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
-
@@ -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='date'))
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)
@@ -27,12 +27,27 @@ class FinanceOverviewTransformer(BaseFinanceOverviewTransformer):
27
27
  return processed_data_dict
28
28
 
29
29
  def _filter_target_data(self, balance_sheet, profit_lose, cash_flow):
30
+ balance_sheet = balance_sheet[-1]
31
+ cash_flow = cash_flow[-1]
32
+ profit_lose = profit_lose[-1]
33
+ seasons = [
34
+ (int(report['year']), int(report['season']))
35
+ for report in (balance_sheet, profit_lose, cash_flow)
36
+ ]
37
+
38
+ max_date = max(seasons)
39
+ year, season = max_date
40
+
30
41
  data_dict = {
31
- 'balance_sheet': balance_sheet[-1]['balance_sheet'],
32
- 'profit_lose': profit_lose[-1]['profit_lose'],
33
- "cash_flow": cash_flow[-1]['cash_flow']
42
+ 'balance_sheet': balance_sheet['balance_sheet'],
43
+ 'profit_lose': profit_lose['profit_lose'],
44
+ "cash_flow": cash_flow['cash_flow']
34
45
  }
35
- filtered_dict = {}
46
+ filtered_dict = {
47
+ "year": year,
48
+ "season": season
49
+ }
50
+
36
51
 
37
52
  for key, target_sets in self.target_fields.items():
38
53
  try:
@@ -105,7 +105,7 @@ class TWSEProfitLoseTransformer(BaseProfitLoseTransformer):
105
105
  return_dict.update({
106
106
  "profit_lose": stats_main_page_df,
107
107
  "grand_total_profit_lose": stats_grand_total_df,
108
- "profit_lose_all": self.new_df.T,
108
+ "profit_lose_all": self.new_df,
109
109
  "profit_lose_YoY": new_df_YoY
110
110
  })
111
111
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: neurostats_API
3
- Version: 1.0.0rc3
3
+ Version: 1.0.0rc4
4
4
  Summary: The service of NeuroStats website
5
5
  Home-page: https://github.com/NeurowattStats/NeuroStats_API.git
6
6
  Author: JasonWang@Neurowatt
@@ -71,7 +71,7 @@ pip install neurostats-API
71
71
  ```Python
72
72
  >>> import neurostats_API
73
73
  >>> print(neurostats_API.__version__)
74
- 1.0.0rc2
74
+ 1.0.0rc4
75
75
  ```
76
76
 
77
77
  ### 下載舊版
@@ -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.0rc4',
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
-