mns-scheduler 1.0.8.7__py3-none-any.whl → 1.4.3.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. mns_scheduler/__init__.py +1 -3
  2. mns_scheduler/company_info/announce/company_announce_sync_service.py +65 -0
  3. mns_scheduler/company_info/{company_info_sync_api.py → base/sync_company_base_info_api.py} +239 -227
  4. mns_scheduler/company_info/base/sync_company_hold_info_api.py +37 -0
  5. mns_scheduler/company_info/base/sync_company_product_area_industry.py +161 -0
  6. mns_scheduler/company_info/clean/company_info_clean_api.py +133 -0
  7. mns_scheduler/company_info/constant/company_constant_data.py +497 -0
  8. mns_scheduler/company_info/{de_list_stock_service.py → de_list_stock/de_list_stock_service.py} +1 -1
  9. mns_scheduler/company_info/em_stock_info/__init__.py +7 -0
  10. mns_scheduler/company_info/em_stock_info/sync_em_stock_info_sync.py +80 -0
  11. mns_scheduler/company_info/remark/__init__.py +7 -0
  12. mns_scheduler/company_info/remark/company_remark_info_sync.py +46 -0
  13. mns_scheduler/concept/clean/kpl_concept_clean_api.py +1 -1
  14. mns_scheduler/concept/clean/ths_concept_clean_api.py +74 -51
  15. mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py +112 -56
  16. mns_scheduler/concept/ths/common/ths_concept_update_common_api.py +6 -6
  17. mns_scheduler/concept/ths/detaill/__init__.py +0 -0
  18. mns_scheduler/concept/ths/detaill/ths_concept_detail_api.py +226 -0
  19. mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_new_index_api.py +169 -0
  20. mns_scheduler/concept/ths/update_concept_info/sync_one_concept_all_symbols_api.py +11 -23
  21. mns_scheduler/concept/ths/update_concept_info/sync_one_symbol_all_concepts_api.py +19 -15
  22. mns_scheduler/db/col_move_service.py +10 -7
  23. mns_scheduler/db/db_status.py +1 -1
  24. mns_scheduler/db/script/__init__.py +7 -0
  25. mns_scheduler/db/script/col_move_script.py +45 -0
  26. mns_scheduler/db/script/db_move/__init__.py +7 -0
  27. mns_scheduler/db/script/db_move/col_move_one_service.py +34 -0
  28. mns_scheduler/db/script/sync/__init__.py +7 -0
  29. mns_scheduler/db/script/sync/local_mongo_util.py +231 -0
  30. mns_scheduler/db/script/sync/remote_data_sync_to_local.py +105 -0
  31. mns_scheduler/db/script/sync/remote_mongo_util.py +306 -0
  32. mns_scheduler/db/script/sync/sync_hui_ce_test_data.py +80 -0
  33. mns_scheduler/db/script/sync/sync_hui_ce_test_data_01.py +69 -0
  34. mns_scheduler/db/script/update/__init__.py +7 -0
  35. mns_scheduler/db/script/update/update_col_field.py +36 -0
  36. mns_scheduler/finance/__init__.py +1 -1
  37. mns_scheduler/finance/{em_financial_asset_liability_sync_service_api.py → em/em_financial_asset_liability_sync_service_api.py} +3 -3
  38. mns_scheduler/finance/{em_financial_profit_sync_service_api.py → em/em_financial_profit_sync_service_api.py} +30 -25
  39. mns_scheduler/finance/{finance_common_api.py → em/finance_common_api.py} +4 -4
  40. mns_scheduler/finance/sync_financial_report_service_task.py +202 -0
  41. mns_scheduler/finance/xue_qiu/down_load_xueqiu_report_api.py +77 -0
  42. mns_scheduler/finance/xue_qiu/sync_xue_qiu_fiance_data.py +161 -0
  43. mns_scheduler/hk/__init__.py +1 -1
  44. mns_scheduler/hk/hk_company_info_sync_service_api.py +49 -5
  45. mns_scheduler/hk/hk_industry_info_sync_service_api.py +68 -0
  46. mns_scheduler/industry/__init__.py +7 -0
  47. mns_scheduler/industry/ths/__init__.py +7 -0
  48. mns_scheduler/industry/ths/ths_industry_index_service.py +58 -0
  49. mns_scheduler/industry/ths/ths_industry_sync_service.py +68 -0
  50. mns_scheduler/irm/__init__.py +1 -1
  51. mns_scheduler/irm/api/__init__.py +1 -1
  52. mns_scheduler/irm/api/sh_stock_sns_sse_info_api.py +1 -1
  53. mns_scheduler/irm/api/sz_stock_sns_sse_info_api.py +1 -1
  54. mns_scheduler/irm/stock_irm_cninfo_service.py +15 -13
  55. mns_scheduler/k_line/clean/daily/__init__.py +1 -1
  56. mns_scheduler/k_line/clean/daily/daily_k_line_clean_common_service.py +57 -7
  57. mns_scheduler/k_line/clean/daily/daily_k_line_service.py +16 -3
  58. mns_scheduler/k_line/clean/k_line_info_clean_impl.py +3 -2
  59. mns_scheduler/k_line/clean/k_line_info_clean_task.py +42 -31
  60. mns_scheduler/k_line/clean/week_month/__init__.py +1 -1
  61. mns_scheduler/k_line/clean/week_month/normal_week_month_k_line_service.py +125 -27
  62. mns_scheduler/k_line/clean/week_month/sub_new_week_month_k_line_service.py +72 -17
  63. mns_scheduler/k_line/common/__init__.py +7 -0
  64. mns_scheduler/k_line/common/k_line_common_api.py +188 -0
  65. mns_scheduler/k_line/hot_stocks/__init__.py +1 -1
  66. mns_scheduler/k_line/hot_stocks/recent_hot_stocks_clean_service.py +1 -1
  67. mns_scheduler/k_line/month_week_daily/bfq_k_line_sync.py +77 -0
  68. mns_scheduler/k_line/{sync → month_week_daily}/daily_week_month_line_sync.py +14 -14
  69. mns_scheduler/k_line/sync_status/__init__.py +7 -0
  70. mns_scheduler/k_line/sync_status/k_line_sync_status_check.py +54 -0
  71. mns_scheduler/k_line/test/__init__.py +7 -0
  72. mns_scheduler/k_line/test/k_line_info_clean_his_data.py +41 -0
  73. mns_scheduler/k_line/year_quarter/__init__.py +7 -0
  74. mns_scheduler/k_line/year_quarter/year_quarter_line_sync.py +76 -0
  75. mns_scheduler/kpl/selection/symbol/sync_best_choose_symbol.py +4 -2
  76. mns_scheduler/kpl/selection/symbol/sync_kpl_concept_symbol_choose_reason_api.py +108 -0
  77. mns_scheduler/kpl/selection/total/sync_kpl_best_total_sync_api.py +12 -7
  78. mns_scheduler/lhb/__init__.py +1 -1
  79. mns_scheduler/lhb/stock_lhb_sync_service.py +1 -1
  80. mns_scheduler/open/__init__.py +1 -1
  81. mns_scheduler/open/sync_one_day_open_data_to_db_service.py +6 -22
  82. mns_scheduler/risk/__init__.py +1 -1
  83. mns_scheduler/risk/compliance/__init__.py +0 -0
  84. mns_scheduler/risk/compliance/undisclosed_annual_report_api.py +71 -0
  85. mns_scheduler/risk/financial/__init__.py +0 -0
  86. mns_scheduler/risk/financial/annual_report_audit_check_api.py +54 -0
  87. mns_scheduler/risk/financial/net_assets_check_api.py +75 -0
  88. mns_scheduler/risk/financial/profit_income_check_api.py +80 -0
  89. mns_scheduler/risk/financial/stock_equity_mortgage_check_api.py +1 -0
  90. mns_scheduler/risk/financial_report_risk_check_api.py +42 -0
  91. mns_scheduler/risk/major_violations/__init__.py +0 -0
  92. mns_scheduler/risk/{register_and_investigate_stock_sync_api.py → major_violations/register_and_investigate_stock_sync_api.py} +17 -8
  93. mns_scheduler/risk/self/__init__.py +0 -0
  94. mns_scheduler/risk/{wei_pan_stock_api.py → self/wei_pan_stock_api.py} +10 -4
  95. mns_scheduler/risk/test/__init__.py +7 -0
  96. mns_scheduler/{finance → risk}/test/fix_blask_list.py +6 -10
  97. mns_scheduler/risk/transactions/__init__.py +0 -0
  98. mns_scheduler/risk/transactions/transactions_check_api.py +183 -0
  99. mns_scheduler/self_choose/__init__.py +7 -0
  100. mns_scheduler/self_choose/ths_self_choose_service.py +158 -0
  101. mns_scheduler/trade/auto_ipo_buy_api.py +2 -2
  102. mns_scheduler/trade/auto_login/__init__.py +7 -0
  103. mns_scheduler/trade/auto_login/trader_auto_service.py +32 -0
  104. mns_scheduler/trade/auto_sell_service_api.py +10 -8
  105. mns_scheduler/trade/balance/__init__.py +7 -0
  106. mns_scheduler/trade/balance/ths_account_balance_service.py +7 -0
  107. mns_scheduler/trade/sync_position_api.py +41 -8
  108. mns_scheduler/trade/task/__init__.py +7 -0
  109. mns_scheduler/trade/task/trader_task_service.py +65 -0
  110. mns_scheduler/trade/tfp/__init__.py +7 -0
  111. mns_scheduler/trade/tfp/stock_tfp_info_sync.py +56 -0
  112. mns_scheduler/zb/stock_zb_pool_sync.py +1 -15
  113. mns_scheduler/zt/high_chg/sync_high_chg_pool_service.py +2 -3
  114. mns_scheduler/zt/high_chg/sync_high_chg_real_time_quotes_service.py +12 -8
  115. mns_scheduler/zt/open_data/kcx_high_chg_open_data_sync.py +10 -25
  116. mns_scheduler/zt/script/__init__.py +1 -1
  117. mns_scheduler/zt/script/fix_error_deal_day.py +41 -0
  118. mns_scheduler/zt/script/kcx_high_chg_open_his_data_handle.py +2 -11
  119. mns_scheduler/zt/script/sync_high_chg_pool_his_data.py +2 -2
  120. mns_scheduler/zt/script/sync_now_higt_chg_zt.py +43 -0
  121. mns_scheduler/zt/zt_pool/em_zt_pool_sync_api.py +413 -0
  122. mns_scheduler/zt/zt_pool/ths_zt_pool_sync_api.py +193 -0
  123. mns_scheduler/zt/zt_pool/update_null_zt_reason_api.py +58 -0
  124. mns_scheduler/zz_task/compensation/__init__.py +0 -0
  125. mns_scheduler/zz_task/compensation/compensate_task.py +161 -0
  126. mns_scheduler/zz_task/compensation/compensate_task_one_day.py +142 -0
  127. mns_scheduler/zz_task/data_sync_task.py +271 -121
  128. {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.4.3.2.dist-info}/METADATA +1 -1
  129. mns_scheduler-1.4.3.2.dist-info/RECORD +169 -0
  130. {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.4.3.2.dist-info}/WHEEL +1 -1
  131. mns_scheduler/backup/app/ths_new_concept_sync_app.py +0 -122
  132. mns_scheduler/backup/em/em_new_concept_his_sync.py +0 -99
  133. mns_scheduler/backup/em/em_new_concept_sync_common_api.py +0 -139
  134. mns_scheduler/backup/em/em_new_concept_sync_web.py +0 -55
  135. mns_scheduler/backup/wen_cai/wen_cai_concept_sync.py +0 -51
  136. mns_scheduler/big_deal/ths_big_deal_sync.py +0 -98
  137. mns_scheduler/company_info/company_constant_data.py +0 -322
  138. mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_by_ak_api.py +0 -103
  139. mns_scheduler/concept/ths/sync_new_index/sync_ths_new_concept_by_web_api.py +0 -89
  140. mns_scheduler/finance/financial_high_risk_stock_clean_service_api.py +0 -202
  141. mns_scheduler/finance/sync_financial_report_service_api.py +0 -113
  142. mns_scheduler/real_time/realtime_quotes_now_create_db_index.py +0 -27
  143. mns_scheduler/real_time/realtime_quotes_now_sync.py +0 -232
  144. mns_scheduler/risk/stock_equity_mortgage_sync_api.py +0 -32
  145. mns_scheduler/zt/zt_pool/zt_pool_sync_api.py +0 -151
  146. mns_scheduler/zz_task/sync_realtime_quotes_task.py +0 -28
  147. mns_scheduler-1.0.8.7.dist-info/RECORD +0 -112
  148. /mns_scheduler/{backup/app → company_info/announce}/__init__.py +0 -0
  149. /mns_scheduler/{backup/em → company_info/base}/__init__.py +0 -0
  150. /mns_scheduler/{backup/wen_cai → company_info/clean}/__init__.py +0 -0
  151. /mns_scheduler/{big_deal → company_info/constant}/__init__.py +0 -0
  152. /mns_scheduler/{real_time → company_info/de_list_stock}/__init__.py +0 -0
  153. /mns_scheduler/{backup → finance/em}/__init__.py +0 -0
  154. /mns_scheduler/finance/{test → xue_qiu}/__init__.py +0 -0
  155. /mns_scheduler/k_line/{sync → month_week_daily}/__init__.py +0 -0
  156. {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.4.3.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,226 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 17
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
8
+ import mns_common.component.concept.ths_concept_common_service_api as ths_concept_common_service_api
9
+ import mns_common.component.common_service_fun_api as common_service_fun_api
10
+ import mns_common.api.ths.concept.app.ths_concept_detail_app as ths_concept_detail_app
11
+ import mns_common.api.ths.wen_cai.ths_wen_cai_api as ths_wen_cai_api
12
+ import mns_common.component.em.em_stock_info_api as em_stock_info_api
13
+ import mns_common.component.company.company_common_service_new_api as company_common_service_new_api
14
+ import mns_common.api.ths.concept.web.ths_concept_detail_web as ths_concept_detail_web
15
+ import math
16
+ from loguru import logger
17
+ import pandas as pd
18
+ import mns_common.utils.data_frame_util as data_frame_util
19
+ import time
20
+ from datetime import datetime
21
+ import mns_scheduler.concept.ths.common.ths_concept_sync_common_api as ths_concept_sync_common_api
22
+ import mns_common.component.redis_msg.redis_msg_publish_service as redis_msg_publish_service
23
+ import mns_common.constant.redis_msg_constant as redis_msg_constant
24
+
25
+
26
+ def get_ths_concept_detail(concept_code, concept_name):
27
+ real_time_quotes_all_stocks = em_stock_info_api.get_a_stock_info()
28
+ # 1 通过入选理获取概念组成股票详情
29
+ ths_concept_detail_by_explain = get_ths_concept_detail_by_explain(concept_code, real_time_quotes_all_stocks)
30
+ # 2 app 分享链接获取概念组成详情
31
+ ths_concept_detail_from_app = get_ths_concept_detail_from_app(concept_code, real_time_quotes_all_stocks)
32
+ # 3 通过问财
33
+ if concept_name is None or data_frame_util.is_string_empty(concept_name):
34
+ ths_concept_list = ths_concept_common_service_api.get_all_ths_concept()
35
+ ths_concept_one_df = ths_concept_list.loc[
36
+ (ths_concept_list['symbol'] == int(concept_code))
37
+ | (ths_concept_list['web_concept_code'] == int(concept_code))]
38
+ if data_frame_util.is_not_empty(ths_concept_one_df):
39
+ concept_name = list(ths_concept_one_df['name'])[0]
40
+ # if data_frame_util.is_string_not_empty(concept_name) and concept_name is not None:
41
+ # concept_detail_by_wen_cai_df = get_ths_concept_detail_by_wen_cai(concept_name, real_time_quotes_all_stocks)
42
+ # else:
43
+ concept_detail_by_wen_cai_df = None
44
+ # 4 通过web端
45
+ ths_concept_detail_from_web_df = get_ths_concept_detail_from_web(concept_code, real_time_quotes_all_stocks)
46
+ # 判断是否都为空
47
+ all_are_none = all(
48
+ df is None for df in [ths_concept_detail_by_explain, ths_concept_detail_from_app,
49
+ concept_detail_by_wen_cai_df, ths_concept_detail_from_web_df])
50
+ if all_are_none:
51
+ return None
52
+ result_df = pd.concat([ths_concept_detail_by_explain, ths_concept_detail_from_app,
53
+ concept_detail_by_wen_cai_df, ths_concept_detail_from_web_df])
54
+
55
+ result_df.drop_duplicates('symbol', keep='last', inplace=True)
56
+ if data_frame_util.is_not_empty(ths_concept_detail_by_explain):
57
+ ths_concept_detail_by_explain_new = ths_concept_detail_by_explain.loc[
58
+ ths_concept_detail_by_explain['symbol'].isin(result_df['symbol'])]
59
+
60
+ not_in_ths_concept_detail_by_explain = result_df.loc[~(
61
+ result_df['symbol'].isin(ths_concept_detail_by_explain['symbol']))]
62
+ result_df = pd.concat([ths_concept_detail_by_explain_new, not_in_ths_concept_detail_by_explain])
63
+ result_df['concept_code'] = concept_code
64
+ result_df['change'] = 0
65
+ result_df['index'] = 0
66
+ return result_df
67
+
68
+
69
+ # 通过入选理获取概念组成股票详情
70
+ def get_ths_concept_detail_by_explain(concept_code, real_time_quotes_all_stocks):
71
+ page_size = 800
72
+
73
+ de_list_symbols = company_common_service_new_api.get_de_list_company()
74
+ real_time_quotes_all_stocks = real_time_quotes_all_stocks.loc[
75
+ ~(real_time_quotes_all_stocks['symbol'].isin(de_list_symbols))]
76
+
77
+ max_page_number = math.ceil(real_time_quotes_all_stocks.shape[0] / page_size)
78
+ page = 0
79
+
80
+ result_df = None
81
+
82
+ while page < max_page_number:
83
+ try:
84
+
85
+ begin_index = page * page_size
86
+ end_index = (page + 1) * page_size
87
+ page_df = real_time_quotes_all_stocks.iloc[begin_index: end_index]
88
+ code_list = ','.join(page_df['symbol'].astype(str))
89
+ all_ths_concept_detail = ths_concept_detail_app.get_concept_explain(concept_code, code_list)
90
+ if data_frame_util.is_empty(result_df) and data_frame_util.is_not_empty(all_ths_concept_detail):
91
+ result_df = all_ths_concept_detail
92
+ elif data_frame_util.is_not_empty(result_df) and data_frame_util.is_not_empty(all_ths_concept_detail):
93
+ result_df = pd.concat([all_ths_concept_detail, result_df])
94
+ except BaseException as e:
95
+ logger.error("通过ths概念入选理由列表获取详情异常:{},{}", concept_code, e)
96
+ page = page + 1
97
+ if data_frame_util.is_not_empty(result_df):
98
+ result_df = result_df[result_df['explain'].astype(str).str.len() > 0]
99
+ if data_frame_util.is_not_empty(result_df):
100
+ result_df = result_df.rename(columns={
101
+ "stockCode": "symbol",
102
+ "explain": "long"})
103
+ result_df = merge_data_common_fun(result_df, real_time_quotes_all_stocks)
104
+ return result_df
105
+ else:
106
+ return None
107
+
108
+
109
+ # 通过分享链接获取
110
+ def get_ths_concept_detail_from_app(concept_code, real_time_quotes_all_stocks):
111
+ ths_concept_detail_from_app = ths_concept_detail_app.get_ths_concept_detail_by_app(concept_code)
112
+ if data_frame_util.is_not_empty(ths_concept_detail_from_app):
113
+ ths_concept_detail_from_app['long'] = ''
114
+ ths_concept_detail_from_app = ths_concept_detail_from_app[[
115
+ 'symbol',
116
+ 'long'
117
+ ]]
118
+ ths_concept_detail_from_app = merge_data_common_fun(ths_concept_detail_from_app,
119
+ real_time_quotes_all_stocks)
120
+ return ths_concept_detail_from_app
121
+
122
+ else:
123
+ return None
124
+
125
+
126
+ # 3 通过问财
127
+ def get_ths_concept_detail_by_wen_cai(concept_name, real_time_quotes_all_stocks):
128
+ concept_detail_by_wen_cai_df = ths_wen_cai_api.get_concept_detail_by_wen_cai(concept_name)
129
+ if data_frame_util.is_not_empty(concept_detail_by_wen_cai_df):
130
+ concept_detail_by_wen_cai_df = concept_detail_by_wen_cai_df[[
131
+ 'symbol',
132
+ 'explain'
133
+ ]]
134
+
135
+ concept_detail_by_wen_cai_df = concept_detail_by_wen_cai_df.rename(columns={
136
+ "explain": "long"})
137
+ concept_detail_by_wen_cai_df = merge_data_common_fun(concept_detail_by_wen_cai_df,
138
+ real_time_quotes_all_stocks)
139
+
140
+ return concept_detail_by_wen_cai_df
141
+
142
+
143
+ # 通过web端 最近不可用
144
+ def get_ths_concept_detail_from_web(concept_code, real_time_quotes_all_stocks):
145
+ ths_concept_detail_from_web_df = ths_concept_detail_web.stock_board_cons_ths(concept_code)
146
+ if data_frame_util.is_not_empty(ths_concept_detail_from_web_df):
147
+ ths_concept_detail_from_web_df = ths_concept_detail_from_web_df[[
148
+ 'symbol'
149
+ ]]
150
+ ths_concept_detail_from_web_df['long'] = ''
151
+
152
+ ths_concept_detail_from_web_df = merge_data_common_fun(ths_concept_detail_from_web_df,
153
+ real_time_quotes_all_stocks)
154
+
155
+ return ths_concept_detail_from_web_df
156
+
157
+
158
+ def merge_data_common_fun(result_df, real_time_quotes_all_stocks):
159
+ real_time_quotes_ths_detail = real_time_quotes_all_stocks.loc[
160
+ real_time_quotes_all_stocks['symbol'].isin(result_df['symbol'])]
161
+ real_time_quotes_ths_detail = common_service_fun_api.total_mv_classification(real_time_quotes_ths_detail)
162
+ real_time_quotes_ths_detail = real_time_quotes_ths_detail[[
163
+ "symbol",
164
+ "name",
165
+ "now_price",
166
+ "chg",
167
+ "exchange",
168
+ "amount",
169
+ "flow_mv_sp",
170
+ "total_mv_sp"]]
171
+
172
+ query_field = {
173
+ "concept_name": 1,
174
+ "concept_code": 1,
175
+ "company_type": 1,
176
+ "concept_create_day": 1,
177
+ "first_relevance_industry": 1,
178
+ "second_relevance_industry": 1,
179
+ "industry": 1
180
+ }
181
+ query_field_key = str(query_field)
182
+ query_key = str({})
183
+ company_df = company_common_service_new_api.get_company_info_by_field(query_key, query_field_key)
184
+ company_ths_df = company_df.loc[company_df['_id'].isin(result_df['symbol'])]
185
+
186
+ result_df['short'] = result_df['long']
187
+ result_df = result_df.set_index(['symbol'], drop=True)
188
+ company_ths_df = company_ths_df.set_index(['_id'], drop=True)
189
+ real_time_quotes_ths_detail = real_time_quotes_ths_detail.set_index(['symbol'], drop=False)
190
+ result_df = pd.merge(real_time_quotes_ths_detail, result_df,
191
+ how='outer',
192
+ left_index=True, right_index=True)
193
+ result_df = pd.merge(result_df, company_ths_df,
194
+ how='outer',
195
+ left_index=True, right_index=True)
196
+ return result_df
197
+
198
+
199
+ # 同步概念详情到db
200
+ def sync_ths_concept_detail_to_db(concept_code, concept_name):
201
+ new_concept_symbol_detail_df = get_ths_concept_detail(concept_code, concept_name)
202
+ if data_frame_util.is_empty(new_concept_symbol_detail_df):
203
+ time.sleep(10)
204
+ return None
205
+ now_date = datetime.now()
206
+ str_now_time = now_date.strftime('%Y-%m-%d %H:%M:%S')
207
+ time.sleep(1)
208
+ str_day = now_date.strftime('%Y-%m-%d')
209
+ new_concept_symbol_detail_df.loc[:, 'way'] = 'index_sync'
210
+ ths_concept_sync_common_api.save_ths_concept_detail(new_concept_symbol_detail_df,
211
+ concept_name,
212
+ str_day,
213
+ str_now_time, concept_code)
214
+
215
+ # 项目之前推送消息
216
+ redis_msg_publish_service.send_redis_msg(redis_msg_constant.THS_CONCEPT_MSG_TOPIC,
217
+ redis_msg_constant.THS_NEW_CONCEPT_ADD_MSG)
218
+
219
+
220
+ if __name__ == '__main__':
221
+ sync_ths_concept_detail_to_db('886090', '智谱AI')
222
+ # real_time_quotes_all_stocks_df = east_money_stock_api.get_real_time_quotes_all_stocks()
223
+ # get_ths_concept_detail_by_explain('886084', real_time_quotes_all_stocks_df)
224
+ # get_ths_concept_detail_from_web('886084', real_time_quotes_all_stocks_df)
225
+ # get_ths_concept_detail('886084', '光纤概念')
226
+ # get_ths_concept_detail_by_wen_cai('光纤概念', real_time_quotes_all_stocks_df)
@@ -0,0 +1,169 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 17
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
8
+ import mns_common.api.ths.concept.app.ths_concept_index_app as ths_concept_index_app
9
+ import mns_scheduler.concept.ths.common.ths_concept_sync_common_api as ths_concept_sync_common_api
10
+ import mns_common.utils.data_frame_util as data_frame_util
11
+ from loguru import logger
12
+ import mns_common.api.ths.concept.web.ths_concept_index_web as ths_concept_index_web
13
+ from mns_common.db.MongodbUtil import MongodbUtil
14
+ from datetime import datetime
15
+ import mns_scheduler.concept.clean.ths_concept_clean_api as ths_concept_clean_api
16
+ import pandas as pd
17
+ import mns_scheduler.concept.ths.detaill.ths_concept_detail_api as ths_concept_detail_api
18
+ import mns_common.constant.db_name_constant as db_name_constant
19
+ import mns_common.component.redis_msg.redis_msg_publish_service as redis_msg_publish_service
20
+ import mns_common.constant.redis_msg_constant as redis_msg_constant
21
+
22
+ mongodb_util = MongodbUtil('27017')
23
+ import mns_common.component.concept.ths_concept_common_service_api as ths_concept_common_service_api
24
+
25
+
26
+ def sync_ths_concept_new_index():
27
+ # 同步ths新概念 通过app搜索
28
+ sync_ths_concept_new_index_from_app()
29
+ # 通过ths详情搜索
30
+ sync_ths_concept_new_index_from_detail()
31
+
32
+
33
+ '''
34
+ 同步ths新概念 通过app搜索代码
35
+ '''
36
+
37
+
38
+ def sync_ths_concept_new_index_from_app():
39
+ # 当前最大概念代码
40
+ max_concept_code = int(ths_concept_sync_common_api.get_max_concept_code())
41
+ # 最大概念代码上限
42
+ max_concept_code_limit = max_concept_code + 2
43
+ # 同花顺概念列表
44
+ ths_concept_list_exist = ths_concept_common_service_api.get_all_ths_concept()
45
+ # 同步向上3次
46
+ while max_concept_code <= max_concept_code_limit:
47
+ try:
48
+ max_concept_code = max_concept_code + 1
49
+ concept_new_index_df = ths_concept_index_app.get_new_concept_from_app_search(max_concept_code)
50
+ if data_frame_util.is_empty(concept_new_index_df):
51
+ continue
52
+ concept_name = list(concept_new_index_df['concept_name'])[0]
53
+
54
+ if data_frame_util.is_string_empty(concept_name):
55
+ concept_name = ths_concept_index_web.get_concept_name(max_concept_code)
56
+
57
+ exist_concept_df_one = ths_concept_list_exist.loc[
58
+ (ths_concept_list_exist['symbol'] == max_concept_code)
59
+ | (ths_concept_list_exist['web_concept_code'] == max_concept_code)]
60
+ now_date = datetime.now()
61
+ str_now_time = now_date.strftime('%Y-%m-%d %H:%M:%S')
62
+ str_day = now_date.strftime('%Y-%m-%d')
63
+ if data_frame_util.is_empty(exist_concept_df_one):
64
+ concept_code = max_concept_code
65
+
66
+ url = 'http://q.10jqka.com.cn/thshy/detail/code/' + str(concept_code)
67
+ new_concept_one = {
68
+ '_id': int(concept_code),
69
+ 'symbol': int(concept_code),
70
+ 'name': concept_name,
71
+ 'url': url,
72
+ 'str_day': str_day,
73
+ 'success': True,
74
+ 'str_now_time': str_now_time,
75
+ 'web_concept_code': concept_code,
76
+ 'web_concept_url': url,
77
+ 'valid': True,
78
+ 'grade': 1,
79
+ 'remark': ''
80
+ }
81
+ diff_one_df = pd.DataFrame(new_concept_one, index=[1])
82
+ # 保存新增概念信息
83
+ mongodb_util.save_mongo(diff_one_df, db_name_constant.THS_CONCEPT_LIST)
84
+ # 新增概念信息处理 推送到微信
85
+ ths_concept_sync_common_api.push_msg_to_we_chat_and_redis(concept_code, concept_name,
86
+ url)
87
+ # 同步概念详情到db
88
+ ths_concept_detail_api.sync_ths_concept_detail_to_db(concept_code, concept_name)
89
+ # 更新ths概念统计信息
90
+ ths_concept_clean_api.update_ths_concept_info()
91
+
92
+ logger.info("新增同花顺新概念:{}", concept_name)
93
+
94
+ except BaseException as e:
95
+ logger.error("同步新增概念代码:{},信息异常:{}", max_concept_code, e)
96
+
97
+
98
+ '''
99
+ 同步新概念 by ths detail 通过详情判断
100
+ '''
101
+
102
+
103
+ def sync_ths_concept_new_index_from_detail():
104
+ # 当前最大概念代码
105
+ max_concept_code = ths_concept_sync_common_api.get_max_concept_code()
106
+ # 最大概念代码上线
107
+ max_concept_code_limit = max_concept_code + 2
108
+ # 同花顺概念列表
109
+ ths_concept_list_exist = mongodb_util.find_all_data(db_name_constant.THS_CONCEPT_LIST)
110
+ # 同步向上3次
111
+ while max_concept_code <= max_concept_code_limit:
112
+ try:
113
+ max_concept_code = max_concept_code + 1
114
+ concept_code = max_concept_code
115
+ concept_name = ths_concept_index_web.get_concept_name(concept_code)
116
+ new_concept_symbol_detail_df = ths_concept_detail_api.get_ths_concept_detail(concept_code, concept_name)
117
+ if data_frame_util.is_empty(new_concept_symbol_detail_df):
118
+ continue
119
+
120
+ exist_concept_df_one = ths_concept_list_exist.loc[
121
+ (ths_concept_list_exist['symbol'] == concept_code)
122
+ | (ths_concept_list_exist['web_concept_code'] == concept_code)]
123
+ now_date = datetime.now()
124
+ str_now_time = now_date.strftime('%Y-%m-%d %H:%M:%S')
125
+ str_day = now_date.strftime('%Y-%m-%d')
126
+ if data_frame_util.is_empty(exist_concept_df_one):
127
+ concept_code = max_concept_code
128
+
129
+ url = 'http://q.10jqka.com.cn/thshy/detail/code/' + str(concept_code)
130
+ new_concept_one = {
131
+ '_id': int(concept_code),
132
+ 'symbol': int(concept_code),
133
+ 'name': concept_name,
134
+ 'url': url,
135
+ 'str_day': str_day,
136
+ 'success': True,
137
+ 'str_now_time': str_now_time,
138
+ 'web_concept_code': concept_code,
139
+ 'web_concept_url': url,
140
+ 'valid': True,
141
+ 'grade': 1,
142
+ 'remark': ''
143
+ }
144
+ diff_one_df = pd.DataFrame(new_concept_one, index=[1])
145
+ mongodb_util.save_mongo(diff_one_df, db_name_constant.THS_CONCEPT_LIST)
146
+ # 新增概念信息处理
147
+ ths_concept_sync_common_api.push_msg_to_we_chat_and_redis(concept_code, concept_name,
148
+ url)
149
+
150
+ new_concept_symbol_detail_df.loc[:, 'way'] = 'index_sync'
151
+ ths_concept_sync_common_api.save_ths_concept_detail(new_concept_symbol_detail_df,
152
+ concept_name,
153
+ str_day,
154
+ str_now_time,
155
+ concept_code)
156
+
157
+ logger.info("新增同花顺新概念:{}", concept_name)
158
+
159
+ except BaseException as e:
160
+ logger.error("同步新增概念代码:{},信息异常:{}", max_concept_code, e)
161
+ # 更新ths概念统计信息
162
+ ths_concept_clean_api.update_ths_concept_info()
163
+ # 项目之间推送消息
164
+ redis_msg_publish_service.send_redis_msg(redis_msg_constant.THS_CONCEPT_MSG_TOPIC,
165
+ redis_msg_constant.THS_NEW_CONCEPT_ADD_MSG)
166
+
167
+
168
+ if __name__ == '__main__':
169
+ sync_ths_concept_new_index()
@@ -5,43 +5,31 @@ file_path = os.path.abspath(__file__)
5
5
  end = file_path.index('mns') + 17
6
6
  project_path = file_path[0:end]
7
7
  sys.path.append(project_path)
8
-
9
- import time
10
8
  import datetime
11
- from mns_common.db.MongodbUtil import MongodbUtil
12
- import mns_scheduler.concept.ths.common.ths_concept_sync_common_api as ths_concept_sync_common_api
13
-
14
- mongodb_util = MongodbUtil('27017')
9
+ import mns_scheduler.concept.ths.detaill.ths_concept_detail_api as ths_concept_detail_api
10
+ import mns_common.component.concept.ths_concept_common_service_api as ths_concept_common_service_api
11
+ from loguru import logger
15
12
 
16
13
 
17
14
  # 通过概念指数同步所有概念下的股票组成
18
15
 
19
16
  # 同步概念下所有股票组成
20
- def update_concept_all_symbol_detail():
21
- query = {"symbol": {'$exists': True}}
22
- new_concept_list = mongodb_util.find_query_data("ths_concept_list", query)
17
+ def update_concept_all_detail_info():
18
+ new_concept_list = ths_concept_common_service_api.get_all_ths_concept()
23
19
  new_concept_list = new_concept_list.sort_values(by=['symbol'], ascending=False)
24
- if new_concept_list.shape[0] > 0:
25
- for one_concept in new_concept_list.itertuples():
26
- now_date_time = datetime.datetime.now()
27
- str_day = now_date_time.strftime('%Y-%m-%d')
28
- str_now_time = now_date_time.strftime('%Y-%m-%d %H:%M:%S')
29
- new_concept_symbol_df = ths_concept_sync_common_api.get_concept_detail_info_web(one_concept.symbol)
30
20
 
31
- if new_concept_symbol_df is None or new_concept_symbol_df.shape[0] == 0:
32
- time.sleep(10)
33
- continue
34
- time.sleep(1)
35
- new_concept_symbol_df.loc[:, 'way'] = 'index_sync'
36
- ths_concept_sync_common_api.save_ths_concept_detail(new_concept_symbol_df, one_concept.name,
37
- str_day, str_now_time, one_concept.symbol)
21
+ for one_concept in new_concept_list.itertuples():
22
+ try:
23
+ ths_concept_detail_api.sync_ths_concept_detail_to_db(one_concept.symbol, one_concept.name)
24
+ except BaseException as e:
25
+ logger.error("同步概念下所有股票组成异常:{},{},{}", one_concept.symbol, one_concept.name, e)
38
26
 
39
27
 
40
28
  if __name__ == '__main__':
41
29
  now_date = datetime.datetime.now()
42
30
  begin_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
43
31
  print('同步开始:' + begin_date)
44
- update_concept_all_symbol_detail()
32
+ update_concept_all_detail_info()
45
33
  now_date = datetime.datetime.now()
46
34
  end_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
47
35
  print('同步结束:' + end_date)
@@ -1,8 +1,7 @@
1
1
  import os
2
2
  import sys
3
- import pandas as pd
4
- import mns_common.api.ths.ths_stock_api as ths_stock_api
5
- import mns_common.api.em.east_money_stock_api as east_money_stock_api
3
+ import mns_common.api.ths.concept.web.ths_concept_detail_web as ths_concept_detail_web
4
+ import mns_common.component.em.em_stock_info_api as em_stock_info_api
6
5
  import mns_common.component.common_service_fun_api as common_service_fun_api
7
6
  from mns_common.db.MongodbUtil import MongodbUtil
8
7
  from loguru import logger
@@ -13,6 +12,9 @@ import mns_scheduler.concept.ths.common.ths_concept_sync_common_api as ths_conce
13
12
  import threading
14
13
  import mns_scheduler.concept.ths.common.ths_concept_update_common_api as ths_concept_update_common_api
15
14
  import mns_common.utils.date_handle_util as date_handle_util
15
+ import mns_common.constant.db_name_constant as db_name_constant
16
+ import mns_common.component.redis_msg.redis_msg_publish_service as redis_msg_publish_service
17
+ import mns_common.constant.redis_msg_constant as redis_msg_constant
16
18
 
17
19
  file_path = os.path.abspath(__file__)
18
20
  end = file_path.index('mns') + 17
@@ -21,16 +23,16 @@ sys.path.append(project_path)
21
23
  mongodb_util = MongodbUtil('27017')
22
24
  # 分页大小
23
25
  MAX_PAGE_NUMBER = 2500
24
- # 获取单只股票新增概念
25
26
 
26
- db_name = 'ths_stock_concept_detail_app'
27
+
28
+ # 获取单只股票新增概念
27
29
 
28
30
 
29
31
  def create_index():
30
- mongodb_util.create_index(db_name, [("symbol", 1)])
31
- mongodb_util.create_index(db_name, [("str_day", 1)])
32
- mongodb_util.create_index(db_name, [("title", 1)])
33
- mongodb_util.create_index(db_name, [("str_now_date", 1)])
32
+ mongodb_util.create_index(db_name_constant.THS_STOCK_CONCEPT_DETAIL_APP, [("symbol", 1)])
33
+ mongodb_util.create_index(db_name_constant.THS_STOCK_CONCEPT_DETAIL_APP, [("str_day", 1)])
34
+ mongodb_util.create_index(db_name_constant.THS_STOCK_CONCEPT_DETAIL_APP, [("title", 1)])
35
+ mongodb_util.create_index(db_name_constant.THS_STOCK_CONCEPT_DETAIL_APP, [("str_now_date", 1)])
34
36
 
35
37
 
36
38
  # 同步新概念到详情表中
@@ -52,6 +54,9 @@ def sync_new_concept_to_ths_detail(symbol_add_new_concept_df, str_day, str_now_t
52
54
 
53
55
  except BaseException as e:
54
56
  logger.error("转换同花顺概念异常:{},{}", new_concept_one, e)
57
+ # 项目之间推送消息
58
+ redis_msg_publish_service.send_redis_msg(redis_msg_constant.THS_CONCEPT_MSG_TOPIC,
59
+ redis_msg_constant.THS_NEW_CONCEPT_ADD_MSG)
55
60
 
56
61
 
57
62
  # 保存数据到对比
@@ -60,7 +65,7 @@ def save_data_to_db(ths_concept_df):
60
65
  if data_frame_util.is_empty(ths_concept_df):
61
66
  return
62
67
  json_data = ths_concept_df.to_dict(orient='records')
63
- mongodb_util.save_mongo_json(json_data, db_name)
68
+ mongodb_util.save_mongo_json(json_data, db_name_constant.THS_STOCK_CONCEPT_DETAIL_APP)
64
69
 
65
70
 
66
71
  # 对比数据库和接口概念详情的差值
@@ -86,9 +91,8 @@ def choose_type_new_concept(ths_concept_df):
86
91
  def update_symbol_new_concept(symbol_df, page_number):
87
92
  for stock_one in symbol_df.itertuples():
88
93
  try:
89
- ths_concept_json = ths_stock_api.get_symbol_add_new_concept(stock_one.symbol)
90
- logger.info("同步symbol概念信息:{}", stock_one.symbol)
91
- symbol_ths_concept_all_df = pd.DataFrame(ths_concept_json)
94
+ symbol_ths_concept_all_df = ths_concept_detail_web.get_one_symbol_all_ths_concepts(stock_one.symbol)
95
+ logger.info("同步代码{},所有概念信息", stock_one.symbol)
92
96
  if data_frame_util.is_empty(symbol_ths_concept_all_df):
93
97
  continue
94
98
 
@@ -153,7 +157,7 @@ def update_symbol_new_concept(symbol_df, page_number):
153
157
 
154
158
  def sync_symbol_all_concept(symbol):
155
159
  create_index()
156
- real_time_quotes_now = east_money_stock_api.get_real_time_quotes_all_stocks()
160
+ real_time_quotes_now = em_stock_info_api.get_a_stock_info()
157
161
  real_time_quotes_now = common_service_fun_api.classify_symbol(real_time_quotes_now)
158
162
  if symbol is not None:
159
163
  real_time_quotes_now = real_time_quotes_now.loc[real_time_quotes_now['symbol'] == symbol]
@@ -179,4 +183,4 @@ def sync_symbol_all_concept(symbol):
179
183
 
180
184
 
181
185
  if __name__ == '__main__':
182
- sync_symbol_all_concept(None)
186
+ sync_symbol_all_concept('831175')
@@ -93,7 +93,9 @@ def delete_exist_data(str_day):
93
93
 
94
94
 
95
95
  def db_export_col(db, col):
96
- cmd = 'D:/MongoDB/tools/bin/mongodump.exe --host ' + db + ' -d patience -c ' + col + ' -o G:/backup'
96
+ cmd = 'F:/mongo/bin/mongodump.exe --host ' + db + ' -d patience -c ' + col + ' -o H:/back'
97
+ os.system(cmd)
98
+ logger.info("export finished:{}")
97
99
  os.system(cmd)
98
100
 
99
101
  logger.info("export finished:{}", col)
@@ -101,7 +103,7 @@ def db_export_col(db, col):
101
103
 
102
104
  # D:\software\mongodb-tools\mongodb-database-tools-windows-x86_64-100.5.2\bin
103
105
  def db_import_col(db, col):
104
- cmd = 'D:/software/mongodb-tools/mongodb-database-tools-windows-x86_64-100.5.2/bin/mongorestore.exe --host ' + db + ' -d patience -c ' + col + ' D:/back/patience/' + col + '.bson'
106
+ cmd = 'F:/mongo/bin/mongodump.exe --host ' + db + ' -d patience -c ' + col + ' H:/back/patience/' + col + '.bson'
105
107
  os.system(cmd)
106
108
 
107
109
  logger.info("import finished:{}", col)
@@ -109,8 +111,9 @@ def db_import_col(db, col):
109
111
 
110
112
  # -u "username" -p "password"
111
113
  if __name__ == '__main__':
112
- sync_col_move('2024-05-28')
113
- sync_col_move('2024-05-30')
114
- sync_col_move('2024-05-31')
115
- sync_col_move('2024-06-03')
116
- sync_col_move('2024-06-04')
114
+ query_trade = {"$and": [{"trade_date": {"$gte": "2024-09-24"}}, {"trade_date": {"$lte": "2024-10-22"}}]}
115
+
116
+ trade_date_list = mongodb_util.find_query_data('trade_date_list', query_trade)
117
+ for trade_one in trade_date_list.itertuples():
118
+ trade_date_move = trade_one.trade_date
119
+ sync_col_move(trade_date_move)
@@ -21,4 +21,4 @@ def db_status_check():
21
21
  ip = ip_util.get_host_ip()
22
22
  push_msg_api.push_msg_to_wechat("数据库挂了", "地址:" + ip + "-" + "数据库挂了")
23
23
  logger.error("出现异常:{}", e)
24
- return
24
+
@@ -0,0 +1,7 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 17
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
@@ -0,0 +1,45 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 17
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
8
+ import pymongo
9
+ from mns_common.db.MongodbUtil import MongodbUtil
10
+
11
+ mongodb_util = MongodbUtil('27017')
12
+
13
+ client_win = pymongo.MongoClient("mongodb://192.168.1.6:" + '27017' + "/patience")
14
+ from loguru import logger
15
+
16
+
17
+ def insert_mongo(df, col):
18
+ db = client_win.patience
19
+
20
+ if df is None or len(df) == 0:
21
+ return
22
+ collection = db[col]
23
+ # 格式转换
24
+ try:
25
+ df = df.drop_duplicates()
26
+ # df = df.T.drop_duplicates().T
27
+ records = df.to_dict('records')
28
+ collection.insert_many(records)
29
+ except BaseException as e:
30
+ logger.error("插入数据异常:{}", e)
31
+
32
+
33
+ def col_move():
34
+ col = 'realtime_quotes_now_2024-09-23'
35
+ number = 8
36
+ while number < 3312:
37
+ query = {'number': number}
38
+ realtime_quotes_now_df = mongodb_util.find_query_data(col, query)
39
+ insert_mongo(realtime_quotes_now_df, col)
40
+ number = number + 1
41
+ print(number)
42
+
43
+
44
+ if __name__ == '__main__':
45
+ col_move()
@@ -0,0 +1,7 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 17
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)