mns-scheduler 1.1.0.3__py3-none-any.whl → 1.1.0.4__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/em/em_new_concept_sync_common_api.py +1 -1
- mns_scheduler/company_info/base/__init__.py +7 -0
- mns_scheduler/company_info/{company_info_sync_api.py → base/sync_company_base_info_api.py} +31 -155
- mns_scheduler/company_info/clean/__init__.py +7 -0
- mns_scheduler/company_info/clean/company_info_clean_api.py +112 -0
- mns_scheduler/company_info/constant/__init__.py +7 -0
- mns_scheduler/company_info/{company_constant_data.py → constant/company_constant_data.py} +56 -2
- mns_scheduler/company_info/de_list_stock/__init__.py +7 -0
- mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py +4 -3
- mns_scheduler/db/db_status.py +1 -1
- mns_scheduler/zz_task/data_sync_task.py +5 -5
- mns_scheduler/zz_task/sync_realtime_quotes_task.py +2 -2
- {mns_scheduler-1.1.0.3.dist-info → mns_scheduler-1.1.0.4.dist-info}/METADATA +1 -1
- {mns_scheduler-1.1.0.3.dist-info → mns_scheduler-1.1.0.4.dist-info}/RECORD +17 -12
- /mns_scheduler/company_info/{de_list_stock_service.py → de_list_stock/de_list_stock_service.py} +0 -0
- {mns_scheduler-1.1.0.3.dist-info → mns_scheduler-1.1.0.4.dist-info}/WHEEL +0 -0
- {mns_scheduler-1.1.0.3.dist-info → mns_scheduler-1.1.0.4.dist-info}/top_level.txt +0 -0
|
@@ -110,7 +110,7 @@ def save_ths_concept_detail(new_concept_symbol_df, concept_name, str_day, str_no
|
|
|
110
110
|
query_company_info = {'symbol': {'$in': new_concept_symbol_list}}
|
|
111
111
|
query_field = {"first_industry": 1, "first_industry": 1, "industry": 1, "company_type": 1, "flow_mv_sp": 1,
|
|
112
112
|
"total_mv_sp": 1}
|
|
113
|
-
company_info = mongodb_util.find_query_data_choose_field('
|
|
113
|
+
company_info = mongodb_util.find_query_data_choose_field('base', query_company_info, query_field)
|
|
114
114
|
|
|
115
115
|
company_info = company_info.set_index(['_id'], drop=True)
|
|
116
116
|
new_concept_symbol_df = new_concept_symbol_df.set_index(['symbol'], drop=False)
|
|
@@ -11,7 +11,7 @@ import pandas as pd
|
|
|
11
11
|
from loguru import logger
|
|
12
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
|
-
import mns_scheduler.company_info.company_constant_data as
|
|
14
|
+
import mns_scheduler.company_info.constant.company_constant_data as company_constant_data
|
|
15
15
|
import mns_common.component.common_service_fun_api as common_service_fun_api
|
|
16
16
|
import mns_common.component.concept.ths_concept_common_service_api as ths_concept_common_service_api
|
|
17
17
|
from mns_common.db.MongodbUtil import MongodbUtil
|
|
@@ -21,11 +21,10 @@ 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
|
|
25
24
|
|
|
26
25
|
mongodb_util = MongodbUtil('27017')
|
|
27
26
|
# 分页大小
|
|
28
|
-
MAX_PAGE_NUMBER =
|
|
27
|
+
MAX_PAGE_NUMBER = 2000
|
|
29
28
|
import threading
|
|
30
29
|
|
|
31
30
|
# 定义一个全局锁,用于保护 result 变量的访问
|
|
@@ -58,60 +57,6 @@ def calculate_circu_ratio(symbol):
|
|
|
58
57
|
return mv_circulation_ratio
|
|
59
58
|
|
|
60
59
|
|
|
61
|
-
def filed_sort(company_info):
|
|
62
|
-
return company_info[[
|
|
63
|
-
"_id",
|
|
64
|
-
"name",
|
|
65
|
-
"industry",
|
|
66
|
-
"first_sw_industry",
|
|
67
|
-
"first_industry_code",
|
|
68
|
-
"second_sw_industry",
|
|
69
|
-
"second_industry_code",
|
|
70
|
-
"third_sw_industry",
|
|
71
|
-
"third_industry_code",
|
|
72
|
-
"ths_concept_name",
|
|
73
|
-
"ths_concept_code",
|
|
74
|
-
"ths_concept_sync_day",
|
|
75
|
-
"em_industry",
|
|
76
|
-
"em_concept",
|
|
77
|
-
"business_nature",
|
|
78
|
-
"actual_controller_name",
|
|
79
|
-
"actual_controller_rate",
|
|
80
|
-
"final_controller_name",
|
|
81
|
-
"final_controller_rate",
|
|
82
|
-
"mv_circulation_ratio",
|
|
83
|
-
"flow_mv_sp",
|
|
84
|
-
"total_mv_sp",
|
|
85
|
-
"now_price",
|
|
86
|
-
"total_share",
|
|
87
|
-
"flow_share",
|
|
88
|
-
"total_mv",
|
|
89
|
-
"flow_mv",
|
|
90
|
-
"flow_mv_level",
|
|
91
|
-
"holder_controller_name",
|
|
92
|
-
"holder_controller_rate",
|
|
93
|
-
"area",
|
|
94
|
-
"list_date",
|
|
95
|
-
"deal_days",
|
|
96
|
-
"pe_ttm",
|
|
97
|
-
"pb",
|
|
98
|
-
"ROE",
|
|
99
|
-
"classification",
|
|
100
|
-
"base_business",
|
|
101
|
-
"address",
|
|
102
|
-
"market_id",
|
|
103
|
-
"symbol",
|
|
104
|
-
"amount",
|
|
105
|
-
"sync_date",
|
|
106
|
-
"ths_concept_list_info",
|
|
107
|
-
"kpl_plate_name",
|
|
108
|
-
"kpl_most_relative_name",
|
|
109
|
-
"kpl_plate_list_info",
|
|
110
|
-
'operate_profit',
|
|
111
|
-
'total_operate_income'
|
|
112
|
-
]]
|
|
113
|
-
|
|
114
|
-
|
|
115
60
|
def get_east_money_stock_info():
|
|
116
61
|
all_real_time_quotes = east_money_stock_v2_api.get_all_real_time_quotes()
|
|
117
62
|
all_real_time_quotes = all_real_time_quotes[['symbol',
|
|
@@ -147,81 +92,7 @@ def create_index():
|
|
|
147
92
|
[("symbol", 1)])
|
|
148
93
|
|
|
149
94
|
|
|
150
|
-
#
|
|
151
|
-
def fix_company_industry(symbol):
|
|
152
|
-
if symbol is not None:
|
|
153
|
-
query = {"symbol": symbol}
|
|
154
|
-
company_info = mongodb_util.find_query_data('company_info_base', query)
|
|
155
|
-
else:
|
|
156
|
-
company_info = mongodb_util.find_all_data('company_info_base')
|
|
157
|
-
|
|
158
|
-
company_info = company_info.set_index(['second_sw_industry'], drop=False)
|
|
159
|
-
del company_info['industry']
|
|
160
|
-
# fix industry name
|
|
161
|
-
industry_final_fix_df = company_constant_data_api.get_industry_final_fix_df()
|
|
162
|
-
industry_final_fix_df = industry_final_fix_df.set_index(['second_sw_industry'], drop=True)
|
|
163
|
-
company_info = pd.merge(company_info, industry_final_fix_df, how='outer',
|
|
164
|
-
left_index=True, right_index=True)
|
|
165
|
-
# 将申万第三行业做为行业
|
|
166
|
-
company_info = company_constant_data_api.fix_industry_use_sw_third(company_info.copy())
|
|
167
|
-
company_info['industry'] = company_info['industry'].fillna('综合')
|
|
168
|
-
company_info = filed_sort(company_info)
|
|
169
|
-
company_info['company_type'] = company_info['business_nature']
|
|
170
|
-
|
|
171
|
-
# 将list_date列中的所有NaN值设置为99990909
|
|
172
|
-
company_info['list_date'].fillna(20990909.0, inplace=True)
|
|
173
|
-
|
|
174
|
-
# 将日期数值转换为日期时间格式
|
|
175
|
-
company_info['list_date_01'] = pd.to_datetime(company_info['list_date'], format='%Y%m%d')
|
|
176
|
-
|
|
177
|
-
company_info['list_date'] = company_info['list_date'].apply(
|
|
178
|
-
lambda x: pd.to_numeric(x, errors="coerce"))
|
|
179
|
-
|
|
180
|
-
now_date = datetime.now()
|
|
181
|
-
|
|
182
|
-
# 计算日期差值 距离现在上市时间
|
|
183
|
-
company_info['diff_days'] = company_info.apply(
|
|
184
|
-
lambda row: (now_date - row['list_date_01']).days, axis=1)
|
|
185
|
-
|
|
186
|
-
str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
|
|
187
|
-
company_info['sync_date'] = str_now_date
|
|
188
|
-
|
|
189
|
-
try:
|
|
190
|
-
# 次新股
|
|
191
|
-
sub_stock = ths_concept_detail_api.get_ths_concept_detail('885598', None)
|
|
192
|
-
sub_stock_symbol_list = list(sub_stock['symbol'])
|
|
193
|
-
except BaseException as e:
|
|
194
|
-
logger.error("出现异常:{},{}", symbol, e)
|
|
195
|
-
query = {'concept_code': 885598}
|
|
196
|
-
ths_stock_concept_detail = mongodb_util.find_query_data('ths_stock_concept_detail', query)
|
|
197
|
-
sub_stock_symbol_list = list(ths_stock_concept_detail['symbol'])
|
|
198
|
-
company_info.loc[:, 'sub_stock'] = False
|
|
199
|
-
company_info.loc[company_info['symbol'].isin(sub_stock_symbol_list), 'sub_stock'] = True
|
|
200
|
-
|
|
201
|
-
try:
|
|
202
|
-
company_info.dropna(subset=['symbol'], axis=0, inplace=True)
|
|
203
|
-
company_info.dropna(subset=['_id'], axis=0, inplace=True)
|
|
204
|
-
mongodb_util.save_mongo(company_info, db_name_constant.COMPANY_INFO)
|
|
205
|
-
# 保存历史数据
|
|
206
|
-
save_company_info_his(company_info)
|
|
207
|
-
except BaseException as e:
|
|
208
|
-
logger.error("出现异常:{},{}", symbol, e)
|
|
209
|
-
|
|
210
|
-
return company_info
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
def save_company_info_his(company_info_df):
|
|
214
|
-
now_date = datetime.now()
|
|
215
|
-
str_day = now_date.strftime('%Y-%m-%d')
|
|
216
|
-
company_info_df['symbol'] = company_info_df['_id']
|
|
217
|
-
company_info_df['str_day'] = str_day
|
|
218
|
-
company_info_df['_id'] = company_info_df['_id'] + "_" + str_day
|
|
219
|
-
remove_query = {'str_day': str_day}
|
|
220
|
-
tag = mongodb_util.remove_data(remove_query, db_name_constant.COMPANY_INFO_HIS)
|
|
221
|
-
success = tag.acknowledged
|
|
222
|
-
if success:
|
|
223
|
-
mongodb_util.insert_mongo(company_info_df, db_name_constant.COMPANY_INFO_HIS)
|
|
224
|
-
|
|
95
|
+
# 同步公司基本信息
|
|
225
96
|
|
|
226
97
|
def sync_company_base_info(symbol_list):
|
|
227
98
|
global result
|
|
@@ -250,12 +121,16 @@ def sync_company_base_info(symbol_list):
|
|
|
250
121
|
page_number = round(count / MAX_PAGE_NUMBER, 0) + 1
|
|
251
122
|
page_number = int(page_number)
|
|
252
123
|
threads = []
|
|
124
|
+
|
|
125
|
+
exist_company_df = mongodb_util.find_all_data(db_name_constant.COMPANY_INFO)
|
|
126
|
+
|
|
253
127
|
# 创建多个线程来获取数据
|
|
254
128
|
for page in range(page_number): # 0到100页
|
|
255
129
|
end_count = (page + 1) * MAX_PAGE_NUMBER
|
|
256
130
|
begin_count = page * MAX_PAGE_NUMBER
|
|
257
131
|
page_df = east_money_stock_info.loc[begin_count:end_count]
|
|
258
|
-
thread = threading.Thread(target=single_thread_sync_company_info,
|
|
132
|
+
thread = threading.Thread(target=single_thread_sync_company_info,
|
|
133
|
+
args=(page_df, kpl_real_time_quotes, exist_company_df))
|
|
259
134
|
threads.append(thread)
|
|
260
135
|
thread.start()
|
|
261
136
|
|
|
@@ -264,11 +139,11 @@ def sync_company_base_info(symbol_list):
|
|
|
264
139
|
thread.join()
|
|
265
140
|
|
|
266
141
|
fail_df = east_money_stock_info.loc[east_money_stock_info['symbol'].isin(result)]
|
|
267
|
-
single_thread_sync_company_info(fail_df, kpl_real_time_quotes)
|
|
142
|
+
single_thread_sync_company_info(fail_df, kpl_real_time_quotes, exist_company_df)
|
|
268
143
|
|
|
269
144
|
|
|
270
145
|
def single_thread_sync_company_info(east_money_stock_info,
|
|
271
|
-
kpl_real_time_quotes):
|
|
146
|
+
kpl_real_time_quotes, exist_company_df):
|
|
272
147
|
global result
|
|
273
148
|
fail_list = []
|
|
274
149
|
for company_one in east_money_stock_info.itertuples():
|
|
@@ -318,10 +193,10 @@ def single_thread_sync_company_info(east_money_stock_info,
|
|
|
318
193
|
now_date = datetime.now()
|
|
319
194
|
str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
|
|
320
195
|
company_info_type['sync_date'] = str_now_date
|
|
321
|
-
fix_symbol_industry_df =
|
|
196
|
+
fix_symbol_industry_df = company_constant_data.get_fix_symbol_industry()
|
|
322
197
|
if company_one.symbol in list(fix_symbol_industry_df['symbol']):
|
|
323
198
|
# fix sw_industry
|
|
324
|
-
company_info_type =
|
|
199
|
+
company_info_type = company_constant_data.fix_symbol_industry(company_info_type, company_one.symbol)
|
|
325
200
|
|
|
326
201
|
# todo fix industry
|
|
327
202
|
company_info_type['industry'] = company_info_type['second_sw_industry']
|
|
@@ -334,8 +209,9 @@ def single_thread_sync_company_info(east_money_stock_info,
|
|
|
334
209
|
str_day = now_date.strftime('%Y-%m-%d')
|
|
335
210
|
deal_days = k_line_common_service_api.get_deal_days(str_day, company_one.symbol)
|
|
336
211
|
company_info_type['deal_days'] = deal_days
|
|
212
|
+
|
|
337
213
|
# 设置年报信息
|
|
338
|
-
company_info_type = get_recent_year_income(company_one.symbol, company_info_type)
|
|
214
|
+
company_info_type = get_recent_year_income(company_one.symbol, company_info_type, exist_company_df)
|
|
339
215
|
|
|
340
216
|
try:
|
|
341
217
|
if data_frame_util.is_not_empty(kpl_real_time_quotes):
|
|
@@ -356,7 +232,7 @@ def single_thread_sync_company_info(east_money_stock_info,
|
|
|
356
232
|
except BaseException as e:
|
|
357
233
|
logger.warning("设置开盘啦数据异常:{},{}", company_one.symbol, e)
|
|
358
234
|
|
|
359
|
-
company_info_type = filed_sort(company_info_type)
|
|
235
|
+
company_info_type = company_constant_data.filed_sort(company_info_type)
|
|
360
236
|
mongodb_util.save_mongo(company_info_type.copy(), 'company_info_base')
|
|
361
237
|
logger.info("同步公司信息完成:{}", company_one.symbol + '-' + company_one.name)
|
|
362
238
|
except BaseException as e:
|
|
@@ -395,22 +271,12 @@ def set_kpl_data(kpl_real_time_quotes_one, company_info_type, company_one):
|
|
|
395
271
|
return company_info_type
|
|
396
272
|
|
|
397
273
|
|
|
398
|
-
# 更新新上市公司信息
|
|
399
|
-
def new_company_info_update():
|
|
400
|
-
east_money_stock_info = get_east_money_stock_info()
|
|
401
|
-
new_stock = common_service_fun_api.get_new_stock(east_money_stock_info)
|
|
402
|
-
for company_one in new_stock.itertuples():
|
|
403
|
-
try:
|
|
404
|
-
sync_company_base_info([company_one.symbol])
|
|
405
|
-
fix_company_industry(company_one.symbol)
|
|
406
|
-
|
|
407
|
-
except BaseException as e:
|
|
408
|
-
logger.error("出现异常:{}", e)
|
|
409
|
-
company_common_service_api.company_info_industry_cache_clear
|
|
410
|
-
|
|
411
|
-
|
|
412
274
|
# 保存申万行业分类
|
|
413
275
|
def save_sw_data(company_info_type):
|
|
276
|
+
now_date = datetime.now()
|
|
277
|
+
hour = now_date.hour
|
|
278
|
+
if hour <= 15:
|
|
279
|
+
return company_info_type
|
|
414
280
|
first_sw_info = company_info_type[[
|
|
415
281
|
'first_sw_industry',
|
|
416
282
|
'first_industry_code'
|
|
@@ -486,7 +352,18 @@ def save_sw_data(company_info_type):
|
|
|
486
352
|
|
|
487
353
|
|
|
488
354
|
# 获取最近年报收入
|
|
489
|
-
def get_recent_year_income(symbol, company_info_type):
|
|
355
|
+
def get_recent_year_income(symbol, company_info_type, exist_company_df):
|
|
356
|
+
now_date = datetime.now()
|
|
357
|
+
hour = now_date.hour
|
|
358
|
+
if hour <= 15:
|
|
359
|
+
exist_company_one_df = exist_company_df.loc[exist_company_df['_id'] == symbol]
|
|
360
|
+
if data_frame_util.is_not_empty(exist_company_one_df):
|
|
361
|
+
company_info_type['operate_profit'] = list(exist_company_one_df['operate_profit'])[0]
|
|
362
|
+
company_info_type['total_operate_income'] = list(exist_company_one_df['total_operate_income'])[0]
|
|
363
|
+
else:
|
|
364
|
+
company_info_type['operate_profit'] = 0
|
|
365
|
+
company_info_type['total_operate_income'] = 0
|
|
366
|
+
return company_info_type
|
|
490
367
|
query = {'symbol': symbol, "REPORT_TYPE": "年报"}
|
|
491
368
|
em_stock_profit = mongodb_util.descend_query(query, db_name_constant.EM_STOCK_PROFIT, 'REPORT_DATE', 1)
|
|
492
369
|
if data_frame_util.is_not_empty(em_stock_profit):
|
|
@@ -511,5 +388,4 @@ if __name__ == '__main__':
|
|
|
511
388
|
# sync_company_base_info(None)
|
|
512
389
|
# new_company_info_update()
|
|
513
390
|
sync_company_base_info(None)
|
|
514
|
-
fix_company_industry(None)
|
|
515
391
|
# group_by_industry()
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
file_path = os.path.abspath(__file__)
|
|
5
|
+
end = file_path.index('mns') + 16
|
|
6
|
+
project_path = file_path[0:end]
|
|
7
|
+
sys.path.append(project_path)
|
|
8
|
+
from mns_common.db.MongodbUtil import MongodbUtil
|
|
9
|
+
import pandas as pd
|
|
10
|
+
from datetime import datetime
|
|
11
|
+
from loguru import logger
|
|
12
|
+
import mns_scheduler.company_info.constant.company_constant_data as company_constant_data
|
|
13
|
+
import mns_common.constant.db_name_constant as db_name_constant
|
|
14
|
+
import mns_scheduler.concept.common.detaill.ths_concept_detail_api as ths_concept_detail_api
|
|
15
|
+
import mns_scheduler.company_info.base.sync_company_base_info_api as company_info_sync_api
|
|
16
|
+
|
|
17
|
+
mongodb_util = MongodbUtil('27017')
|
|
18
|
+
import mns_common.component.common_service_fun_api as common_service_fun_api
|
|
19
|
+
import mns_common.component.company.company_common_service_api as company_common_service_api
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# 修改行业信息
|
|
26
|
+
def fix_company_industry(symbol):
|
|
27
|
+
if symbol is not None:
|
|
28
|
+
query = {"symbol": symbol}
|
|
29
|
+
company_info = mongodb_util.find_query_data('company_info_base', query)
|
|
30
|
+
else:
|
|
31
|
+
company_info = mongodb_util.find_all_data('company_info_base')
|
|
32
|
+
|
|
33
|
+
company_info = company_info.set_index(['second_sw_industry'], drop=False)
|
|
34
|
+
del company_info['industry']
|
|
35
|
+
# fix industry name
|
|
36
|
+
industry_final_fix_df = company_constant_data.get_industry_final_fix_df()
|
|
37
|
+
industry_final_fix_df = industry_final_fix_df.set_index(['second_sw_industry'], drop=True)
|
|
38
|
+
company_info = pd.merge(company_info, industry_final_fix_df, how='outer',
|
|
39
|
+
left_index=True, right_index=True)
|
|
40
|
+
# 将申万第三行业做为行业
|
|
41
|
+
company_info = company_constant_data.fix_industry_use_sw_third(company_info.copy())
|
|
42
|
+
company_info['industry'] = company_info['industry'].fillna('综合')
|
|
43
|
+
company_info = company_constant_data.filed_sort(company_info)
|
|
44
|
+
company_info['company_type'] = company_info['business_nature']
|
|
45
|
+
|
|
46
|
+
# 将list_date列中的所有NaN值设置为99990909
|
|
47
|
+
company_info['list_date'].fillna(20990909.0, inplace=True)
|
|
48
|
+
|
|
49
|
+
# 将日期数值转换为日期时间格式
|
|
50
|
+
company_info['list_date_01'] = pd.to_datetime(company_info['list_date'], format='%Y%m%d')
|
|
51
|
+
|
|
52
|
+
company_info['list_date'] = company_info['list_date'].apply(
|
|
53
|
+
lambda x: pd.to_numeric(x, errors="coerce"))
|
|
54
|
+
|
|
55
|
+
now_date = datetime.now()
|
|
56
|
+
|
|
57
|
+
# 计算日期差值 距离现在上市时间
|
|
58
|
+
company_info['diff_days'] = company_info.apply(
|
|
59
|
+
lambda row: (now_date - row['list_date_01']).days, axis=1)
|
|
60
|
+
|
|
61
|
+
str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
|
|
62
|
+
company_info['sync_date'] = str_now_date
|
|
63
|
+
|
|
64
|
+
try:
|
|
65
|
+
# 次新股
|
|
66
|
+
sub_stock = ths_concept_detail_api.get_ths_concept_detail('885598', None)
|
|
67
|
+
sub_stock_symbol_list = list(sub_stock['symbol'])
|
|
68
|
+
except BaseException as e:
|
|
69
|
+
logger.error("出现异常:{},{}", symbol, e)
|
|
70
|
+
query = {'concept_code': 885598}
|
|
71
|
+
ths_stock_concept_detail = mongodb_util.find_query_data('ths_stock_concept_detail', query)
|
|
72
|
+
sub_stock_symbol_list = list(ths_stock_concept_detail['symbol'])
|
|
73
|
+
company_info.loc[:, 'sub_stock'] = False
|
|
74
|
+
company_info.loc[company_info['symbol'].isin(sub_stock_symbol_list), 'sub_stock'] = True
|
|
75
|
+
|
|
76
|
+
try:
|
|
77
|
+
company_info.dropna(subset=['symbol'], axis=0, inplace=True)
|
|
78
|
+
company_info.dropna(subset=['_id'], axis=0, inplace=True)
|
|
79
|
+
mongodb_util.save_mongo(company_info, db_name_constant.COMPANY_INFO)
|
|
80
|
+
# 保存历史数据
|
|
81
|
+
save_company_info_his(company_info)
|
|
82
|
+
except BaseException as e:
|
|
83
|
+
logger.error("出现异常:{},{}", symbol, e)
|
|
84
|
+
|
|
85
|
+
return company_info
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def save_company_info_his(company_info_df):
|
|
89
|
+
now_date = datetime.now()
|
|
90
|
+
str_day = now_date.strftime('%Y-%m-%d')
|
|
91
|
+
company_info_df['symbol'] = company_info_df['_id']
|
|
92
|
+
company_info_df['str_day'] = str_day
|
|
93
|
+
company_info_df['_id'] = company_info_df['_id'] + "_" + str_day
|
|
94
|
+
remove_query = {'str_day': str_day}
|
|
95
|
+
tag = mongodb_util.remove_data(remove_query, db_name_constant.COMPANY_INFO_HIS)
|
|
96
|
+
success = tag.acknowledged
|
|
97
|
+
if success:
|
|
98
|
+
mongodb_util.insert_mongo(company_info_df, db_name_constant.COMPANY_INFO_HIS)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
# 更新新上市公司信息
|
|
102
|
+
def new_company_info_update():
|
|
103
|
+
east_money_stock_info = company_info_sync_api.get_east_money_stock_info()
|
|
104
|
+
new_stock = common_service_fun_api.get_new_stock(east_money_stock_info)
|
|
105
|
+
for company_one in new_stock.itertuples():
|
|
106
|
+
try:
|
|
107
|
+
company_info_sync_api.sync_company_base_info([company_one.symbol])
|
|
108
|
+
fix_company_industry(company_one.symbol)
|
|
109
|
+
|
|
110
|
+
except BaseException as e:
|
|
111
|
+
logger.error("出现异常:{}", e)
|
|
112
|
+
company_common_service_api.company_info_industry_cache_clear
|
|
@@ -310,10 +310,64 @@ def fix_symbol_industry(company_info, symbol):
|
|
|
310
310
|
|
|
311
311
|
def fix_one_symbol():
|
|
312
312
|
symbol = '300483'
|
|
313
|
-
company_info = mongodb_util.find_query_data('
|
|
313
|
+
company_info = mongodb_util.find_query_data('base', query={'_id': symbol})
|
|
314
314
|
company_info = fix_symbol_industry(company_info, symbol)
|
|
315
315
|
company_info['industry'] = company_info['second_sw_industry']
|
|
316
|
-
mongodb_util.save_mongo(company_info, '
|
|
316
|
+
mongodb_util.save_mongo(company_info, 'base')
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
def filed_sort(company_info):
|
|
320
|
+
return company_info[[
|
|
321
|
+
"_id",
|
|
322
|
+
"name",
|
|
323
|
+
"industry",
|
|
324
|
+
"first_sw_industry",
|
|
325
|
+
"first_industry_code",
|
|
326
|
+
"second_sw_industry",
|
|
327
|
+
"second_industry_code",
|
|
328
|
+
"third_sw_industry",
|
|
329
|
+
"third_industry_code",
|
|
330
|
+
"ths_concept_name",
|
|
331
|
+
"ths_concept_code",
|
|
332
|
+
"ths_concept_sync_day",
|
|
333
|
+
"em_industry",
|
|
334
|
+
"em_concept",
|
|
335
|
+
"business_nature",
|
|
336
|
+
"actual_controller_name",
|
|
337
|
+
"actual_controller_rate",
|
|
338
|
+
"final_controller_name",
|
|
339
|
+
"final_controller_rate",
|
|
340
|
+
"mv_circulation_ratio",
|
|
341
|
+
"flow_mv_sp",
|
|
342
|
+
"total_mv_sp",
|
|
343
|
+
"now_price",
|
|
344
|
+
"total_share",
|
|
345
|
+
"flow_share",
|
|
346
|
+
"total_mv",
|
|
347
|
+
"flow_mv",
|
|
348
|
+
"flow_mv_level",
|
|
349
|
+
"holder_controller_name",
|
|
350
|
+
"holder_controller_rate",
|
|
351
|
+
"area",
|
|
352
|
+
"list_date",
|
|
353
|
+
"deal_days",
|
|
354
|
+
"pe_ttm",
|
|
355
|
+
"pb",
|
|
356
|
+
"ROE",
|
|
357
|
+
"classification",
|
|
358
|
+
"base_business",
|
|
359
|
+
"address",
|
|
360
|
+
"market_id",
|
|
361
|
+
"symbol",
|
|
362
|
+
"amount",
|
|
363
|
+
"sync_date",
|
|
364
|
+
"ths_concept_list_info",
|
|
365
|
+
"kpl_plate_name",
|
|
366
|
+
"kpl_most_relative_name",
|
|
367
|
+
"kpl_plate_list_info",
|
|
368
|
+
'operate_profit',
|
|
369
|
+
'total_operate_income'
|
|
370
|
+
]]
|
|
317
371
|
|
|
318
372
|
|
|
319
373
|
if __name__ == '__main__':
|
|
@@ -11,7 +11,8 @@ project_path = file_path[0:end]
|
|
|
11
11
|
sys.path.append(project_path)
|
|
12
12
|
mongodb_util = MongodbUtil('27017')
|
|
13
13
|
import mns_common.api.msg.push_msg_api as push_msg_api
|
|
14
|
-
import mns_scheduler.company_info.
|
|
14
|
+
import mns_scheduler.company_info.base.sync_company_base_info_api as company_info_sync_api
|
|
15
|
+
import mns_scheduler.company_info.clean.company_info_clean_api as company_info_clean_api
|
|
15
16
|
import mns_scheduler.concept.common.detaill.ths_concept_detail_api as ths_concept_detail_api
|
|
16
17
|
|
|
17
18
|
max_concept_code = 886110
|
|
@@ -86,7 +87,7 @@ def save_ths_concept_detail(new_concept_symbol_df,
|
|
|
86
87
|
query_field = {"first_industry": 1, "first_industry": 1, "industry": 1,
|
|
87
88
|
"company_type": 1, "flow_mv_sp": 1,
|
|
88
89
|
"total_mv_sp": 1}
|
|
89
|
-
company_info = mongodb_util.find_query_data_choose_field('
|
|
90
|
+
company_info = mongodb_util.find_query_data_choose_field('base',
|
|
90
91
|
query_company_info, query_field)
|
|
91
92
|
|
|
92
93
|
company_info = company_info.set_index(['_id'], drop=True)
|
|
@@ -149,7 +150,7 @@ def update_company_info(new_concept_symbol_df):
|
|
|
149
150
|
if new_concept_symbol_df.shape[0] > 0:
|
|
150
151
|
symbol_list = list(new_concept_symbol_df['symbol'])
|
|
151
152
|
company_info_sync_api.sync_company_base_info(symbol_list)
|
|
152
|
-
|
|
153
|
+
company_info_clean_api.fix_company_industry(None)
|
|
153
154
|
# 公司缓存信息清除
|
|
154
155
|
company_common_service_api.company_info_industry_cache_clear()
|
|
155
156
|
|
mns_scheduler/db/db_status.py
CHANGED
|
@@ -16,7 +16,7 @@ import mns_common.utils.ip_util as ip_util
|
|
|
16
16
|
def db_status_check():
|
|
17
17
|
try:
|
|
18
18
|
query = {'symbol': '000001'}
|
|
19
|
-
mongodb_util.find_query_data('
|
|
19
|
+
mongodb_util.find_query_data('base', query)
|
|
20
20
|
except BaseException as e:
|
|
21
21
|
ip = ip_util.get_host_ip()
|
|
22
22
|
push_msg_api.push_msg_to_wechat("数据库挂了", "地址:" + ip + "-" + "数据库挂了")
|
|
@@ -32,13 +32,13 @@ import \
|
|
|
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
34
|
import mns_scheduler.kpl.selection.total.sync_kpl_best_total_sync_api as sync_kpl_best_total_sync_api
|
|
35
|
-
import mns_scheduler.company_info.
|
|
35
|
+
import mns_scheduler.company_info.base.sync_company_base_info_api as company_info_sync_api
|
|
36
36
|
import mns_scheduler.trade.auto_ipo_buy_api as auto_ipo_buy_api
|
|
37
37
|
import mns_scheduler.kpl.selection.index.sync_best_choose_his_index as sync_best_choose_his_index
|
|
38
38
|
import mns_scheduler.concept.ths.common.ths_concept_update_common_api as ths_concept_update_common_api
|
|
39
39
|
import mns_scheduler.trade.sync_position_api as sync_position_api
|
|
40
40
|
import mns_scheduler.concept.clean.kpl_concept_clean_api as kpl_concept_clean_api
|
|
41
|
-
import mns_scheduler.company_info.de_list_stock_service as de_list_stock_service
|
|
41
|
+
import mns_scheduler.company_info.de_list_stock.de_list_stock_service as de_list_stock_service
|
|
42
42
|
import mns_scheduler.irm.stock_irm_cninfo_service as stock_irm_cninfo_service
|
|
43
43
|
import mns_scheduler.open.sync_one_day_open_data_to_db_service as sync_one_day_open_data_to_db_service
|
|
44
44
|
import mns_scheduler.zt.high_chg.sync_high_chg_pool_service as sync_high_chg_pool_service
|
|
@@ -46,7 +46,7 @@ import mns_scheduler.zt.high_chg.sync_high_chg_real_time_quotes_service as sync_
|
|
|
46
46
|
import mns_scheduler.risk.self.wei_pan_stock_api as wei_pan_stock_api
|
|
47
47
|
import mns_scheduler.risk.transactions.transactions_check_api as transactions_check_api
|
|
48
48
|
import mns_scheduler.concept.ths.sync_new_index.sync_ths_concept_new_index_api as sync_ths_concept_new_index_api
|
|
49
|
-
|
|
49
|
+
import mns_scheduler.company_info.clean.company_info_clean_api as company_info_clean_api
|
|
50
50
|
|
|
51
51
|
# 同步交易日期任务完成
|
|
52
52
|
def sync_trade_date():
|
|
@@ -280,7 +280,7 @@ def sync_new_concept_index_task():
|
|
|
280
280
|
# 清洗公司基本信息
|
|
281
281
|
def update_company_base_info():
|
|
282
282
|
company_info_sync_api.sync_company_base_info(None)
|
|
283
|
-
|
|
283
|
+
company_info_clean_api.fix_company_industry(None)
|
|
284
284
|
# 退市股票同步
|
|
285
285
|
de_list_stock_service.sync_de_list_stock()
|
|
286
286
|
logger.info('同步公司基本信息任务完成')
|
|
@@ -393,7 +393,7 @@ blockingScheduler.add_job(sync_new_concept_index_task, 'interval', minutes=10, m
|
|
|
393
393
|
blockingScheduler.add_job(sync_all_kpl_plate_info, 'interval', minutes=5, max_instances=4)
|
|
394
394
|
|
|
395
395
|
# 同步公司基本信息
|
|
396
|
-
blockingScheduler.add_job(update_company_base_info, 'cron', hour='
|
|
396
|
+
blockingScheduler.add_job(update_company_base_info, 'cron', hour='18,22', minute='05')
|
|
397
397
|
# 更新当天涨停股票池
|
|
398
398
|
blockingScheduler.add_job(sync_stock_zt_pool, 'cron', hour='15,19,21,23', minute='42')
|
|
399
399
|
|
|
@@ -6,7 +6,7 @@ end = file_path.index('mns') + 17
|
|
|
6
6
|
project_path = file_path[0:end]
|
|
7
7
|
sys.path.append(project_path)
|
|
8
8
|
import mns_scheduler.real_time.realtime_quotes_now_sync as realtime_quotes_now_sync
|
|
9
|
-
import mns_scheduler.company_info.
|
|
9
|
+
import mns_scheduler.company_info.clean.company_info_clean_api as company_info_clean_api
|
|
10
10
|
from loguru import logger
|
|
11
11
|
from apscheduler.schedulers.blocking import BlockingScheduler
|
|
12
12
|
|
|
@@ -14,7 +14,7 @@ from apscheduler.schedulers.blocking import BlockingScheduler
|
|
|
14
14
|
def sync_realtime_quotes():
|
|
15
15
|
logger.error("同步实时数据开始")
|
|
16
16
|
# 更新新股公司信息
|
|
17
|
-
|
|
17
|
+
company_info_clean_api.new_company_info_update()
|
|
18
18
|
realtime_quotes_now_sync.sync_realtime_quotes()
|
|
19
19
|
logger.error("同步实时数据完成")
|
|
20
20
|
|
|
@@ -2,7 +2,7 @@ mns_scheduler/__init__.py,sha256=Tyvi_iQlv3jz59EdH67Mycnt9CSixcWPQoJwu55bOq0,165
|
|
|
2
2
|
mns_scheduler/backup/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
|
|
3
3
|
mns_scheduler/backup/em/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
4
4
|
mns_scheduler/backup/em/em_new_concept_his_sync.py,sha256=Yqbuz9VE9433o0Z6BvDo5adhj3lK4vmN66XNQBIdC1k,4992
|
|
5
|
-
mns_scheduler/backup/em/em_new_concept_sync_common_api.py,sha256=
|
|
5
|
+
mns_scheduler/backup/em/em_new_concept_sync_common_api.py,sha256=358wt-U7-c0fe-6EPSFD24i0-ykunYnTXBerlXyPDIs,7075
|
|
6
6
|
mns_scheduler/backup/em/em_new_concept_sync_web.py,sha256=wVS0yLyPYzpcxfWAuUqmqbYkjw9wjpo48CvLSZFckzw,2334
|
|
7
7
|
mns_scheduler/backup/ths/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
8
|
mns_scheduler/backup/ths/sync_ths_concept_by_ak_api.py,sha256=8QBiRKc0Q3ez-kBwvz7G8HrFDD_ANd8smOpQtGyvKIs,5371
|
|
@@ -10,9 +10,14 @@ mns_scheduler/backup/ths/sync_ths_new_concept_by_web_api.py,sha256=dLd2V67AFnE9x
|
|
|
10
10
|
mns_scheduler/big_deal/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
11
11
|
mns_scheduler/big_deal/ths_big_deal_sync.py,sha256=aMFj-_pLprh4vGjSSzmr_tlYoPA0L4Lm0SkLRkQwIiw,4564
|
|
12
12
|
mns_scheduler/company_info/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
13
|
-
mns_scheduler/company_info/
|
|
14
|
-
mns_scheduler/company_info/
|
|
15
|
-
mns_scheduler/company_info/
|
|
13
|
+
mns_scheduler/company_info/base/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
|
|
14
|
+
mns_scheduler/company_info/base/sync_company_base_info_api.py,sha256=zI6CaQ7LuXeXjJMexb1i70dPyhZQB3LHbsbrRhJaVDc,18173
|
|
15
|
+
mns_scheduler/company_info/clean/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
|
|
16
|
+
mns_scheduler/company_info/clean/company_info_clean_api.py,sha256=zMPbIz91l8DpIGc7ljG6dEdD5QXjir2a0wWHGt2Ca78,4805
|
|
17
|
+
mns_scheduler/company_info/constant/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
|
|
18
|
+
mns_scheduler/company_info/constant/company_constant_data.py,sha256=emaRsH5y-d6IleEG2Od4zNvkL9_Yqg4PimbQVYOM7eM,15870
|
|
19
|
+
mns_scheduler/company_info/de_list_stock/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
|
|
20
|
+
mns_scheduler/company_info/de_list_stock/de_list_stock_service.py,sha256=GCp6hlvO-SuH1oIpEsYZwEnGUOa6fXb2D7CqAUYXKQA,1993
|
|
16
21
|
mns_scheduler/concept/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
17
22
|
mns_scheduler/concept/clean/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
18
23
|
mns_scheduler/concept/clean/kpl_concept_clean_api.py,sha256=xxIIgrXLI6xLf10t4unJa7aMB_QeKeki1HJVeXsntkY,4512
|
|
@@ -22,7 +27,7 @@ mns_scheduler/concept/common/detaill/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeu
|
|
|
22
27
|
mns_scheduler/concept/common/detaill/ths_concept_detail_api.py,sha256=tRuSkET-lw1M7rHDImrIM_1X-uMhxq_zF_d3FX1DoUc,9378
|
|
23
28
|
mns_scheduler/concept/ths/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
24
29
|
mns_scheduler/concept/ths/common/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
25
|
-
mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py,sha256=
|
|
30
|
+
mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py,sha256=zP7Hu97m0BwMs1M3F5TWiLCJ0g-wwFunQduoG189bhE,6873
|
|
26
31
|
mns_scheduler/concept/ths/common/ths_concept_update_common_api.py,sha256=4BQT3A9t-nDIyCpILgRZF7ZOgK1oabp-gJl5nyWvKWc,4418
|
|
27
32
|
mns_scheduler/concept/ths/sync_new_index/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
28
33
|
mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_new_index_api.py,sha256=9ol2cvxSO2Ot4Z5fmlo9tUPFe6WwsuVX_H9ogtv3QrI,7841
|
|
@@ -31,7 +36,7 @@ mns_scheduler/concept/ths/update_concept_info/sync_one_concept_all_symbols_api.p
|
|
|
31
36
|
mns_scheduler/concept/ths/update_concept_info/sync_one_symbol_all_concepts_api.py,sha256=HVqDSBruORebtiliKps2swJo_GNg_8mqT0r9cZX6sj8,8839
|
|
32
37
|
mns_scheduler/db/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
33
38
|
mns_scheduler/db/col_move_service.py,sha256=1XMuC9E9eif8eeLWqnby_c9uhuoZO0ZaMa5xssWe4Wg,4090
|
|
34
|
-
mns_scheduler/db/db_status.py,sha256=
|
|
39
|
+
mns_scheduler/db/db_status.py,sha256=rxSvDHCwrqCHQFI6MnF6YBFo2F-baEMg6ShSOU35vVU,739
|
|
35
40
|
mns_scheduler/dt/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
36
41
|
mns_scheduler/dt/stock_dt_pool_sync.py,sha256=5ivRUOnFtOapZniwTbujf1lVq3y4btm2Cmd5R6JJAVo,3466
|
|
37
42
|
mns_scheduler/finance/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
|
|
@@ -117,9 +122,9 @@ mns_scheduler/zt/script/sync_high_chg_pool_his_data.py,sha256=R0syG5gcXRlLxswbBl
|
|
|
117
122
|
mns_scheduler/zt/zt_pool/__init__.py,sha256=Tyvi_iQlv3jz59EdH67Mycnt9CSixcWPQoJwu55bOq0,165
|
|
118
123
|
mns_scheduler/zt/zt_pool/zt_pool_sync_api.py,sha256=YusilleacIhhks1m7qkYHdBS16yvjai2avCSfrDpWAg,7607
|
|
119
124
|
mns_scheduler/zz_task/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
|
|
120
|
-
mns_scheduler/zz_task/data_sync_task.py,sha256=
|
|
121
|
-
mns_scheduler/zz_task/sync_realtime_quotes_task.py,sha256=
|
|
122
|
-
mns_scheduler-1.1.0.
|
|
123
|
-
mns_scheduler-1.1.0.
|
|
124
|
-
mns_scheduler-1.1.0.
|
|
125
|
-
mns_scheduler-1.1.0.
|
|
125
|
+
mns_scheduler/zz_task/data_sync_task.py,sha256=VSmcXpMrEZLQTolnh4YHWD0OFiVTYTrvDnkz3871gWE,17418
|
|
126
|
+
mns_scheduler/zz_task/sync_realtime_quotes_task.py,sha256=AMTdeyZ-eGaVpZjggKTPr818FFYkRihY3nAvH5Je2A0,941
|
|
127
|
+
mns_scheduler-1.1.0.4.dist-info/METADATA,sha256=yttamFeH_h_w26Rq69LlXQtCrCzJbZudZ8M_NTA8il8,64
|
|
128
|
+
mns_scheduler-1.1.0.4.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
|
|
129
|
+
mns_scheduler-1.1.0.4.dist-info/top_level.txt,sha256=PXQDFBGR1pWmsUbH5yiLAh71P5HZODTRED0zJ8CCgOc,14
|
|
130
|
+
mns_scheduler-1.1.0.4.dist-info/RECORD,,
|
/mns_scheduler/company_info/{de_list_stock_service.py → de_list_stock/de_list_stock_service.py}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|