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.
- mns_scheduler/backup/ths/__init__.py +0 -0
- mns_scheduler/{concept/ths/sync_new_index → backup/ths}/sync_ths_concept_by_ak_api.py +3 -3
- mns_scheduler/{concept/ths/sync_new_index → backup/ths}/sync_ths_new_concept_by_web_api.py +4 -5
- mns_scheduler/big_deal/ths_big_deal_sync.py +1 -1
- mns_scheduler/company_info/company_info_sync_api.py +5 -9
- mns_scheduler/concept/clean/ths_concept_clean_api.py +2 -2
- mns_scheduler/concept/common/__init__.py +0 -0
- mns_scheduler/concept/common/detaill/__init__.py +0 -0
- mns_scheduler/concept/common/detaill/ths_concept_detail_api.py +196 -0
- mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py +2 -2
- mns_scheduler/concept/ths/common/ths_concept_update_common_api.py +2 -5
- mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_new_index_api.py +170 -0
- mns_scheduler/concept/ths/update_concept_info/sync_one_symbol_all_concepts_api.py +3 -4
- mns_scheduler/risk/major_violations/register_and_investigate_stock_sync_api.py +2 -2
- mns_scheduler/risk/self/wei_pan_stock_api.py +2 -2
- mns_scheduler/zt/zt_pool/zt_pool_sync_api.py +1 -1
- mns_scheduler/zz_task/data_sync_task.py +23 -32
- {mns_scheduler-1.0.9.7.dist-info → mns_scheduler-1.1.0.2.dist-info}/METADATA +1 -1
- {mns_scheduler-1.0.9.7.dist-info → mns_scheduler-1.1.0.2.dist-info}/RECORD +21 -20
- mns_scheduler/backup/app/__init__.py +0 -7
- mns_scheduler/backup/app/ths_new_concept_sync_app.py +0 -122
- mns_scheduler/backup/wen_cai/__init__.py +0 -7
- mns_scheduler/backup/wen_cai/wen_cai_concept_sync.py +0 -51
- {mns_scheduler-1.0.9.7.dist-info → mns_scheduler-1.1.0.2.dist-info}/WHEEL +0 -0
- {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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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.
|
|
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 =
|
|
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 =
|
|
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(
|
|
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
|
|
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 =
|
|
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 =
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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(
|
|
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
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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
|
-
#
|
|
274
|
-
def
|
|
275
|
-
|
|
276
|
-
|
|
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
|
|
319
|
+
def sync_high_risk_stocks():
|
|
329
320
|
logger.info('同步被立案调查的股票')
|
|
330
|
-
register_and_investigate_stock_sync_api.
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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,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/
|
|
10
|
-
mns_scheduler/backup/
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
24
|
-
mns_scheduler/concept/ths/common/ths_concept_update_common_api.py,sha256=
|
|
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/
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
122
|
-
mns_scheduler-1.0.
|
|
123
|
-
mns_scheduler-1.0.
|
|
124
|
-
mns_scheduler-1.0.
|
|
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,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,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)
|
|
File without changes
|
|
File without changes
|