mns-scheduler 1.0.9.7__py3-none-any.whl → 1.1.0.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.

Potentially problematic release.


This version of mns-scheduler might be problematic. Click here for more details.

Files changed (25) hide show
  1. mns_scheduler/backup/ths/__init__.py +0 -0
  2. mns_scheduler/{concept/ths/sync_new_index → backup/ths}/sync_ths_concept_by_ak_api.py +3 -3
  3. mns_scheduler/{concept/ths/sync_new_index → backup/ths}/sync_ths_new_concept_by_web_api.py +4 -5
  4. mns_scheduler/big_deal/ths_big_deal_sync.py +1 -1
  5. mns_scheduler/company_info/company_info_sync_api.py +5 -9
  6. mns_scheduler/concept/clean/ths_concept_clean_api.py +2 -2
  7. mns_scheduler/concept/common/__init__.py +0 -0
  8. mns_scheduler/concept/common/detaill/__init__.py +0 -0
  9. mns_scheduler/concept/common/detaill/ths_concept_detail_api.py +196 -0
  10. mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py +2 -2
  11. mns_scheduler/concept/ths/common/ths_concept_update_common_api.py +2 -5
  12. mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_new_index_api.py +170 -0
  13. mns_scheduler/concept/ths/update_concept_info/sync_one_symbol_all_concepts_api.py +3 -4
  14. mns_scheduler/risk/major_violations/register_and_investigate_stock_sync_api.py +2 -2
  15. mns_scheduler/risk/self/wei_pan_stock_api.py +2 -2
  16. mns_scheduler/zt/zt_pool/zt_pool_sync_api.py +1 -1
  17. mns_scheduler/zz_task/data_sync_task.py +23 -32
  18. {mns_scheduler-1.0.9.7.dist-info → mns_scheduler-1.1.0.2.dist-info}/METADATA +1 -1
  19. {mns_scheduler-1.0.9.7.dist-info → mns_scheduler-1.1.0.2.dist-info}/RECORD +21 -20
  20. mns_scheduler/backup/app/__init__.py +0 -7
  21. mns_scheduler/backup/app/ths_new_concept_sync_app.py +0 -122
  22. mns_scheduler/backup/wen_cai/__init__.py +0 -7
  23. mns_scheduler/backup/wen_cai/wen_cai_concept_sync.py +0 -51
  24. {mns_scheduler-1.0.9.7.dist-info → mns_scheduler-1.1.0.2.dist-info}/WHEEL +0 -0
  25. {mns_scheduler-1.0.9.7.dist-info → mns_scheduler-1.1.0.2.dist-info}/top_level.txt +0 -0
File without changes
@@ -13,9 +13,9 @@ import pandas as pd
13
13
  from datetime import datetime
14
14
  import akshare as ak
15
15
  import mns_scheduler.concept.ths.common.ths_concept_sync_common_api as ths_concept_sync_common_api
16
- import mns_common.api.ths.ths_stock_api as ths_stock_api
17
- import mns_scheduler.concept.clean.ths_concept_clean_api as ths_concept_clean_api
18
16
 
17
+ import mns_scheduler.concept.clean.ths_concept_clean_api as ths_concept_clean_api
18
+ import mns_scheduler.concept.common.detaill.ths_concept_detail_api as ths_concept_detail_api
19
19
  mongodb_util = MongodbUtil('27017')
20
20
 
21
21
 
@@ -90,7 +90,7 @@ def handle_new_concept_msg(concept_code, concept_name, url):
90
90
 
91
91
  # 获取web端 新增概念详情
92
92
  def get_concept_detail_info_web(concept_code):
93
- new_concept_symbol_list = ths_stock_api.ths_stock_concept(concept_code)
93
+ new_concept_symbol_list = ths_concept_detail_api.get_ths_concept_detail(concept_code, None)
94
94
  if new_concept_symbol_list is None or new_concept_symbol_list.shape[0] == 0:
95
95
  return None
96
96
  new_concept_symbol_list = new_concept_symbol_list[ths_concept_sync_common_api.order_fields]
@@ -5,8 +5,8 @@ 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
- import mns_common.api.ths.ths_stock_api as ths_stock_api
9
-
8
+ import mns_scheduler.concept.common.detaill.ths_concept_detail_api as ths_concept_detail_api
9
+ import mns_common.api.ths.concept.web.ths_concept_index_web as ths_concept_index_web
10
10
  import datetime
11
11
  import time
12
12
  import mns_common.api.msg.push_msg_api as push_msg_api
@@ -20,7 +20,7 @@ mongodb_util = MongodbUtil('27017')
20
20
 
21
21
  # 获取web端 新增概念详情
22
22
  def get_concept_detail_info_web(concept_code):
23
- new_concept_symbol_list = ths_stock_api.ths_stock_concept(concept_code)
23
+ new_concept_symbol_list = ths_concept_detail_api.get_ths_concept_detail(concept_code, None)
24
24
  if new_concept_symbol_list is None or new_concept_symbol_list.shape[0] == 0:
25
25
  return None
26
26
  new_concept_symbol_list = new_concept_symbol_list[ths_concept_sync_common_api.order_fields]
@@ -52,7 +52,7 @@ def sync_new_concept_data_by_web():
52
52
  time.sleep(1)
53
53
  continue
54
54
  time.sleep(2)
55
- concept_name = ths_stock_api.get_concept_name(concept_code)
55
+ concept_name = ths_concept_index_web.get_concept_name(concept_code)
56
56
  concept_name = concept_name.replace('(', '(')
57
57
  concept_name = concept_name.replace(')', ')')
58
58
 
@@ -82,7 +82,6 @@ def handle_new_concept_msg(concept_code, concept_name, url):
82
82
 
83
83
  if __name__ == '__main__':
84
84
  # code = 886025
85
- # name = ths_stock_api.get_concept_name(code)
86
85
  # push_msg_to_we_chat_web(code, name)
87
86
  # get_concept_detail_info_web(886026)
88
87
  # get_concept_detail_info_web(886035)
@@ -10,7 +10,7 @@ from datetime import datetime, time, timedelta
10
10
  from loguru import logger
11
11
  import mns_common.utils.data_frame_util as data_frame_util
12
12
  from mns_common.db.MongodbUtil import MongodbUtil
13
- import mns_common.api.ths.ths_big_deal_api as ths_big_deal_api
13
+ import mns_common.api.ths.big_deal.ths_big_deal_api as ths_big_deal_api
14
14
  import time as sleep_time
15
15
  import mns_common.constant.db_name_constant as db_name_constant
16
16
 
@@ -9,7 +9,7 @@ sys.path.append(project_path)
9
9
  from datetime import datetime
10
10
  import pandas as pd
11
11
  from loguru import logger
12
- import mns_common.api.ths.ths_stock_api as ths_stock_api
12
+ import mns_common.api.ths.concept.web.ths_company_info_web as ths_company_info_web
13
13
  import mns_common.api.em.east_money_stock_v2_api as east_money_stock_v2_api
14
14
  import mns_scheduler.company_info.company_constant_data as company_constant_data_api
15
15
  import mns_common.component.common_service_fun_api as common_service_fun_api
@@ -21,6 +21,7 @@ import mns_common.api.kpl.constant.kpl_constant as kpl_constant
21
21
  import mns_common.component.company.company_common_service_api as company_common_service_api
