mns-common 1.4.1.8__py3-none-any.whl → 1.5.7.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 (50) hide show
  1. mns_common/api/akshare/__init__.py +0 -1
  2. mns_common/api/akshare/k_line_api.py +19 -2
  3. mns_common/api/akshare/stock_bid_ask_api.py +10 -3
  4. mns_common/api/akshare/stock_zb_pool.py +2 -0
  5. mns_common/api/akshare/stock_zt_pool_api.py +1 -1
  6. mns_common/api/em/gd/east_money_stock_gdfx_free_top_10_api.py +62 -7
  7. mns_common/api/em/real_time/__init__.py +1 -1
  8. mns_common/api/em/real_time/east_money_debt_api.py +140 -70
  9. mns_common/api/em/real_time/east_money_etf_api.py +138 -27
  10. mns_common/api/em/real_time/east_money_stock_a_api.py +24 -28
  11. mns_common/api/em/real_time/east_money_stock_a_v2_api.py +97 -53
  12. mns_common/api/em/real_time/east_money_stock_common_api.py +174 -0
  13. mns_common/api/em/real_time/east_money_stock_hk_api.py +223 -272
  14. mns_common/api/em/real_time/east_money_stock_hk_gtt_api.py +260 -0
  15. mns_common/api/em/real_time/east_money_stock_multi_thread_api_v3.py +154 -0
  16. mns_common/api/em/real_time/east_money_stock_us_api.py +146 -82
  17. mns_common/api/em/real_time/real_time_quotes_repeat_api.py +195 -0
  18. mns_common/api/k_line/stock_k_line_data_api.py +11 -1
  19. mns_common/api/kpl/common/kpl_common_api.py +35 -0
  20. mns_common/api/proxies/liu_guan_proxy_api.py +55 -5
  21. mns_common/api/ths/company/company_product_area_industry_index_query.py +46 -0
  22. mns_common/api/ths/company/ths_company_info_api.py +2 -1
  23. mns_common/api/ths/company/ths_company_info_web.py +159 -0
  24. mns_common/api/ths/concept/app/ths_concept_index_app.py +3 -1
  25. mns_common/api/ths/wen_cai/ths_wen_cai_api.py +1 -1
  26. mns_common/api/ths/zt/ths_stock_zt_pool_api.py +20 -1
  27. mns_common/api/ths/zt/ths_stock_zt_pool_v2_api.py +105 -29
  28. mns_common/api/xueqiu/xue_qiu_k_line_api.py +2 -2
  29. mns_common/component/common_service_fun_api.py +26 -6
  30. mns_common/component/data/data_init_api.py +13 -8
  31. mns_common/component/deal/deal_service_api.py +70 -8
  32. mns_common/component/deal/deal_service_v2_api.py +167 -0
  33. mns_common/component/em/em_stock_info_api.py +9 -3
  34. mns_common/component/main_line/main_line_zt_reason_service.py +237 -0
  35. mns_common/component/proxies/proxy_common_api.py +141 -45
  36. mns_common/component/us/us_stock_etf_info_api.py +125 -0
  37. mns_common/constant/db_name_constant.py +40 -16
  38. mns_common/constant/extra_income_db_name.py +79 -19
  39. mns_common/constant/strategy_classify.py +17 -2
  40. mns_common/db/MongodbUtil.py +3 -0
  41. mns_common/db/MongodbUtilLocal.py +3 -0
  42. {mns_common-1.4.1.8.dist-info → mns_common-1.5.7.2.dist-info}/METADATA +1 -1
  43. {mns_common-1.4.1.8.dist-info → mns_common-1.5.7.2.dist-info}/RECORD +47 -41
  44. mns_common/api/ths/concept/web/ths_company_info_web.py +0 -163
  45. mns_common/component/qmt/qmt_buy_service.py +0 -172
  46. mns_common/component/task/real_time_data_sync_check.py +0 -110
  47. /mns_common/component/{qmt → main_line}/__init__.py +0 -0
  48. /mns_common/component/{task → us}/__init__.py +0 -0
  49. {mns_common-1.4.1.8.dist-info → mns_common-1.5.7.2.dist-info}/WHEEL +0 -0
  50. {mns_common-1.4.1.8.dist-info → mns_common-1.5.7.2.dist-info}/top_level.txt +0 -0
@@ -7,6 +7,7 @@ project_path = file_path[0:end]
7
7
  sys.path.append(project_path)
8
8
  import json
9
9
  import requests
10
+ from loguru import logger
10
11
 
11
12
  '''
12
13
 
@@ -89,7 +90,12 @@ def get_position(terminal):
89
90
  if response.status_code != 200:
90
91
  result = {"message": '获取持仓失败'}
91
92
  else:
92
- result = response.json()
93
+ try:
94
+ result = response.json()
95
+ except BaseException as e:
96
+ result_test = response.text
97
+ result = json.loads(result_test)
98
+
93
99
  return result
94
100
 
95
101
 
@@ -126,7 +132,24 @@ def auto_login(terminal):
126
132
  if response.status_code != 200:
127
133
  result = {"message": '获取持仓失败'}
128
134
  else:
135
+
136
+ result = response.json()
137
+
138
+ return result
139
+
140
+
141
+ # 查询订单
142
+ def query_orders(terminal):
143
+ param_order = {
144
+ 'terminal': terminal}
145
+ param_json = json.dumps(param_order)
146
+ response = request_trader('/order', param_json)
147
+ if response.status_code != 200:
148
+ result = {"message": '查询订单失败'}
149
+ else:
150
+
129
151
  result = response.json()
152
+
130
153
  return result
131
154
 
132
155
 
@@ -138,18 +161,57 @@ def request_trader(url, param):
138
161
  return requests.post(total_url, data=param, headers=headers)
139
162
 
140
163
 
164
+ # 获取交易价格
165
+ def get_trade_price(terminal, symbol, price_code, limit_chg):
166
+ param_position = {
167
+ 'symbol': symbol,
168
+ 'terminal': terminal,
169
+ 'price_code': price_code,
170
+ 'limit_chg': limit_chg}
171
+
172
+ param_json = json.dumps(param_position)
173
+ response = request_trader('/trade/price', param_json)
174
+ if response.status_code != 200:
175
+ result = {"message": '获取行情失败'}
176
+ else:
177
+ result = response.json()
178
+ return result
179
+
180
+
181
+ # 获取qmt 行情
182
+ def get_qmt_real_time_quotes_detail(terminal, symbol_list):
183
+ param_position = {
184
+ 'symbol_list': symbol_list,
185
+ 'terminal': terminal}
186
+
187
+ param_json = json.dumps(param_position)
188
+ response = request_trader('/qmt/real/time/quotes/detail', param_json)
189
+ if response.status_code != 200:
190
+ result = {"message": '获取行情失败'}
191
+ else:
192
+ result = response.json()
193
+ return result
194
+
195
+
196
+ from mns_common.component.deal.terminal_enum import TerminalEnum
197
+
141
198
  if __name__ == '__main__':
142
- auto_login('qmt')
143
- get_position('qmt')
199
+ terminal_test = TerminalEnum.QMT.terminal_code
200
+ get_position(terminal_test)
201
+ symbol_one_test = ['301181.SZ']
202
+ result_json = get_qmt_real_time_quotes_detail(terminal_test, symbol_one_test)
203
+ print(result_json)
204
+ # auto_login('qmt')
205
+ # get_position('qmt')
144
206
  # terminal_test = 'easy_trader'
145
207
  # order_cancel('251145121', terminal_test)
146
208
  # get_position(terminal_test)
147
209
  # auto_ipo_buy(terminal_test)
148
- trade_buy(
149
- '301314.SZ',
150
- 35.77,
151
- 1000000,
152
- 'qmt')
210
+ # trade_buy(
211
+ # '301314.SZ',
212
+ # 35.77,
213
+ # 1000000,
214
+ # 'qmt')
153
215
  # trade_sell(
154
216
  # '301314',
155
217
  # 35.77,
@@ -0,0 +1,167 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 16
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
8
+ import json
9
+ import requests
10
+
11
+ '''
12
+
13
+ '''
14
+
15
+
16
+ def trade_buy(symbol, buy_price, buy_volume, terminal):
17
+ '''
18
+ 买入
19
+ :param symbol:
20
+ :param buy_price:
21
+ :param buy_volume:
22
+ :param terminal:
23
+ :return:
24
+ '''
25
+ param_buy = {
26
+ 'symbol': symbol,
27
+ 'buy_price': buy_price,
28
+ 'buy_volume': buy_volume,
29
+ 'terminal': terminal}
30
+ param_json = json.dumps(param_buy)
31
+ response = request_trader_post('/buy', param_json)
32
+ if response.status_code != 200:
33
+ buy_result = {"message": '买入失败'}
34
+ else:
35
+ buy_result = response.json()
36
+ return buy_result
37
+
38
+
39
+ def trade_sell(symbol, sell_price, sell_volume, terminal):
40
+ '''
41
+ 卖出
42
+ :param symbol:
43
+ :param sell_price:
44
+ :param sell_volume:
45
+ :param terminal:
46
+ :return:
47
+ '''
48
+ param_sell = {
49
+ 'symbol': symbol,
50
+ 'sell_price': sell_price,
51
+ 'sell_volume': sell_volume,
52
+ 'terminal': terminal}
53
+ param_json = json.dumps(param_sell)
54
+ response = request_trader_post('/sell', param_json)
55
+ if response.status_code != 200:
56
+ sell_result = {"message": '卖出失败'}
57
+ else:
58
+ sell_result = response.json()
59
+ return sell_result
60
+
61
+
62
+ def auto_ipo_buy(terminal):
63
+ '''
64
+ 自动打新
65
+ :param terminal:
66
+ :return:
67
+ '''
68
+ param_auto_ipo = {
69
+ 'terminal': terminal}
70
+ param_json = json.dumps(param_auto_ipo)
71
+ response = request_trader_get('/auto/ipo/buy', param_json)
72
+ if response.status_code != 200:
73
+ result = {"message": '自动打新失败'}
74
+ else:
75
+ result = response.json()
76
+ return result
77
+
78
+
79
+ def get_position(terminal):
80
+ '''
81
+ 获取持仓
82
+ :param terminal:
83
+ :return:
84
+ '''
85
+ param_position = {
86
+ 'terminal': terminal}
87
+ param_json = json.dumps(param_position)
88
+ response = request_trader_get('/position', param_json)
89
+ if response.status_code != 200:
90
+ result = {"message": '获取持仓失败'}
91
+ else:
92
+ result = response.json()
93
+ return result
94
+
95
+
96
+ def order_cancel(entrust_no, terminal):
97
+ '''
98
+ 撤单
99
+ :param entrust_no:
100
+ :param terminal:
101
+ :return:
102
+ '''
103
+ param_cancel = {
104
+ "entrust_no": entrust_no,
105
+ 'terminal': terminal}
106
+ param_json = json.dumps(param_cancel)
107
+ response = request_trader_post('/cancel', param_json)
108
+ if response.status_code != 200:
109
+ result = {"message": '撤单失败'}
110
+ else:
111
+ result = response.json()
112
+ return result
113
+
114
+
115
+ # 自动登陆接口
116
+ def auto_login(terminal):
117
+ '''
118
+ 自动登陆客户端
119
+ :param terminal:
120
+ :return:
121
+ '''
122
+ param_position = {
123
+ 'terminal': terminal}
124
+ param_json = json.dumps(param_position)
125
+ response = request_trader_post('/auto/login', param_json)
126
+ if response.status_code != 200:
127
+ result = {"message": '获取持仓失败'}
128
+ else:
129
+ result = response.json()
130
+ return result
131
+
132
+
133
+ def request_trader_post(url, param):
134
+ total_url = "http://127.0.0.1:5002/api/trade" + url
135
+ headers = {
136
+ "Content-Type": "application/json"
137
+ }
138
+ return requests.post(total_url, data=param, headers=headers)
139
+
140
+
141
+ def request_trader_get(url, param):
142
+ total_url = "http://127.0.0.1:5002/api/trade" + url
143
+ headers = {
144
+ "Content-Type": "application/json"
145
+ }
146
+ return requests.get(total_url, data=param, headers=headers)
147
+
148
+
149
+ if __name__ == '__main__':
150
+ # auto_login('qmt')
151
+ # get_position('qmt')
152
+ # terminal_test = 'easy_trader'
153
+ # order_cancel('251145121', terminal_test)
154
+ # get_position(terminal_test)
155
+ # auto_ipo_buy(terminal_test)
156
+ buy_result_test = trade_buy(
157
+ '688693.SH',
158
+ 36.39,
159
+ 1000,
160
+ 'ths')
161
+ entrust_no_test = buy_result_test['entrust_no']
162
+ order_cancel(entrust_no_test, 'ths')
163
+ # trade_sell(
164
+ # '301314',
165
+ # 35.77,
166
+ # 100,
167
+ # 'easy_trader')
@@ -13,7 +13,9 @@ mongodb_util = MongodbUtil('27017')
13
13
 
14
14
  # 获取东方财富A股全部信息
15
15
  def get_a_stock_info():
16
- return mongodb_util.find_all_data(extra_income_db_name.EM_A_STOCK_INFO)
16
+ em_a_stock_info = mongodb_util.find_all_data(extra_income_db_name.EM_A_STOCK_INFO)
17
+ em_a_stock_info = em_a_stock_info[~em_a_stock_info['symbol'].str.startswith(('8', '4'))]
18
+ return em_a_stock_info
17
19
 
18
20
 
19
21
  # 获取东方财富ETF全部信息
@@ -28,15 +30,19 @@ def get_kzz_info():
28
30
 
29
31
  # 获取东方财富美股全部信息
30
32
  def get_us_stock_info():
31
- return mongodb_util.find_all_data(extra_income_db_name.EM_US_STOCK_INFO)
33
+ return mongodb_util.find_all_data(extra_income_db_name.US_STOCK_INFO_EM)
32
34
 
33
35
 
34
36
  # 获取东方财富美股 eft全部信息
35
37
  def get_us_etf_info():
36
- return mongodb_util.find_all_data(extra_income_db_name.EM_US_ETF_INFO)
38
+ return mongodb_util.find_all_data(extra_income_db_name.US_ETF_INFO_EM)
37
39
 
38
40
 
39
41
  # 获取东方财富港股全部信息
40
42
 
41
43
  def get_hk_stock_info():
42
44
  return mongodb_util.find_all_data(extra_income_db_name.EM_HK_STOCK_INFO)
45
+
46
+
47
+ if __name__ == '__main__':
48
+ get_a_stock_info()
@@ -0,0 +1,237 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 16
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
8
+ import mns_common.constant.db_name_constant as db_name_constant
9
+ from mns_common.db.MongodbUtil import MongodbUtil
10
+ import mns_common.api.ths.zt.ths_stock_zt_pool_api as ths_stock_zt_pool_api
11
+ from mns_common.utils.async_fun import async_fun
12
+ import mns_common.component.trade_date.trade_date_common_service_api as trade_date_common_service_api
13
+
14
+ mongodb_util = MongodbUtil('27017')
15
+ import mns_common.utils.data_frame_util as data_frame_util
16
+ import time
17
+ from loguru import logger
18
+ import pandas as pd
19
+ from datetime import datetime
20
+
21
+
22
+ # 添加主线和涨停分析临时数据
23
+ def merge_main_line_info(str_day, data_df):
24
+ # 保证数据完整性
25
+ if 'main_line' not in data_df.columns:
26
+ data_df['main_line'] = ''
27
+ else:
28
+ data_df.fillna({'main_line': ''}, inplace=True)
29
+
30
+ if 'sub_main_line' not in data_df.columns:
31
+ data_df['sub_main_line'] = ''
32
+ else:
33
+ data_df.fillna({'sub_main_line': ''}, inplace=True)
34
+
35
+ if 'zt_analysis' not in data_df.columns:
36
+ data_df['zt_analysis'] = ''
37
+
38
+ else:
39
+ data_df.fillna({'zt_analysis': ''}, inplace=True)
40
+
41
+ if 'zt_reason' not in data_df.columns:
42
+ data_df['zt_reason'] = ''
43
+ else:
44
+ data_df.fillna({'zt_reason': ''}, inplace=True)
45
+
46
+ if 'main_line_choose_source' not in data_df.columns:
47
+ data_df['main_line_choose_source'] = 'now_zt'
48
+ else:
49
+ data_df.fillna({'main_line_choose_source': 'now_zt'}, inplace=True)
50
+
51
+ if 'main_line_grade' not in data_df.columns:
52
+ data_df['main_line_grade'] = 1
53
+ else:
54
+ data_df.fillna({'main_line_grade': 1}, inplace=True)
55
+
56
+ query_zt_now = {'symbol': {"$in": list(data_df['symbol'])}, 'str_day': str_day}
57
+ # merge 主线 涨停详情
58
+ main_line_detail_df = mongodb_util.find_query_data(db_name_constant.MAIN_LINE_DETAIL, query_zt_now)
59
+ if data_frame_util.is_not_empty(main_line_detail_df):
60
+ symbol_mapping_zt_reason_now = dict(
61
+ zip(main_line_detail_df['symbol'], main_line_detail_df['zt_reason']))
62
+
63
+ symbol_mapping_zt_analysis_now = dict(
64
+ zip(main_line_detail_df['symbol'], main_line_detail_df['zt_analysis']))
65
+
66
+ symbol_mapping_main_line_now = dict(
67
+ zip(main_line_detail_df['symbol'], main_line_detail_df['main_line']))
68
+
69
+ symbol_mapping_sub_main_line_now = dict(
70
+ zip(main_line_detail_df['symbol'], main_line_detail_df['sub_main_line']))
71
+
72
+ symbol_mapping_main_line_choose_source = dict(
73
+ zip(main_line_detail_df['symbol'], main_line_detail_df['main_line_choose_source']))
74
+
75
+ symbol_mapping_main_line_grade = dict(
76
+ zip(main_line_detail_df['symbol'], main_line_detail_df['main_line_grade']))
77
+
78
+ data_df['main_line_grade'] = data_df['symbol'].map(
79
+ symbol_mapping_main_line_grade).fillna(
80
+ data_df['main_line_grade'])
81
+
82
+ data_df['main_line'] = data_df['symbol'].map(
83
+ symbol_mapping_main_line_now).fillna(
84
+ data_df['main_line'])
85
+
86
+ data_df['sub_main_line'] = data_df['symbol'].map(
87
+ symbol_mapping_sub_main_line_now).fillna(
88
+ data_df['sub_main_line'])
89
+ data_df['zt_reason'] = data_df['symbol'].map(
90
+ symbol_mapping_zt_reason_now).fillna(
91
+ data_df['zt_reason'])
92
+ data_df['zt_analysis'] = data_df['symbol'].map(
93
+ symbol_mapping_zt_analysis_now).fillna(
94
+ data_df['zt_analysis'])
95
+
96
+ data_df['main_line_choose_source'] = data_df['symbol'].map(
97
+ symbol_mapping_main_line_choose_source).fillna(
98
+ data_df['main_line_choose_source'])
99
+
100
+ return data_df
101
+
102
+
103
+ # merge涨停分析 原因
104
+ def merge_zt_reason_info(str_day, data_df):
105
+ if 'zt_analysis' not in data_df.columns:
106
+ data_df['zt_analysis'] = ''
107
+
108
+ else:
109
+ data_df.fillna({'zt_analysis': ''}, inplace=True)
110
+
111
+ if 'zt_reason' not in data_df.columns:
112
+ data_df['zt_reason'] = ''
113
+ else:
114
+ data_df.fillna({'zt_reason': ''}, inplace=True)
115
+
116
+ query_zt_now = {'symbol': {"$in": list(data_df['symbol'])}, 'str_day': str_day}
117
+ # merge 主线 涨停详情
118
+ zt_reason_analysis_df = mongodb_util.find_query_data(db_name_constant.ZT_REASON_ANALYSIS, query_zt_now)
119
+ if data_frame_util.is_not_empty(zt_reason_analysis_df):
120
+ symbol_mapping_zt_reason_now = dict(
121
+ zip(zt_reason_analysis_df['symbol'], zt_reason_analysis_df['zt_reason']))
122
+
123
+ symbol_mapping_zt_analysis_now = dict(
124
+ zip(zt_reason_analysis_df['symbol'], zt_reason_analysis_df['zt_analysis']))
125
+
126
+ data_df['zt_reason'] = data_df['symbol'].map(
127
+ symbol_mapping_zt_reason_now).fillna(
128
+ data_df['zt_reason'])
129
+ data_df['zt_analysis'] = data_df['symbol'].map(
130
+ symbol_mapping_zt_analysis_now).fillna(
131
+ data_df['zt_analysis'])
132
+
133
+ return data_df
134
+
135
+
136
+ def update_zt_reason_analysis(symbol, str_day, name, need_update):
137
+ try:
138
+ key_id = symbol + "_" + str_day
139
+ query_zt = {"_id": key_id}
140
+
141
+ # 已经存在的数据
142
+ zt_reason_analysis_exists_df = mongodb_util.find_query_data(db_name_constant.ZT_REASON_ANALYSIS,
143
+ query_zt)
144
+
145
+ if data_frame_util.is_not_empty(zt_reason_analysis_exists_df):
146
+ zt_analysis = list(zt_reason_analysis_exists_df['zt_analysis'])[0]
147
+ zt_reason = list(zt_reason_analysis_exists_df['zt_reason'])[0]
148
+ # 需要更新数据
149
+ if data_frame_util.is_string_empty(zt_analysis) or data_frame_util.is_string_empty(
150
+ zt_reason) or need_update:
151
+ try:
152
+ zt_result_dict = ths_stock_zt_pool_api.zt_analyse_reason(symbol)
153
+ zt_analysis = zt_result_dict['zt_analyse_detail']
154
+ zt_reason = zt_result_dict['zt_reason']
155
+ time.sleep(1)
156
+ except BaseException as e:
157
+ time.sleep(1)
158
+ zt_analysis = ''
159
+ zt_reason = ''
160
+
161
+ zt_reason_analysis_exists_df['zt_analysis'] = zt_analysis
162
+ zt_reason_analysis_exists_df['zt_reason'] = zt_reason
163
+ now_date = datetime.now()
164
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
165
+ zt_reason_analysis_exists_df['str_now_date'] = str_now_date
166
+ mongodb_util.save_mongo(zt_reason_analysis_exists_df, db_name_constant.ZT_REASON_ANALYSIS)
167
+ else:
168
+ # 不存在临时主线数据
169
+ try:
170
+ zt_result_dict = ths_stock_zt_pool_api.zt_analyse_reason(symbol)
171
+ zt_analysis = zt_result_dict['zt_analyse_detail']
172
+ zt_reason = zt_result_dict['zt_reason']
173
+ time.sleep(1)
174
+ except BaseException as e:
175
+ time.sleep(1)
176
+ zt_analysis = ''
177
+ zt_reason = ''
178
+ now_date = datetime.now()
179
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
180
+ reason_dict = {'_id': key_id,
181
+ 'symbol': symbol,
182
+ 'name': name,
183
+ 'zt_analysis': zt_analysis,
184
+ 'zt_reason': zt_reason,
185
+ 'str_day': str_day,
186
+ 'update_time': str_now_date,
187
+ }
188
+ reason_df = pd.DataFrame(reason_dict, index=[1])
189
+ mongodb_util.save_mongo(reason_df, db_name_constant.ZT_REASON_ANALYSIS)
190
+ except BaseException as e:
191
+ logger.error("添加涨停原因详情异常:{},{}", e, name)
192
+
193
+
194
+ @async_fun
195
+ def update_symbol_list_zt_reason_analysis(data_df, need_update):
196
+ for stock_one in data_df.itertuples():
197
+ str_day = stock_one.str_day
198
+ symbol = stock_one.symbol
199
+ name = stock_one.name
200
+ update_zt_reason_analysis(symbol, str_day, name, need_update)
201
+ time.sleep(1)
202
+
203
+
204
+ # 保存连板股票主线
205
+ @async_fun
206
+ def save_last_trade_day_main_line(str_day, stock_em_zt_pool_df_data):
207
+ last_trade_day = trade_date_common_service_api.get_last_trade_day(str_day)
208
+ stock_em_zt_pool_connected_df = stock_em_zt_pool_df_data.loc[
209
+ stock_em_zt_pool_df_data['connected_boards_numbers'] > 1]
210
+ if data_frame_util.is_empty(stock_em_zt_pool_connected_df):
211
+ return
212
+ else:
213
+ query = {'str_day': last_trade_day, 'symbol': {"$in": list(stock_em_zt_pool_connected_df['symbol'])}}
214
+ last_trade_day_main_line_detail_df = mongodb_util.find_query_data(db_name_constant.MAIN_LINE_DETAIL, query)
215
+ if data_frame_util.is_empty(last_trade_day_main_line_detail_df):
216
+ return
217
+ else:
218
+ last_trade_day_main_line_detail_df['_id'] = last_trade_day_main_line_detail_df['symbol'] + '_' + str_day
219
+ last_trade_day_main_line_detail_df['str_day'] = str_day
220
+ last_trade_day_main_line_detail_df['connected_boards_numbers'] = last_trade_day_main_line_detail_df[
221
+ 'connected_boards_numbers'] + 1
222
+ now_date = datetime.now()
223
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
224
+ last_trade_day_main_line_detail_df['update_time'] = str_now_date
225
+ today_exist_main_line_df = mongodb_util.find_query_data(db_name_constant.MAIN_LINE_DETAIL,
226
+ {'str_day': str_day, 'symbol': {"$in": list(
227
+ last_trade_day_main_line_detail_df['symbol'])}})
228
+ if data_frame_util.is_not_empty(today_exist_main_line_df):
229
+ today_new_main_line_df = last_trade_day_main_line_detail_df.loc[~
230
+ last_trade_day_main_line_detail_df['symbol'].isin(list(today_exist_main_line_df['symbol']))]
231
+ else:
232
+ today_new_main_line_df = last_trade_day_main_line_detail_df.copy()
233
+ mongodb_util.save_mongo(today_new_main_line_df, db_name_constant.MAIN_LINE_DETAIL)
234
+
235
+
236
+ if __name__ == '__main__':
237
+ update_zt_reason_analysis('600362', '2025-12-26', '江西铜业', True)