22
22
  import mns_common.component.k_line.common.k_line_common_service_api as k_line_common_service_api
23
23
  import mns_common.constant.db_name_constant as db_name_constant
24
+ import mns_scheduler.concept.common.detaill.ths_concept_detail_api as ths_concept_detail_api
24
25
 
25
26
  mongodb_util = MongodbUtil('27017')
26
27
  # 分页大小
@@ -187,7 +188,7 @@ def fix_company_industry(symbol):
187
188
 
188
189
  try:
189
190
  # 次新股
190
- sub_stock = ths_stock_api.ths_stock_concept('885598')
191
+ sub_stock = ths_concept_detail_api.get_ths_concept_detail('885598', None)
191
192
  sub_stock_symbol_list = list(sub_stock['symbol'])
192
193
  except BaseException as e:
193
194
  logger.error("出现异常:{},{}", symbol, e)
@@ -272,7 +273,7 @@ def single_thread_sync_company_info(east_money_stock_info,
272
273
  fail_list = []
273
274
  for company_one in east_money_stock_info.itertuples():
274
275
  try:
275
- company_info_type = ths_stock_api.get_company_info_detail(company_one.symbol)
276
+ company_info_type = ths_company_info_web.get_company_info_detail(company_one.symbol)
276
277
  company_info_type['first_industry_code'] = company_info_type['hycode'].apply(
277
278
  lambda x: x[1:3] + '0000')
278
279
  company_info_type['second_industry_code'] = company_info_type['hy2code'].apply(
@@ -502,11 +503,6 @@ def get_recent_year_income(symbol, company_info_type):
502
503
 
503
504
 
504
505
  if __name__ == '__main__':
505
- # while True:
506
- # df = ths_stock_api.get_company_info_detail('000001')
507
- # print(df)
508
- # company_info_update()
509
- # company_info_type = ths_stock_api.get_company_info_detail('836699')
510
506
  # sync_company_base_info()
511
507
  # fix_company_industry()
512
508
  # calculate_circu_ratio("601069")
@@ -514,6 +510,6 @@ if __name__ == '__main__':
514
510
  # 300293
515
511
  # sync_company_base_info(None)
516
512
  # new_company_info_update()
517
- sync_company_base_info(['920002'])
513
+ sync_company_base_info(None)
518
514
  fix_company_industry(None)
519
515
  # group_by_industry()
@@ -7,7 +7,7 @@ project_path = file_path[0:end]
7
7
  sys.path.append(project_path)
8
8
  from mns_common.db.MongodbUtil import MongodbUtil
9
9
  import pandas as pd
10
- import mns_common.api.ths.ths_stock_api as ths_stock_api
10
+ import mns_scheduler.concept.common.detaill.ths_concept_detail_api as ths_concept_detail_api
11
11
  import time
12
12
  from loguru import logger
13
13
  import mns_common.component.company.company_common_service_api as company_common_service_api
@@ -86,7 +86,7 @@ def update_null_name():
86
86
  exist_url = concept_one.url
87
87
 
88
88
  if name == '':
89
- concept_name = ths_stock_api.get_concept_name(concept_code)
89
+ concept_name = ths_concept_detail_api.get_ths_concept_detail(concept_code, None)
90
90
  query_concept = {"symbol": concept_code}
91
91
  new_values = {'$set': {"name": concept_name}}
92
92
  mongodb_util.update_one_query(query_concept, new_values, 'ths_concept_list')
File without changes
File without changes
@@ -0,0 +1,196 @@
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.api.em.east_money_stock_api as east_money_stock_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
+
20
+
21
+ def get_ths_concept_detail(concept_code, concept_name):
22
+ real_time_quotes_all_stocks = east_money_stock_api.get_real_time_quotes_all_stocks()
23
+ # 1 通过入选理获取概念组成股票详情
24
+ ths_concept_detail_by_explain = get_ths_concept_detail_by_explain(concept_code, real_time_quotes_all_stocks)
25
+ # 2 app 分享链接获取概念组成详情
26
+ ths_concept_detail_from_app = get_ths_concept_detail_from_app(concept_code, real_time_quotes_all_stocks)
27
+ # 3 通过问财
28
+ if concept_name is None or data_frame_util.is_string_empty(concept_name):
29
+ ths_concept_list = ths_concept_common_service_api.get_all_ths_concept()
30
+ ths_concept_one_df = ths_concept_list.loc[
31
+ (ths_concept_list['symbol'] == int(concept_code))
32
+ | (ths_concept_list['web_concept_code'] == int(concept_code))]
33
+ if data_frame_util.is_not_empty(ths_concept_one_df):
34
+ concept_name = list(ths_concept_one_df['name'])[0]
35
+ if data_frame_util.is_string_not_empty(concept_name) and concept_name is not None:
36
+ concept_detail_by_wen_cai_df = get_ths_concept_detail_by_wen_cai(concept_name, real_time_quotes_all_stocks)
37
+ else:
38
+ concept_detail_by_wen_cai_df = None
39
+ # 4 通过web端
40
+ ths_concept_detail_from_web_df = get_ths_concept_detail_from_web(concept_code, real_time_quotes_all_stocks)
41
+ # 判断是否都为空
42
+ all_are_none = all(
43
+ df is None for df in [ths_concept_detail_by_explain, ths_concept_detail_from_app,
44
+ concept_detail_by_wen_cai_df, ths_concept_detail_from_web_df])
45
+ if all_are_none:
46
+ return None
47
+ result_df = pd.concat([ths_concept_detail_by_explain, ths_concept_detail_from_app,
48
+ concept_detail_by_wen_cai_df, ths_concept_detail_from_web_df])
49
+
50
+ result_df.drop_duplicates('symbol', keep='last', inplace=True)
51
+ if data_frame_util.is_not_empty(ths_concept_detail_by_explain):
52
+ ths_concept_detail_by_explain_new = ths_concept_detail_by_explain.loc[
53
+ ths_concept_detail_by_explain['symbol'].isin(result_df['symbol'])]
54
+
55
+ not_in_ths_concept_detail_by_explain = result_df.loc[~(
56
+ result_df['symbol'].isin(ths_concept_detail_by_explain['symbol']))]
57
+ result_df = pd.concat([ths_concept_detail_by_explain_new, not_in_ths_concept_detail_by_explain])
58
+ return result_df
59
+
60
+
61
+ # 通过入选理获取概念组成股票详情
62
+ def get_ths_concept_detail_by_explain(concept_code, real_time_quotes_all_stocks):
63
+ page_size = 800
64
+
65
+ de_list_symbols = company_common_service_new_api.get_de_list_company()
66
+ real_time_quotes_all_stocks = real_time_quotes_all_stocks.loc[
67
+ ~(real_time_quotes_all_stocks['symbol'].isin(de_list_symbols))]
68
+
69
+ max_page_number = math.ceil(real_time_quotes_all_stocks.shape[0] / page_size)
70
+ page = 0
71
+
72
+ result_df = None
73
+
74
+ while page < max_page_number:
75
+ try:
76
+
77
+ begin_index = page * page_size
78
+ end_index = (page + 1) * page_size
79
+ page_df = real_time_quotes_all_stocks.iloc[begin_index: end_index]
80
+ code_list = ','.join(page_df['symbol'].astype(str))
81
+ all_ths_concept_detail = ths_concept_detail_app.get_concept_explain(concept_code, code_list)
82
+ if data_frame_util.is_empty(result_df) and data_frame_util.is_not_empty(all_ths_concept_detail):
83
+ result_df = all_ths_concept_detail
84
+ elif data_frame_util.is_not_empty(result_df) and data_frame_util.is_not_empty(all_ths_concept_detail):
85
+ result_df = pd.concat([all_ths_concept_detail, result_df])
86
+ except BaseException as e:
87
+ logger.error("通过ths概念入选理由列表获取详情异常:{},{}", concept_code, e)
88
+ page = page + 1
89
+ if data_frame_util.is_not_empty(result_df):
90
+ result_df = result_df[result_df['explain'].astype(str).str.len() > 0]
91
+ if data_frame_util.is_not_empty(result_df):
92
+ result_df = result_df.rename(columns={
93
+ "stockCode": "symbol",
94
+ "explain": "long"})
95
+ result_df = merge_data_common_fun(result_df, real_time_quotes_all_stocks)
96
+ return result_df
97
+ else:
98
+ return None
99
+
100
+
101
+ # 通过分享链接获取
102
+ def get_ths_concept_detail_from_app(concept_code, real_time_quotes_all_stocks):
103
+ ths_concept_detail_from_app = ths_concept_detail_app.get_ths_concept_detail_by_app(concept_code)
104
+ if data_frame_util.is_not_empty(ths_concept_detail_from_app):
105
+ ths_concept_detail_from_app['long'] = ''
106
+ ths_concept_detail_from_app = ths_concept_detail_from_app[[
107
+ 'symbol',
108
+ 'long'
109
+ ]]
110
+ ths_concept_detail_from_app = merge_data_common_fun(ths_concept_detail_from_app,
111
+ real_time_quotes_all_stocks)
112
+ return ths_concept_detail_from_app
113
+
114
+ else:
115
+ return None
116
+
117
+
118
+ # 3 通过问财
119
+ def get_ths_concept_detail_by_wen_cai(concept_name, real_time_quotes_all_stocks):
120
+ concept_detail_by_wen_cai_df = ths_wen_cai_api.get_concept_detail_by_wen_cai(concept_name)
121
+ if data_frame_util.is_not_empty(concept_detail_by_wen_cai_df):
122
+ concept_detail_by_wen_cai_df = concept_detail_by_wen_cai_df[[
123
+ 'symbol',
124
+ 'explain'
125
+ ]]
126
+
127
+ concept_detail_by_wen_cai_df = concept_detail_by_wen_cai_df.rename(columns={
128
+ "explain": "long"})
129
+ concept_detail_by_wen_cai_df = merge_data_common_fun(concept_detail_by_wen_cai_df,
130
+ real_time_quotes_all_stocks)
131
+
132
+ return concept_detail_by_wen_cai_df
133
+
134
+
135
+ # 通过web端 最近不可用
136
+ def get_ths_concept_detail_from_web(concept_code, real_time_quotes_all_stocks):
137
+ ths_concept_detail_from_web_df = ths_concept_detail_web.stock_board_cons_ths(concept_code)
138
+ if data_frame_util.is_not_empty(ths_concept_detail_from_web_df):
139
+ ths_concept_detail_from_web_df = ths_concept_detail_from_web_df[[
140
+ 'symbol'
141
+ ]]
142
+ ths_concept_detail_from_web_df['long'] = ''
143
+
144
+ ths_concept_detail_from_web_df = merge_data_common_fun(ths_concept_detail_from_web_df,
145
+ real_time_quotes_all_stocks)
146
+
147
+ return ths_concept_detail_from_web_df
148
+
149
+
150
+ def merge_data_common_fun(result_df, real_time_quotes_all_stocks):
151
+ real_time_quotes_ths_detail = real_time_quotes_all_stocks.loc[
152
+ real_time_quotes_all_stocks['symbol'].isin(result_df['symbol'])]
153
+ real_time_quotes_ths_detail = common_service_fun_api.total_mv_classification(real_time_quotes_ths_detail)
154
+ real_time_quotes_ths_detail = real_time_quotes_ths_detail[[
155
+ "symbol",
156
+ "name",
157
+ "now_price",
158
+ "chg",
159
+ "exchange",
160
+ "amount",
161
+ "flow_mv_sp",
162
+ "total_mv_sp"]]
163
+
164
+ query_field = {
165
+ "concept_name": 1,
166
+ "concept_code": 1,
167
+ "company_type": 1,
168
+ "concept_create_day": 1,
169
+ "first_relevance_industry": 1,
170
+ "second_relevance_industry": 1,
171
+ "industry": 1
172
+ }
173
+ query_field_key = str(query_field)
174
+ query_key = str({})
175
+ company_df = company_common_service_new_api.get_company_info_by_field(query_key, query_field_key)
176
+ company_ths_df = company_df.loc[company_df['_id'].isin(result_df['symbol'])]
177
+
178
+ result_df['short'] = result_df['long']
179
+ result_df = result_df.set_index(['symbol'], drop=True)
180
+ company_ths_df = company_ths_df.set_index(['_id'], drop=True)
181
+ real_time_quotes_ths_detail = real_time_quotes_ths_detail.set_index(['symbol'], drop=False)
182
+ result_df = pd.merge(real_time_quotes_ths_detail, result_df,
183
+ how='outer',
184
+ left_index=True, right_index=True)
185
+ result_df = pd.merge(result_df, company_ths_df,
186
+ how='outer',
187
+ left_index=True, right_index=True)
188
+ return result_df
189
+
190
+
191
+ if __name__ == '__main__':
192
+ get_ths_concept_detail('886073', '铜缆高速连接')
193
+ real_time_quotes_all_stocks_df = east_money_stock_api.get_real_time_quotes_all_stocks()
194
+ get_ths_concept_detail_from_web('886072', real_time_quotes_all_stocks_df)
195
+ get_ths_concept_detail_by_explain('886078', real_time_quotes_all_stocks_df)
196
+ get_ths_concept_detail_by_wen_cai('PCB概念', real_time_quotes_all_stocks_df)
@@ -2,7 +2,6 @@ import sys
2
2
  import os
3
3
 
4
4
  import pandas as pd
5
- import mns_common.api.ths.ths_stock_api as ths_stock_api
6
5
  from mns_common.db.MongodbUtil import MongodbUtil
7
6
  import mns_common.component.company.company_common_service_api as company_common_service_api
8
7
 
@@ -13,6 +12,7 @@ sys.path.append(project_path)
13
12
  mongodb_util = MongodbUtil('27017')
14
13
  import mns_common.api.msg.push_msg_api as push_msg_api
15
14
  import mns_scheduler.company_info.company_info_sync_api as company_info_sync_api
15
+ import mns_scheduler.concept.common.detaill.ths_concept_detail_api as ths_concept_detail_api
16
16
 
17
17
  max_concept_code = 886110
18
18
 
@@ -155,7 +155,7 @@ def update_company_info(new_concept_symbol_df):
155
155
 
156
156
 
157
157
  def get_concept_detail_info_web(concept_code):
158
- new_concept_symbol_list = ths_stock_api.ths_stock_concept(concept_code)
158
+ new_concept_symbol_list = ths_concept_detail_api.get_ths_concept_detail(concept_code, None)
159
159
  if new_concept_symbol_list is None or new_concept_symbol_list.shape[0] == 0:
160
160
  return None
161
161
  new_concept_symbol_list['_id'] = str(concept_code) + '-' + new_concept_symbol_list['symbol']
@@ -13,9 +13,7 @@ import mns_common.utils.data_frame_util as data_frame_util
13
13
  import mns_common.constant.db_name_constant as db_name_constant
14
14
  import mns_common.component.trade_date.trade_date_common_service_api as trade_date_common_service_api
15
15
  from datetime import datetime
16
- import mns_common.api.ths.ths_stock_api as ths_stock_api
17
- import pandas as pd
18
-
16
+ import mns_common.api.ths.concept.web.ths_concept_detail_web as ths_concept_detail_web
19
17
  mongodb_util = MongodbUtil('27017')
20
18
 
21
19
 
@@ -69,8 +67,7 @@ def update_null_reason(nan_reason_df):
69
67
  continue
70
68
  web_concept_code = list(ths_concept_one_df['web_concept_code'])[0]
71
69
 
72
- ths_concept_json = ths_stock_api.get_symbol_add_new_concept(nan_one.symbol)
73
- symbol_ths_concept_all_df = pd.DataFrame(ths_concept_json)
70
+ symbol_ths_concept_all_df = ths_concept_detail_web.get_one_symbol_all_ths_concepts(nan_one.symbol)
74
71
 
75
72
  symbol_ths_concept_one_df = symbol_ths_concept_all_df[
76
73
  symbol_ths_concept_all_df['cid'] == web_concept_code]
@@ -0,0 +1,170 @@
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.common.detaill.ths_concept_detail_api as ths_concept_detail_api
18
+ import mns_common.constant.db_name_constant as db_name_constant
19
+
20
+ mongodb_util = MongodbUtil('27017')
21
+
22
+
23
+ def sync_ths_concept_new_index():
24
+ # 同步ths新概念 通过app搜索
25
+ sync_ths_concept_new_index_from_app()
26
+ # 通过ths详情搜索
27
+ sync_ths_concept_new_index_from_detail()
28
+
29
+
30
+ '''
31
+ 同步ths新概念 通过app搜索
32
+ '''
33
+
34
+
35
+ def sync_ths_concept_new_index_from_app():
36
+ # 当前最大概念代码
37
+ max_concept_code = ths_concept_sync_common_api.get_max_concept_code()
38
+ # 最大概念代码上线
39
+ max_concept_code_limit = max_concept_code + 2
40
+ # 同花顺概念列表
41
+ ths_concept_list_exist = mongodb_util.find_all_data(db_name_constant.THS_CONCEPT_LIST)
42
+ # 同步向上3次
43
+ while max_concept_code <= max_concept_code_limit:
44
+ try:
45
+ max_concept_code = max_concept_code + 1
46
+ concept_new_index_df = ths_concept_index_app.get_new_concept_from_app_search(max_concept_code)
47
+ if data_frame_util.is_empty(concept_new_index_df):
48
+ continue
49
+ concept_name = list(concept_new_index_df['concept_name'])[0]
50
+
51
+ if data_frame_util.is_string_empty(concept_name):
52
+ concept_name = ths_concept_index_web.get_concept_name(max_concept_code)
53
+
54
+ exist_concept_df_one = ths_concept_list_exist.loc[
55
+ (ths_concept_list_exist['symbol'] == max_concept_code)
56
+ | (ths_concept_list_exist['web_concept_code'] == max_concept_code)]
57
+ now_date = datetime.now()
58
+ str_now_time = now_date.strftime('%Y-%m-%d %H:%M:%S')
59
+ str_day = now_date.strftime('%Y-%m-%d')
60
+ if data_frame_util.is_empty(exist_concept_df_one):
61
+ concept_code = max_concept_code
62
+
63
+ url = 'http://q.10jqka.com.cn/thshy/detail/code/' + str(concept_code)
64
+ new_concept_one = {
65
+ '_id': int(concept_code),
66
+ 'symbol': int(concept_code),
67
+ 'name': concept_name,
68
+ 'url': url,
69
+ 'str_day': str_day,
70
+ 'success': True,
71
+ 'str_now_time': str_now_time,
72
+ 'web_concept_code': concept_code,
73
+ 'web_concept_url': url,
74
+ 'valid': True
75
+ }
76
+ diff_one_df = pd.DataFrame(new_concept_one, index=[1])
77
+ mongodb_util.save_mongo(diff_one_df, db_name_constant.THS_CONCEPT_LIST)
78
+ # 新增概念信息处理
79
+ handle_new_concept_msg(concept_code, concept_name, url)
80
+
81
+ new_concept_symbol_detail_df = ths_concept_detail_api.get_ths_concept_detail(concept_code, concept_name)
82
+ if data_frame_util.is_empty(new_concept_symbol_detail_df):
83
+ continue
84
+ new_concept_symbol_detail_df.loc[:, 'way'] = 'index_sync'
85
+ ths_concept_sync_common_api.save_ths_concept_detail(new_concept_symbol_detail_df,
86
+ concept_name,
87
+ str_day,
88
+ str_now_time, concept_code)
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
+ }
142
+ diff_one_df = pd.DataFrame(new_concept_one, index=[1])
143
+ mongodb_util.save_mongo(diff_one_df, db_name_constant.THS_CONCEPT_LIST)
144
+ # 新增概念信息处理
145
+ handle_new_concept_msg(concept_code, concept_name, url)
146
+
147
+ new_concept_symbol_detail_df.loc[:, 'way'] = 'index_sync'
148
+ ths_concept_sync_common_api.save_ths_concept_detail(new_concept_symbol_detail_df,
149
+ concept_name,
150
+ str_day,
151
+ str_now_time,
152
+ concept_code)
153
+ # 更新ths概念统计信息
154
+ ths_concept_clean_api.update_ths_concept_info()
155
+
156
+ logger.info("新增同花顺新概念:{}", concept_name)
157
+
158
+ except BaseException as e:
159
+ logger.error("同步新增概念代码:{},信息异常:{}", max_concept_code, e)
160
+
161
+
162
+ # 新增消息处理
163
+ def handle_new_concept_msg(concept_code, concept_name, url):
164
+ # 推送新概念信息到微信
165
+ ths_concept_sync_common_api.push_msg_to_we_chat_web(concept_code, concept_name,
166
+ url)
167
+
168
+
169
+ if __name__ == '__main__':
170
+ sync_ths_concept_new_index_from_detail()
@@ -1,7 +1,7 @@
1
1
  import os
2
2
  import sys
3
3
  import pandas as pd
4
- import mns_common.api.ths.ths_stock_api as ths_stock_api
4
+ import mns_common.api.ths.concept.web.ths_concept_detail_web as ths_concept_detail_web
5
5
  import mns_common.api.em.east_money_stock_api as east_money_stock_api
6
6
  import mns_common.component.common_service_fun_api as common_service_fun_api
7
7
  from mns_common.db.MongodbUtil import MongodbUtil
@@ -86,9 +86,8 @@ def choose_type_new_concept(ths_concept_df):
86
86
  def update_symbol_new_concept(symbol_df, page_number):
87
87
  for stock_one in symbol_df.itertuples():
88
88
  try:
89
- ths_concept_json = ths_stock_api.get_symbol_add_new_concept(stock_one.symbol)
89
+ symbol_ths_concept_all_df = ths_concept_detail_web.get_symbol_add_new_concept(stock_one.symbol)
90
90
  logger.info("同步symbol概念信息:{}", stock_one.symbol)
91
- symbol_ths_concept_all_df = pd.DataFrame(ths_concept_json)
92
91
  if data_frame_util.is_empty(symbol_ths_concept_all_df):
93
92
  continue
94
93
 
@@ -179,4 +178,4 @@ def sync_symbol_all_concept(symbol):
179
178
 
180
179
 
181
180
  if __name__ == '__main__':
182
- sync_symbol_all_concept(None)
181
+ sync_symbol_all_concept('300085')
@@ -63,7 +63,7 @@ def sync_all_investigate_stocks(page_size, search_key, begin_day, end_day):
63
63
 
64
64
 
65
65
  # 立案调查的股票
66
- def sync_new_high_risk_stocks():
66
+ def sync_register_and_investigate_stocks():
67
67
  before_days = 60
68
68
  const_num = 30
69
69
  init_date = datetime.now()
@@ -124,7 +124,7 @@ def sync_new_high_risk_stocks():
124
124
 
125
125
 
126
126
  if __name__ == '__main__':
127
- sync_new_high_risk_stocks()
127
+ sync_register_and_investigate_stocks()
128
128
  # result_df = sync_all_investigate_stocks(30, '立案', '2023-01-01', '2024-06-15')
129
129
  # result_df = result_df.sort_values(by=['announcementTime'], ascending=False)
130
130
  # print(result_df)
@@ -6,7 +6,7 @@ end = file_path.index('mns') + 16
6
6
  project_path = file_path[0:end]
7
7
  sys.path.append(project_path)
8
8
 
9
- import mns_common.api.ths.ths_stock_api as ths_stock_api
9
+ import mns_scheduler.concept.common.detaill.ths_concept_detail_api as ths_concept_detail_api
10
10
  import mns_common.component.self_choose.black_list_service_api as black_list_service_api
11
11
  from datetime import datetime
12
12
  from loguru import logger
@@ -15,7 +15,7 @@ from mns_common.constant.black_list_classify_enum import BlackClassify
15
15
 
16
16
 
17
17
  def add_concept_to_lack_list(concept_code, reason):
18
- new_concept_symbol_list = ths_stock_api.ths_stock_concept(concept_code)
18
+ new_concept_symbol_list = ths_concept_detail_api.get_ths_concept_detail(concept_code, None)
19
19
  if data_frame_util.is_empty(new_concept_symbol_list):
20
20
  return None
21
21
 
@@ -7,7 +7,7 @@ project_path = file_path[0:end]
7
7
  sys.path.append(project_path)
8
8
  import pandas as pd
9
9
  import mns_common.api.akshare.stock_zt_pool_api as stock_zt_pool_api
10
- import mns_common.api.ths.ths_stock_zt_pool_api as ths_stock_zt_pool_api
10
+ import mns_common.api.ths.zt.ths_stock_zt_pool_api as ths_stock_zt_pool_api
11
11
  import mns_common.utils.date_handle_util as date_handle_util
12
12
  import mns_common.component.concept.ths_concept_common_service_api as ths_concept_common_service_api
13
13
  from mns_common.db.MongodbUtil import MongodbUtil
@@ -31,8 +31,6 @@ import \
31
31
  mns_scheduler.concept.ths.update_concept_info.sync_one_concept_all_symbols_api as sync_one_concept_all_symbols_api
32
32
  import \
33
33
  mns_scheduler.concept.ths.update_concept_info.sync_one_symbol_all_concepts_api as sync_one_symbol_all_concepts_api
34
- import mns_scheduler.concept.ths.sync_new_index.sync_ths_new_concept_by_web_api as sync_ths_new_concept_by_web_api
35
- import mns_scheduler.concept.ths.sync_new_index.sync_ths_concept_by_ak_api as sync_ths_concept_by_ak_api
36
34
  import mns_scheduler.kpl.selection.total.sync_kpl_best_total_sync_api as sync_kpl_best_total_sync_api
37
35
  import mns_scheduler.company_info.company_info_sync_api as company_info_sync_api
38
36
  import mns_scheduler.trade.auto_ipo_buy_api as auto_ipo_buy_api
@@ -47,6 +45,7 @@ import mns_scheduler.zt.high_chg.sync_high_chg_pool_service as sync_high_chg_poo
47
45
  import mns_scheduler.zt.high_chg.sync_high_chg_real_time_quotes_service as sync_high_chg_real_time_quotes_service
48
46
  import mns_scheduler.risk.self.wei_pan_stock_api as wei_pan_stock_api
49
47
  import mns_scheduler.risk.transactions.transactions_check_api as transactions_check_api
48
+ import mns_scheduler.concept.ths.sync_new_index.sync_ths_concept_new_index_api as sync_ths_concept_new_index_api
50
49
 
51
50
 
52
51
  # 同步交易日期任务完成
@@ -238,24 +237,14 @@ def concept_info_clean():
238
237
  def update_one_concept_all_symbol_detail():
239
238
  logger.info('同步概念下所有股票组成')
240
239
  sync_one_concept_all_symbols_api.update_concept_all_symbol_detail()
241
- update_ths_concept_choose_null_reason()
240
+ ths_concept_update_common_api.update_ths_concept_choose_null_reason()
242
241
 
243
242
 
244
243
  # 同步单只股票下所有概念 by 股票代码
245
244
  def update_one_symbol_all_concepts():
246
245
  logger.info('同步单只股票所有概念组成')
247
246
  sync_one_symbol_all_concepts_api.sync_symbol_all_concept(None)
248
- update_ths_concept_choose_null_reason()
249
-
250
-
251
- # 同步同花顺新增概念指数通过web端接口爬取 8开头
252
- def sync_new_concept_data_by_web():
253
- sync_ths_new_concept_by_web_api.sync_new_concept_data_by_web()
254
-
255
-
256
- # 同步同花顺新增概念指数通过ak_share接口爬取 3开头
257
- def sync_new_ths_concept_by_ak_api():
258
- sync_ths_concept_by_ak_api.sync_new_ths_concept_by_ak_api()
247
+ ths_concept_update_common_api.update_ths_concept_choose_null_reason()
259
248
 
260
249
 
261
250
  # 同步开盘啦精选指数
@@ -270,20 +259,22 @@ def update_best_choose_plate_relation():
270
259
  sync_kpl_best_total_sync_api.update_best_choose_plate_relation()
271
260
 
272
261
 
273
- # 同步新概念通过web端
274
- def sync_new_concept_data_web():
275
- # 同步同花顺新增概念指数通过web端接口爬取
276
- sync_new_concept_data_by_web()
277
- # 同步同花顺新增概念指数通过ak_share接口爬取
278
- sync_new_ths_concept_by_ak_api()
279
- update_ths_concept_choose_null_reason()
280
- logger.info("同步新概念web端数据任务完成")
262
+ # 同步ths新概念
263
+ def sync_new_concept_index():
264
+ sync_ths_concept_new_index_api.sync_ths_concept_new_index()
265
+ logger.info("同步ths新概念任务完成")
281
266
 
282
-
283
- # 更新空的入选概念
284
- def update_ths_concept_choose_null_reason():
285
- logger.info("更新空的入选概念")
286
267
  ths_concept_update_common_api.update_ths_concept_choose_null_reason()
268
+ logger.info("更新空的入选概念任务完成")
269
+
270
+
271
+ # 同步ths新概念 轮训任务
272
+ def sync_new_concept_index_task():
273
+ now_date = datetime.now()
274
+ hour = now_date.hour
275
+ if hour != 9:
276
+ sync_ths_concept_new_index_api.sync_ths_concept_new_index()
277
+ logger.info("同步ths新概念任务完成")
287
278
 
288
279
 
289
280
  # 清洗公司基本信息
@@ -325,9 +316,9 @@ def sync_kpl_best_his_quotes():
325
316
 
326
317
 
327
318
  # 同步高风险的股票
328
- def sync_new_high_risk_stocks():
319
+ def sync_high_risk_stocks():
329
320
  logger.info('同步被立案调查的股票')
330
- register_and_investigate_stock_sync_api.sync_new_high_risk_stocks()
321
+ register_and_investigate_stock_sync_api.sync_register_and_investigate_stocks()
331
322
  reason_detail = '微盘股拉黑'
332
323
  concept_code_wei_pan = '883418'
333
324
  wei_pan_stock_api.add_concept_to_lack_list(concept_code_wei_pan, reason_detail)
@@ -393,10 +384,10 @@ blockingScheduler.add_job(update_one_concept_all_symbol_detail, 'cron', hour='08
393
384
  blockingScheduler.add_job(update_one_symbol_all_concepts, 'cron', hour='09,18,12', minute='15')
394
385
 
395
386
  # 开盘前同步同花顺新概念指数
396
- blockingScheduler.add_job(sync_new_concept_data_web, 'cron', hour='09,22', minute='00,10,20,28')
387
+ blockingScheduler.add_job(sync_new_concept_index, 'cron', hour='09,22', minute='01,10,20,28,41,58')
397
388
 
398
389
  # 同步同花顺新增概念指数(定时轮训,暂时10分钟)
399
- # blockingScheduler.add_job(sync_new_concept_data_web, 'interval', minutes=10, max_instances=4)
390
+ blockingScheduler.add_job(sync_new_concept_index_task, 'interval', minutes=10, max_instances=4)
400
391
 
401
392
  # 同步开盘啦新增精选概念(定时轮训,暂时五分钟)
402
393
  blockingScheduler.add_job(sync_all_kpl_plate_info, 'interval', minutes=5, max_instances=4)
@@ -418,8 +409,8 @@ blockingScheduler.add_job(sync_kpl_best_his_quotes, 'cron', hour='18,22', minute
418
409
  # 更新开盘啦指数关系
419
410
  blockingScheduler.add_job(sync_position, 'cron', hour='0,08', minute='10')
420
411
 
421
- # 同步被立案调查的股票
422
- blockingScheduler.add_job(sync_new_high_risk_stocks, 'cron', hour='0,09,12,16', minute='20')
412
+ # 同步高风险股票
413
+ blockingScheduler.add_job(sync_high_risk_stocks, 'cron', hour='0,09,12,16', minute='20')
423
414
 
424
415
  # 同步互动回答
425
416
  blockingScheduler.add_job(sync_all_interactive_questions, 'cron', hour='08,12,17', minute='05')
@@ -1,4 +1,4 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mns-scheduler
3
- Version: 1.0.9.7
3
+ Version: 1.1.0.2
4
4
 
@@ -1,33 +1,34 @@
1
1
  mns_scheduler/__init__.py,sha256=Tyvi_iQlv3jz59EdH67Mycnt9CSixcWPQoJwu55bOq0,165
2
2
  mns_scheduler/backup/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
3
- mns_scheduler/backup/app/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
4
- mns_scheduler/backup/app/ths_new_concept_sync_app.py,sha256=kQShkBRWOs6Q5n-MuPDuuteuKpFZotvFDoc8RiftesQ,5223
5
3
  mns_scheduler/backup/em/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
6
4
  mns_scheduler/backup/em/em_new_concept_his_sync.py,sha256=Yqbuz9VE9433o0Z6BvDo5adhj3lK4vmN66XNQBIdC1k,4992
7
5
  mns_scheduler/backup/em/em_new_concept_sync_common_api.py,sha256=KnNCf0KXy31GFwF1-wbbkfDM-H7-cEtcVoCwl4QmoVs,7083
8
6
  mns_scheduler/backup/em/em_new_concept_sync_web.py,sha256=wVS0yLyPYzpcxfWAuUqmqbYkjw9wjpo48CvLSZFckzw,2334
9
- mns_scheduler/backup/wen_cai/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
10
- mns_scheduler/backup/wen_cai/wen_cai_concept_sync.py,sha256=boKtgOIXIsRny5n1keZm4luDFCiooudbPDsEFIGImIw,1747
7
+ mns_scheduler/backup/ths/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ mns_scheduler/backup/ths/sync_ths_concept_by_ak_api.py,sha256=8QBiRKc0Q3ez-kBwvz7G8HrFDD_ANd8smOpQtGyvKIs,5371
9
+ mns_scheduler/backup/ths/sync_ths_new_concept_by_web_api.py,sha256=dLd2V67AFnE9xf5H8YGyaJ0j7z8FhtTemFVGOuOeHJ4,4087
11
10
  mns_scheduler/big_deal/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
12
- mns_scheduler/big_deal/ths_big_deal_sync.py,sha256=wezGJWFRnKYBaPP9PVXLqMbHENOXgvJtw3HSGCSlX5c,4555
11
+ mns_scheduler/big_deal/ths_big_deal_sync.py,sha256=aMFj-_pLprh4vGjSSzmr_tlYoPA0L4Lm0SkLRkQwIiw,4564
13
12
  mns_scheduler/company_info/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
14
13
  mns_scheduler/company_info/company_constant_data.py,sha256=_JUan2ds_o4dMUwiPyKnF6oUQd8Nf2UqkHYhSv1FW08,14531
15
- mns_scheduler/company_info/company_info_sync_api.py,sha256=GBbeN0n7b3XOSfrKrpEIgjxBRAXVL9qcl_dljPscXgg,22643
14
+ mns_scheduler/company_info/company_info_sync_api.py,sha256=fCRHXGBx4ugJI3KydqhtjYAHXEmyTPIgr-NBhYPCOXM,22576
16
15
  mns_scheduler/company_info/de_list_stock_service.py,sha256=GCp6hlvO-SuH1oIpEsYZwEnGUOa6fXb2D7CqAUYXKQA,1993
17
16
  mns_scheduler/concept/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
18
17
  mns_scheduler/concept/clean/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
19
18
  mns_scheduler/concept/clean/kpl_concept_clean_api.py,sha256=xxIIgrXLI6xLf10t4unJa7aMB_QeKeki1HJVeXsntkY,4512
20
- mns_scheduler/concept/clean/ths_concept_clean_api.py,sha256=XjmlLlzJ6kLDAXyaQwZJ1maYJpjE7P3DO7S1ieHOHRo,5907
19
+ mns_scheduler/concept/clean/ths_concept_clean_api.py,sha256=42sbd8VqJeOKxJuxLVsU9YFK_YUSePTGrK2AWbabhA0,5964
20
+ mns_scheduler/concept/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
+ mns_scheduler/concept/common/detaill/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ mns_scheduler/concept/common/detaill/ths_concept_detail_api.py,sha256=tRuSkET-lw1M7rHDImrIM_1X-uMhxq_zF_d3FX1DoUc,9378
21
23
  mns_scheduler/concept/ths/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
22
24
  mns_scheduler/concept/ths/common/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
23
- mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py,sha256=8KOz1AlUFmo0hdlkOuc5rDLKIeYkRK3-ooA5Z_wJX10,6724
24
- mns_scheduler/concept/ths/common/ths_concept_update_common_api.py,sha256=9yROs3rDL54hVaDjXE34jddf8fsmp5njh_p5it9x9pE,4460
25
+ mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py,sha256=W-Bu2PVFOTh5h2h_27_RcszXLRLq6TU1hCg9y_FGVyw,6780
26
+ mns_scheduler/concept/ths/common/ths_concept_update_common_api.py,sha256=4BQT3A9t-nDIyCpILgRZF7ZOgK1oabp-gJl5nyWvKWc,4418
25
27
  mns_scheduler/concept/ths/sync_new_index/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
26
- mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_by_ak_api.py,sha256=QisRyO-76s4452F6WmMFLcDr0XZRFdfQhdCt5uinCe4,5315
27
- mns_scheduler/concept/ths/sync_new_index/sync_ths_new_concept_by_web_api.py,sha256=K991XQCe4PqwERRrBAZTpIfo9iu2zC2ncJUWkN_OBBM,3990
28
+ mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_new_index_api.py,sha256=9ol2cvxSO2Ot4Z5fmlo9tUPFe6WwsuVX_H9ogtv3QrI,7841
28
29
  mns_scheduler/concept/ths/update_concept_info/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
29
30
  mns_scheduler/concept/ths/update_concept_info/sync_one_concept_all_symbols_api.py,sha256=ipRtiihpHlbxuces7YpHfvBtCDxgzrVXjcCKZiFBPaw,1928
30
- mns_scheduler/concept/ths/update_concept_info/sync_one_symbol_all_concepts_api.py,sha256=OuRgGcBsehEc-Y8awZIsN7Xq3wOilh-XLkfQvL_iHRU,8852
31
+ mns_scheduler/concept/ths/update_concept_info/sync_one_symbol_all_concepts_api.py,sha256=oPDi3h4BZWBUPnj3QeIvXhlqhL80_U6oiTuOEblSu54,8832
31
32
  mns_scheduler/db/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
32
33
  mns_scheduler/db/col_move_service.py,sha256=1XMuC9E9eif8eeLWqnby_c9uhuoZO0ZaMa5xssWe4Wg,4090
33
34
  mns_scheduler/db/db_status.py,sha256=K1jtYIGZzDV6knpoJLLnXEhN3tyziJp_zY2gSfguHCA,747
@@ -87,9 +88,9 @@ mns_scheduler/risk/financial/net_assets_check_api.py,sha256=TPiTDMlX8X7-rkx97M8b
87
88
  mns_scheduler/risk/financial/profit_income_check_api.py,sha256=4iGZEIveq5SIOBziyMH72oxSKbQJ3WfyjUMhDJfxUEU,4358
88
89
  mns_scheduler/risk/financial/stock_equity_mortgage_check_api.py,sha256=SQ7dieSCOf1z42Wi1zDEii3poAT5wfyBrV43dXkAaaw,22
89
90
  mns_scheduler/risk/major_violations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
- mns_scheduler/risk/major_violations/register_and_investigate_stock_sync_api.py,sha256=XcJcVpu2qjIzXGuNCYC5J8AJX69eScPxTv6WugaXwt4,5650
91
+ mns_scheduler/risk/major_violations/register_and_investigate_stock_sync_api.py,sha256=_xPQxT6OS7J7_PtA7hbfCmMS7VzpZTWoZUOXzwoesUs,5672
91
92
  mns_scheduler/risk/self/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
- mns_scheduler/risk/self/wei_pan_stock_api.py,sha256=PRaFmdnQ7763ngEYAcBkQ7FGP9CJENJZnLfO7bAn1c0,1846
93
+ mns_scheduler/risk/self/wei_pan_stock_api.py,sha256=osU3XrPZXDzPdtVCq601ZlSTZUqIhGxoXsowWgPAM4w,1902
93
94
  mns_scheduler/risk/test/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
94
95
  mns_scheduler/risk/test/fix_blask_list.py,sha256=jjLhhIWH1L4CgNp2jQ_HAHbC3wVgeX1TzhqC--_D2MI,1249
95
96
  mns_scheduler/risk/transactions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -114,11 +115,11 @@ mns_scheduler/zt/script/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda
114
115
  mns_scheduler/zt/script/kcx_high_chg_open_his_data_handle.py,sha256=qSlcd4dq1A9MjV-5ikyrtGEzxOwXKpWCD9FSzGpatTo,6118
115
116
  mns_scheduler/zt/script/sync_high_chg_pool_his_data.py,sha256=R0syG5gcXRlLxswbBlE6hpKUK1mjERgUJ3dX0X7bXjE,1691
116
117
  mns_scheduler/zt/zt_pool/__init__.py,sha256=Tyvi_iQlv3jz59EdH67Mycnt9CSixcWPQoJwu55bOq0,165
117
- mns_scheduler/zt/zt_pool/zt_pool_sync_api.py,sha256=Uca9fcnxIiz5Pfe1Ot_IgRu7zA7KqM7wtOHkMKF2kSo,7604
118
+ mns_scheduler/zt/zt_pool/zt_pool_sync_api.py,sha256=YusilleacIhhks1m7qkYHdBS16yvjai2avCSfrDpWAg,7607
118
119
  mns_scheduler/zz_task/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
119
- mns_scheduler/zz_task/data_sync_task.py,sha256=qp56htTa7E38a5A-xI7cSXc3osvBt6vvGoz0JDm1Xf8,17723
120
+ mns_scheduler/zz_task/data_sync_task.py,sha256=Nl-hSRxrgdQh57UubES_MtI0RBYDaZUnBb-M_Sr6Bd8,17319
120
121
  mns_scheduler/zz_task/sync_realtime_quotes_task.py,sha256=DN3bq2XCDZC-PHlbD2NTog48bR44EruIEc2QVGKg7Tk,932
121
- mns_scheduler-1.0.9.7.dist-info/METADATA,sha256=SGR9dt1FOEUr8_XsVagb-65B5E-QaC3_19v78IHEXwA,64
122
- mns_scheduler-1.0.9.7.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
123
- mns_scheduler-1.0.9.7.dist-info/top_level.txt,sha256=PXQDFBGR1pWmsUbH5yiLAh71P5HZODTRED0zJ8CCgOc,14
124
- mns_scheduler-1.0.9.7.dist-info/RECORD,,
122
+ mns_scheduler-1.1.0.2.dist-info/METADATA,sha256=Es8f0EL6Evt89ypZrAYq1q2HFcg_Xr0v-5xamio_y50,64
123
+ mns_scheduler-1.1.0.2.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
124
+ mns_scheduler-1.1.0.2.dist-info/top_level.txt,sha256=PXQDFBGR1pWmsUbH5yiLAh71P5HZODTRED0zJ8CCgOc,14
125
+ mns_scheduler-1.1.0.2.dist-info/RECORD,,
@@ -1,7 +0,0 @@
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)
@@ -1,122 +0,0 @@
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.ths_stock_api as ths_stock_api
9
- import datetime
10
- import time
11
- import mns_common.api.msg.push_msg_api as push_msg_api
12
- from loguru import logger
13
- import mns_scheduler.concept.ths.common.ths_concept_sync_common_api as ths_concept_sync_common_api
14
- import pandas as pd
15
- from mns_common.db.MongodbUtil import MongodbUtil
16
-
17
- mongodb_util = MongodbUtil('27017')
18
-
19
-
20
- # app 端获取新增概念信息 接口不稳定
21
-
22
- # 获取最大概念代码
23
- def get_max_concept_name():
24
- query = {"symbol": {'$ne': 'null'}, "success": True}
25
- return mongodb_util.descend_query(query, 'ths_concept_list', 'symbol', 1)
26
-
27
-
28
- # 获取app端新概念名称
29
- def get_concept_detail_info_app(concept_code):
30
- return ths_stock_api.get_new_concept_code_app(concept_code)
31
-
32
-
33
- # 获取app端新概念详细列表
34
- def get_new_concept_detail_list_app(concept_code):
35
- new_concept_symbol_list = ths_stock_api.get_new_concept_list_app(concept_code)
36
- if new_concept_symbol_list is None or new_concept_symbol_list.shape == 0:
37
- return None
38
- new_concept_symbol_list = new_concept_symbol_list[ths_concept_sync_common_api.order_fields]
39
- new_concept_symbol_list['_id'] = str(concept_code) + '-' + new_concept_symbol_list['symbol']
40
- return new_concept_symbol_list
41
-
42
-
43
- # 推送新概念信息到微信
44
- def push_msg_to_we_chat_app(concept_code, concept_name):
45
- url = f'https://m.10jqka.com.cn/hq/industry.html#code={concept_code}&refCountId=R_55ba2964_186'
46
- msg = "概念代码:" + str(concept_code) + "," + "概念名称:" + concept_name + "," + "url: " + url
47
- title = "新增概念:" + str(concept_code) + "-" + concept_name
48
- push_msg_api.push_msg_to_wechat(title, msg)
49
-
50
-
51
- # 保存新概念信息到数据库
52
- def save_ths_concept_list_app(concept_code, concept_name, str_day, str_now_time, success):
53
- concept_code = int(concept_code)
54
- url = 'https://m.10jqka.com.cn/hq/industry.html#code=' + str(concept_code) + '&refCountId=R_55ba2964_186'
55
- ths_concept_list = pd.DataFrame([
56
- [concept_code, concept_code, concept_name, str_day, url, str_now_time, success],
57
- ], columns=['_id', 'symbol', 'name', 'str_day', 'url', 'str_now_time', 'success'])
58
-
59
- mongodb_util.save_mongo(ths_concept_list, 'ths_concept_list')
60
-
61
-
62
- # 同步新概念信息 从app爬取
63
- def sync_new_concept_data():
64
- max_concept_name = get_max_concept_name()
65
- try:
66
- now_date = datetime.datetime.now()
67
- str_day = now_date.strftime('%Y-%m-%d')
68
- str_now_time = now_date.strftime('%Y-%m-%d %H:%M:%S')
69
- concept_code = list(max_concept_name['symbol'])[0]
70
- success = list(max_concept_name['success'])[0]
71
- if success:
72
- concept_code = concept_code + 1
73
-
74
- new_concept_df = get_concept_detail_info_app(concept_code)
75
- if new_concept_df is None or new_concept_df.shape[0] == 0:
76
- time.sleep(1)
77
- return None
78
-
79
- concept_name = list(new_concept_df['concept_name'])[0]
80
- concept_code = list(new_concept_df['concept_code'])[0]
81
- if success:
82
- # 推送新概念信息到微信
83
- push_msg_to_we_chat_app(concept_code, concept_name)
84
- # 获取新概念详细信息
85
- new_concept_symbol_list = get_new_concept_detail_list_app(concept_code)
86
-
87
- if new_concept_symbol_list is None or new_concept_symbol_list.shape[0] == 0:
88
- # 保存新概念信息到数据库
89
- query = {"symbol": int(concept_code), "success": True}
90
- exist_success = mongodb_util.exist_data_query('ths_concept_list', query)
91
- if bool(1 - exist_success):
92
- save_ths_concept_list_app(concept_code, concept_name, str_day, str_now_time, False)
93
- time.sleep(1)
94
-
95
- else:
96
- # 保存新概念信息到数据库
97
- save_ths_concept_list_app(concept_code, concept_name, str_day, str_now_time, True)
98
- new_concept_symbol_list.loc[:, 'way'] = 'index_sync'
99
- # 保存新概念详细信息到数据库
100
- ths_concept_sync_common_api.save_ths_concept_detail(new_concept_symbol_list, concept_name, str_day,
101
- str_now_time, concept_code)
102
- time.sleep(1)
103
-
104
- except BaseException as e:
105
- logger.error("同步新概念异常:{},concept_code:{}", e, concept_code)
106
-
107
-
108
- if __name__ == '__main__':
109
- # myquery1 = {"symbol": {"$ne": 'null'}}
110
- # newvalues1 = {"$set": {"success": True}}
111
- #
112
- # mongodb_util_remote.update_many(myquery1, newvalues1, 'ths_concept_list')
113
- # concept_df = get_concept_detail_info_app('886033')
114
- df = get_new_concept_detail_list_app('883418')
115
- print(df)
116
- # sync_new_concept_data()
117
- # code = 886026
118
- # while True:
119
- # symbol_new_concept = get_concept_detail_info_app(code)
120
- # logger.info(symbol_new_concept)
121
- # new_concept_symbols = ths_stock_api.get_new_concept_list_app(code)
122
- # logger.info(new_concept_symbols)
@@ -1,7 +0,0 @@
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)
@@ -1,51 +0,0 @@
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
- from datetime import datetime
9
- import mns_common.api.ths.ths_stock_api as ths_stock_api
10
- import mns_common.utils.date_handle_util as date_handle_util
11
- import mns_common.utils.data_frame_util as data_frame_util
12
-
13
-
14
- def sync_wei_concept_data():
15
- now_date = datetime.now()
16
- str_day = now_date.strftime('%Y-%m-%d')
17
- number = 1
18
- result = None
19
- while True:
20
- wen_cai_concept_df = ths_stock_api.ths_concept_wen_cai(date_handle_util.no_slash_date(str_day),
21
- str(number))
22
- result = data_frame_util.merge_choose_data_no_drop(result, wen_cai_concept_df)
23
- if wen_cai_concept_df.shape[0] < 50:
24
- break
25
- number = number + 1
26
- result = result.rename(columns={"股票代码": "symbol",
27
- "股票简称": "name",
28
- "最新价": "price",
29
- "最新涨跌幅": "chg",
30
- "所属概念": "concepts",
31
- "所属概念数量": "concept_num"
32
- })
33
- result = result[[
34
- 'symbol',
35
- 'name',
36
- 'price',
37
- 'chg',
38
- 'concepts',
39
- 'concept_num',
40
- 'market_code',
41
- 'code',
42
- ]]
43
- result['chg'].fillna(0, inplace=True)
44
- result['price'].fillna(0, inplace=True)
45
- result['concepts'].fillna(0, inplace=True)
46
- return result
47
-
48
-
49
- if __name__ == '__main__':
50
- df = sync_wei_concept_data()
51
- print(df)