mns-scheduler 1.2.3.6__py3-none-any.whl → 1.2.3.7__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.

@@ -13,6 +13,7 @@ import mns_scheduler.company_info.constant.company_constant_data as company_cons
13
13
  import mns_common.constant.db_name_constant as db_name_constant
14
14
  import mns_scheduler.concept.ths.detaill.ths_concept_detail_api as ths_concept_detail_api
15
15
  import mns_scheduler.company_info.base.sync_company_base_info_api as company_info_sync_api
16
+ import mns_common.utils.data_frame_util as data_frame_util
16
17
 
17
18
  mongodb_util = MongodbUtil('27017')
18
19
  import mns_common.component.common_service_fun_api as common_service_fun_api
@@ -20,21 +21,26 @@ import mns_common.component.company.company_common_service_api as company_common
20
21
 
21
22
 
22
23
  # 修改行业信息
23
- def fix_company_industry(symbol):
24
+ def clean_company_info(symbol):
24
25
  if symbol is not None:
25
26
  query = {"symbol": symbol}
26
27
  company_info = mongodb_util.find_query_data('company_info_base', query)
27
28
  else:
28
29
  company_info = mongodb_util.find_all_data('company_info_base')
29
30
 
30
- # company_info = company_info.set_index(['second_sw_industry'], drop=False)
31
- # del company_info['industry']
31
+ company_info = company_constant_data.fix_second_industry(company_info)
32
+
33
+ company_info = company_info.set_index(['second_sw_industry'], drop=False)
34
+
35
+ # 修改行业名称
36
+ del company_info['industry']
32
37
  # fix industry name
33
- # company_info = company_constant_data.remove_industry_name_special(company_info)
34
- # industry_final_fix_df = industry_final_fix_df.set_index(['second_sw_industry'], drop=True)
35
- # company_info = pd.merge(company_info, industry_final_fix_df, how='outer',
36
- # left_index=True, right_index=True)
37
- # 将申万第三行业做为行业
38
+ industry_final_fix_df = company_constant_data.get_fix_industry_name_df()
39
+ industry_final_fix_df = industry_final_fix_df.set_index(['second_sw_industry'], drop=True)
40
+ company_info = pd.merge(company_info, industry_final_fix_df, how='outer',
41
+ left_index=True, right_index=True)
42
+
43
+ # 将申万第三行业做为行业 拆分过大的二级行业 主要有通用设备 和专业设备
38
44
  company_info = company_constant_data.fix_industry_use_sw_third(company_info.copy())
39
45
  company_info['industry'] = company_info['industry'].fillna('综合')
40
46
  company_info = company_constant_data.filed_sort(company_info)
@@ -65,7 +71,7 @@ def fix_company_industry(symbol):
65
71
  except BaseException as e:
66
72
  logger.error("出现异常:{},{}", symbol, e)
67
73
  query = {'concept_code': 885598}
68
- ths_stock_concept_detail = mongodb_util.find_query_data('ths_stock_concept_detail', query)
74
+ ths_stock_concept_detail = mongodb_util.find_query_data(db_name_constant.THS_STOCK_CONCEPT_DETAIL, query)
69
75
  sub_stock_symbol_list = list(ths_stock_concept_detail['symbol'])
70
76
  company_info.loc[:, 'sub_stock'] = False
71
77
  company_info.loc[company_info['symbol'].isin(sub_stock_symbol_list), 'sub_stock'] = True
@@ -73,6 +79,20 @@ def fix_company_industry(symbol):
73
79
  try:
74
80
  company_info.dropna(subset=['symbol'], axis=0, inplace=True)
75
81
  company_info.dropna(subset=['_id'], axis=0, inplace=True)
82
+ ths_stock_industry_detail_df = mongodb_util.find_all_data(db_name_constant.THS_STOCK_INDUSTRY_DETAIL)
83
+ if data_frame_util.is_not_empty(ths_stock_industry_detail_df):
84
+ ths_stock_industry_detail_df = ths_stock_industry_detail_df[
85
+ ['symbol', 'ths_industry_name', 'ths_industry_code']]
86
+ ths_stock_industry_detail_df = ths_stock_industry_detail_df.set_index(['symbol'], drop=True)
87
+ company_info = company_info.set_index(['_id'], drop=False)
88
+ company_info = pd.merge(company_info, ths_stock_industry_detail_df, how='outer',
89
+ left_index=True, right_index=True)
90
+ company_info['ths_industry_code'] = company_info['ths_industry_code'].fillna('0')
91
+ company_info['ths_industry_name'] = company_info['ths_industry_name'].fillna('异常')
92
+
93
+ else:
94
+ company_info['ths_industry_code'] = '0'
95
+ company_info['ths_industry_name'] = '异常'
76
96
  mongodb_util.save_mongo(company_info, db_name_constant.COMPANY_INFO)
77
97
  # 保存历史数据
78
98
  save_company_info_his(company_info)
@@ -102,7 +122,7 @@ def new_company_info_update():
102
122
  for company_one in new_stock.itertuples():
103
123
  try:
104
124
  company_info_sync_api.sync_company_base_info([company_one.symbol])
105
- fix_company_industry(company_one.symbol)
125
+ clean_company_info(company_one.symbol)
106
126
 
107
127
  except BaseException as e:
108
128
  logger.error("出现异常:{}", e)
@@ -110,4 +130,4 @@ def new_company_info_update():
110
130
 
111
131
 
112
132
  if __name__ == '__main__':
113
- fix_company_industry(None)
133
+ clean_company_info(None)
@@ -59,32 +59,66 @@ def get_fix_symbol_industry():
59
59
  'new_industry'])
60
60
 
61
61
 
62
- # 修改行业分类的股票
63
- def get_fix_industry_info():
64
- return pd.DataFrame([['450700', '旅游零售Ⅱ', '461000', '旅游及景区'],
65
- []],
66
- columns=['original_second_industry_code',
67
- 'original_second_industry_name',
68
- 'new_third_second_code', # 二级级行业代码
69
- 'new_third_second_name'])
62
+ # 修改二级行业分类的股票
63
+ def get_fix_second_industry_info():
64
+ return pd.DataFrame([
65
+ ['110200', '渔业', "农林牧渔", "110000", '农业综合Ⅱ', '110900'],
66
+
67
+ ['110300', '林业', "农林牧渔", "110000", '农业综合Ⅱ', '110900'],
68
+
69
+ ['450700', '旅游零售Ⅱ', '社会服务', '460000', '旅游及景区', '461000'],
70
+
71
+ ['220700', '化工新材料Ⅱ', '基础化工', '220000', '非金属材料Ⅱ', '220900'],
72
+
73
+ ['330700', '其他家电Ⅱ', '家用电器', '330000', '小家电', '330300'],
74
+
75
+ ['250100', '建筑材料', '建筑材料', '610000', '装修建材', '610300'],
76
+
77
+ ['460600', '体育Ⅱ', '综合', '510000', '综合Ⅱ', '510100'],
70
78
 
79
+ ['770300', '医疗美容', '美容护理', '770000', '化妆品', '770200'],
71
80
 
72
- # def remove_industry_name_special(industry_df):
73
- # industry_df['industry'] = industry_df['industry'].str.replace('Ⅱ', '', regex=False)
74
- # return industry_df
81
+ ],
82
+ columns=['original_second_industry_code',
83
+ 'original_second_industry_name',
84
+ 'first_sw_industry',
85
+ 'first_industry_code',
86
+ 'second_sw_industry', # 二级级行业代码
87
+ 'second_industry_code'])
75
88
 
76
89
 
77
- # 修改行业名称 暂时作废
78
- def get_industry_final_fix_df():
90
+ def fix_second_industry(company_info):
91
+ fix_second_industry_df = get_fix_second_industry_info()
92
+ del fix_second_industry_df['original_second_industry_name']
93
+ fix_second_company_df = company_info.loc[
94
+ company_info['second_industry_code'].isin(fix_second_industry_df['original_second_industry_code'])]
95
+
96
+ no_fix_second_company_df = company_info.loc[~(
97
+ company_info['second_industry_code'].isin(fix_second_industry_df['original_second_industry_code']))]
98
+
99
+ fix_second_company_df = fix_second_company_df.set_index(['second_industry_code'], drop=True)
100
+ del fix_second_company_df['second_sw_industry']
101
+ del fix_second_company_df['first_industry_code']
102
+ del fix_second_company_df['first_sw_industry']
103
+ fix_second_industry_df = fix_second_industry_df.set_index(['original_second_industry_code'], drop=True)
104
+
105
+ fix_second_company_df = pd.merge(fix_second_company_df, fix_second_industry_df, how='outer',
106
+ left_index=True, right_index=True)
107
+
108
+ return pd.concat([no_fix_second_company_df, fix_second_company_df])
109
+
110
+
111
+ # 修改行业名
112
+ def get_fix_industry_name_df():
79
113
  return pd.DataFrame([
80
114
 
81
- # 交通运输
115
+ # 交通运输 1
82
116
  ['物流', '物流'],
83
117
  ['铁路公路', '铁路公路'],
84
118
  ['航运港口', '航运港口'],
85
119
  ['航空机场', '航空机场'],
86
120
 
87
- # 传媒
121
+ # 传媒 2
88
122
  ['数字媒体', '数字媒体'],
89
123
  ['电视广播Ⅱ', '电视广播'],
90
124
  ['游戏Ⅱ', '游戏'],
@@ -92,22 +126,21 @@ def get_industry_final_fix_df():
92
126
  ['影视院线', '影视院线'],
93
127
  ['广告营销', '广告营销'],
94
128
 
95
- # 公用事业
129
+ # 公用事业 3
96
130
  ['燃气Ⅱ', '燃气'],
97
131
  ['电力', '电力'],
98
132
 
99
- # 农林牧渔
100
- ['养殖业', '养殖业'], # merge 农林牧渔
101
- ['农产品加工', '农产品加工'], # merge 农林牧渔
102
- ['饲料', '饲料'], # merge to 农林牧渔
103
- ['渔业', '渔业'], # merge to 农林牧渔
104
- # merge 农林牧渔
133
+ # 农林牧渔 4
134
+ ['养殖业', '养殖业'],
135
+ ['农产品加工', '农产品加工'],
136
+ ['饲料', '饲料'],
137
+ ['渔业', '渔业'], # merge to 农业综合
105
138
  ['动物保健Ⅱ', '动物保健'],
106
139
  ['种植业', '种植业'],
107
- ['林业Ⅱ', '林业'], # merge 农林牧渔
108
- ['农业综合Ⅱ', '农业综合'], # merge 农林牧渔
140
+ # ['林业Ⅱ', '林业'], # merge 农业综合
141
+ ['农业综合Ⅱ', '农业综合'], #
109
142
 
110
- # 医药生物
143
+ # 医药生物 5
111
144
  ['化学制药', '化学制药'],
112
145
  ['生物制品', '生物制品'],
113
146
  ['中药Ⅱ', '中药'],
@@ -115,46 +148,85 @@ def get_industry_final_fix_df():
115
148
  ['医疗服务', '医疗服务'],
116
149
  ['医药商业', '医药商业'],
117
150
 
118
- # 商贸零售
151
+ # 商贸零售 6
119
152
  ['一般零售', '一般零售'],
120
153
  ['互联网电商', '互联网电商'],
121
154
  ['贸易Ⅱ', '贸易'], #
122
- ['专业连锁Ⅱ', '专业连锁'], # 专业连锁 综合Ⅱ
123
- ['旅游零售Ⅱ', '旅游零售'], # m
155
+ ['专业连锁Ⅱ', '零售专业连锁'], # 专业连锁 综合Ⅱ
156
+ # ['旅游零售Ⅱ', '旅游零售'], # merge旅游及景区
124
157
 
125
- # 国防
126
- ['军工电子Ⅱ', '军工电子'], # todo merge 国防
127
- ['地面兵装Ⅱ', '地面兵装'], # todo merge 国防
158
+ # 国防 7
159
+ ['军工电子Ⅱ', '军工电子'],
160
+ ['地面兵装Ⅱ', '地面兵装'],
128
161
  ['航天装备Ⅱ', '航天装备'],
129
- ['航空装备Ⅱ', '航空装备'], # todo merge 国防
162
+ ['航空装备Ⅱ', '航空装备'],
130
163
  ['航海装备Ⅱ', '航海装备'],
131
164
 
132
- # 基础化工
165
+ # 基础化工 8
133
166
  ['化学制品', '化学制品'],
134
167
  ['化学原料', '化学原料'],
135
168
  ['化学纤维', '化学纤维'],
136
169
  ['农化制品', '化肥农药'],
137
170
  ['塑料', '塑料'],
138
- ['橡胶', '橡胶'], # todo exclude
171
+ ['橡胶', '橡胶'],
139
172
  ['非金属材料Ⅱ', '非金属材料'],
140
173
 
141
- # 家用电器
174
+ # 家用电器 9
142
175
  ['白色家电', '白色家电'], # merge 家用电器
143
176
  ['照明设备Ⅱ', '照明设备'], # merge 家用电器
144
- ['其他家电Ⅱ', '其他家电'], # merge 家用电器
177
+ # ['其他家电Ⅱ', '其他家电'], # merge 小家电
145
178
  ['家电零部件Ⅱ', '家电零部件'], # merge 家用电器
146
179
  ['小家电', '小家电'], # merge '家用电器'
147
180
  ['黑色家电', '黑色家电'], # merge 家用电器
148
181
  ['厨卫电器', '厨卫电器'], # merge 家用电器
149
182
 
150
- # 汽车
183
+ # 建筑材料 10
184
+ ['装修建材', '装修建材'], #
185
+ ['建筑建材', '装修建材'], #
186
+ ['玻璃玻纤', '玻璃玻纤'],
187
+ ['水泥', '水泥'],
188
+
189
+ # 建筑装饰 11
190
+ ['基础建设', '基础建设'],
191
+ ['房屋建设Ⅱ', '房屋建设'],
192
+ ['工程咨询服务Ⅱ', '工程咨询服务'],
193
+ ['专业工程', '建筑专业工程'],
194
+ ['装修装饰Ⅱ', '装修装饰'],
195
+
196
+ # 房地产 12
197
+ ['房地产开发', '房地产'],
198
+ ['房地产服务', '房地产'],
199
+
200
+ # 有色金属 13
201
+ ['能源金属', '能源金属'],
202
+ ['小金属', '小金属'],
203
+ ['贵金属', '贵金属'], #
204
+ ['金属新材料', '金属新材料'],
205
+ ['工业金属', '工业金属'], # 铅锌 铝 铜
206
+
207
+ # 机械设备 14
208
+ ['自动化设备', '自动化设备'],
209
+ ['轨交设备Ⅱ', '轨交设备'],
210
+ ['通用设备', '通用设备'],
211
+ ['专用设备', '专用设备'],
212
+ ['工程机械', '工程机械'],
213
+
214
+ # 汽车 15
151
215
  ['汽车零部件', '汽车零部件'],
152
216
  ['汽车服务', '汽车服务'],
153
- ['乘用车', '汽车整车'], # = merge 汽车整车
154
- ['商用车', '汽车整车'],
217
+ ['乘用车', '乘用车'], # = merge 汽车整车
218
+ ['商用车', '商用车'],
155
219
  ['摩托车及其他', '摩托车及其他'],
156
220
 
157
- # 电力设备
221
+ # 煤炭 16
222
+ ['焦炭Ⅱ', '焦炭'], # merge to 煤炭
223
+ ['煤炭开采', '煤炭开采'], # merge 煤炭
224
+
225
+ # 环保 17
226
+ ['环境治理', '环境治理'], # merge, 环保
227
+ ['环保设备Ⅱ', '环保设备'], # merge '环保'
228
+
229
+ # 电力设备 18
158
230
  ['电网设备', '电网设备'],
159
231
  ['电池', '电池'],
160
232
  ['电机Ⅱ', '电机'], #
@@ -162,20 +234,7 @@ def get_industry_final_fix_df():
162
234
  ['风电设备', '风电设备'],
163
235
  ['其他电源设备Ⅱ', '其他电源设备'],
164
236
 
165
- # 房地产
166
- ['房地产开发', '房地产'],
167
- ['房地产服务', '房地产'],
168
-
169
- # 计算机 联动板块
170
- ['计算机设备', '计算机设备'],
171
- ['IT服务Ⅱ', 'IT服务'],
172
- ['软件开发', '软件开发'],
173
-
174
- # 环保
175
- ['环境治理', '环保'], # merge, 环保
176
- ['环保设备Ⅱ', '环保'], # merge '环保'
177
-
178
- # 电子
237
+ # 电子 19
179
238
  ['半导体', '半导体'],
180
239
  ['电子化学品Ⅱ', '电子化学品'],
181
240
  ['光学光电子', '光学光电子'],
@@ -183,99 +242,69 @@ def get_industry_final_fix_df():
183
242
  ['元件', '元件'],
184
243
  ['其他电子Ⅱ', '其他电子'], #
185
244
 
186
- # 金融 互联网金融 参股券商
187
- ['证券Ⅱ', '证券'],
188
- ['国有大型银行Ⅱ', '银行'], # merge to 银行
189
- ['城商行Ⅱ', '银行'], #
190
- ['农商行Ⅱ', '银行'], # merge 银行
191
- ['股份制银行Ⅱ', '银行'], # merge to 银行
192
- ['保险Ⅱ', '保险'],
193
- ['多元金融', '多元金融'],
194
-
195
- # 通信
196
- ['通信服务', '通信服务'],
197
- ['通信设备', '通信设备'],
198
-
199
- # 酒 喝死你
200
- ['白酒Ⅱ', '酒类'], # merge '酒类'
201
- ['非白酒', '酒类'], # merge '酒类'
202
-
203
- # 轻工制造
204
- ['造纸', '造纸'],
205
- ['包装印刷', '包装印刷'], #
206
- ['文娱用品', '文娱用品'], #
207
- ['家居用品', '家居用品'],
208
-
209
- # 纺织服装
210
- ['服装家纺', '纺织服装'], # merge 纺织服装
211
- ['纺织制造', '纺织服装'], # merge 纺织服装
212
- ['饰品', '饰品'], # todo exclude
213
-
214
- # 美容护理
215
- ['化妆品', '美容护理'], # merge to 美容护理
216
- ['医疗美容', '美容护理'], # merge 美容护理
217
- ['个护用品', '个护用品'],
218
-
219
- # 食品饮料
220
- ['饮料乳品', '饮料乳品'], # merge 食品饮料
221
- ['食品加工', '食品加工'], # merge 食品饮料
222
- ['调味发酵品Ⅱ', '调味发酵品'], # merge to 食品饮料
223
- ['休闲食品', '休闲食品'], # merge '食品饮料'
224
-
225
- # 石油石化
245
+ # 石油石化 20
226
246
  ['炼化及贸易', '石油行业'], # merge 石油行业
227
247
  ['油服工程', '采掘行业'], # merge '采掘行业'
228
248
  ['油气开采Ⅱ', '石油行业'], # merge to 石油行业
229
249
 
230
- # 钢铁
231
- ['普钢', '钢铁'], # merge 钢铁
232
- ['特钢Ⅱ', '钢铁'], # merge '钢铁'
233
- ['冶钢原料', '钢铁'], # merge to 钢铁
250
+ # 社会服务 21
251
+ ['专业服务', '社会专业服务'],
252
+ ['旅游及景区', '旅游及景区'],
253
+ ['酒店餐饮', '旅游酒店'],
254
+ ['教育', '教育'],
255
+ # ['体育Ⅱ', '体育'],
234
256
 
235
- # 有色金属
236
- ['能源金属', '能源金属'], # merge
237
- ['小金属', '小金属'],
238
- ['贵金属', '贵金属'], #
239
- ['金属新材料', '金属新材料'],
240
- # 铅锌 铝 铜
241
- ['工业金属', '工业金属'],
257
+ # 纺织服装 22
258
+ ['服装家纺', '纺织服装'], # merge 纺织服装
259
+ ['纺织制造', '纺织服装'], # merge 纺织服装
260
+ ['饰品', '饰品'],
242
261
 
243
- # 建筑装饰
244
- ['基础建设', '工程建设'],
245
- ['房屋建设Ⅱ', '工程建设'], # merge 工程建设
246
- ['工程咨询服务Ⅱ', '工程咨询服务'],
247
- ['专业工程', '建筑工程'],
248
- ['装修装饰Ⅱ', '装修装饰'],
249
- ['工程机械', '工程机械'],
262
+ # 综合 23
263
+ ['综合Ⅱ', '综合'],
250
264
 
251
- # 建筑材料
252
- ['装修建材', '装修建材'], #
253
- ['建筑建材', '装修建材'], #
254
- ['玻璃玻纤', '玻璃玻纤'],
255
- ['水泥', '水泥'],
265
+ # 美容护理 24
266
+ ['化妆品', '化妆美容'], # merge to 化妆美容
267
+ # ['医疗美容', '化妆美容'], # merge 化妆美容
268
+ ['个护用品', '个护用品'],
256
269
 
257
- # 旅游酒店
258
- ['酒店餐饮', '旅游酒店'], # merge to 旅游酒店
270
+ # 计算机 25
271
+ ['计算机设备', '计算机设备'],
272
+ ['IT服务Ⅱ', 'IT服务'],
273
+ ['软件开发', '软件开发'],
259
274
 
260
- ['旅游及景区', '旅游酒店'], # merge 旅游酒店
275
+ # 轻工制造 26
276
+ ['造纸', '造纸'],
277
+ ['包装印刷', '包装印刷'], #
278
+ ['文娱用品', '文娱用品'], #
279
+ ['家居用品', '家居用品'],
261
280
 
262
- # 煤炭
263
- ['焦炭Ⅱ', '煤炭'], # merge to 煤炭
264
- ['煤炭开采', '煤炭'], # merge 煤炭
281
+ # 通信 27
282
+ ['通信服务', '通信服务'],
283
+ ['通信设备', '通信设备'],
265
284
 
266
- ['教育', '教育'],
285
+ # 钢铁 28
286
+ ['普钢', '普钢'], #
287
+ ['特钢Ⅱ', '特钢'],
288
+ ['冶钢原料', '冶钢原料'],
267
289
 
268
- ['自动化设备', '自动化设备'],
269
- ['轨交设备Ⅱ', '轨交设备'],
290
+ # 银行 29
291
+ ['国有大型银行Ⅱ', '银行'], # merge to 银行
292
+ ['城商行Ⅱ', '银行'], #
293
+ ['农商行Ⅱ', '银行'], # merge 银行
294
+ ['股份制银行Ⅱ', '银行'], # merge to 银行
270
295
 
271
- # 机械设备 仪器仪表 农用机械 制冷空调设备 印刷包装机械 机床工具
272
- # 楼宇设备 磨具磨料 纺织服装设备 能源及重型设备 金属制品
273
- ['专用设备', '专用设备'], # todo exclude
274
- ['通用设备', '通用设备'], # todo exclude
275
- ['专业服务', '专业服务'], # todo exclude 无法具体分类
296
+ # 非银金融 30
297
+ ['证券Ⅱ', '证券'],
298
+ ['保险Ⅱ', '保险'],
299
+ ['多元金融', '多元金融'],
276
300
 
277
- ['体育Ⅱ', '综合'], # merge 综合Ⅱ
278
- ['综合Ⅱ', '综合'] # todo exclude
301
+ # 食品饮料 31
302
+ ['饮料乳品', '饮料乳品'], # merge 食品饮料
303
+ ['食品加工', '食品加工'], # merge 食品饮料
304
+ ['调味发酵品Ⅱ', '调味发酵品'], # merge to 食品饮料
305
+ ['休闲食品', '休闲食品'], # merge '食品饮料'
306
+ ['白酒Ⅱ', '白酒'],
307
+ ['非白酒', '非白酒']
279
308
 
280
309
  ], columns=['second_sw_industry', 'industry'])
281
310
 
@@ -287,24 +316,65 @@ def fix_industry_use_sw_third(company_info_df):
287
316
  company_info.loc[company_info.third_industry_code == '240303', 'industry'] = '铅锌'
288
317
  company_info.loc[company_info.third_industry_code == '240301', 'industry'] = '铝'
289
318
  company_info.loc[company_info.third_industry_code == '240302', 'industry'] = '铜'
319
+
320
+ company_info.loc[company_info.third_industry_code == '240303', 'second_sw_industry'] = '铅锌'
321
+ company_info.loc[company_info.third_industry_code == '240301', 'second_sw_industry'] = '铝'
322
+ company_info.loc[company_info.third_industry_code == '240302', 'second_sw_industry'] = '铜'
323
+
324
+ company_info.loc[company_info.third_industry_code == '240303', 'second_industry_code'] = '240303'
325
+ company_info.loc[company_info.third_industry_code == '240301', 'second_industry_code'] = '240301'
326
+ company_info.loc[company_info.third_industry_code == '240302', 'second_industry_code'] = '240302'
327
+
290
328
  # 细分专业设备
291
329
  company_info.loc[company_info.third_industry_code == '640203', 'industry'] = '能源及重型设备'
292
330
  company_info.loc[company_info.third_industry_code == '640204', 'industry'] = '楼宇设备'
293
331
  company_info.loc[company_info.third_industry_code == '640206', 'industry'] = '纺织服装设备'
294
332
  company_info.loc[company_info.third_industry_code == '640207', 'industry'] = '农用机械'
295
333
  company_info.loc[company_info.third_industry_code == '640208', 'industry'] = '印刷包装机械'
334
+
335
+ company_info.loc[company_info.third_industry_code == '640203', 'second_sw_industry'] = '能源及重型设备'
336
+ company_info.loc[company_info.third_industry_code == '640204', 'second_sw_industry'] = '楼宇设备'
337
+ company_info.loc[company_info.third_industry_code == '640206', 'second_sw_industry'] = '纺织服装设备'
338
+ company_info.loc[company_info.third_industry_code == '640207', 'second_sw_industry'] = '农用机械'
339
+ company_info.loc[company_info.third_industry_code == '640208', 'second_sw_industry'] = '印刷包装机械'
340
+
341
+ company_info.loc[company_info.third_industry_code == '640203', 'second_industry_code'] = '640203'
342
+ company_info.loc[company_info.third_industry_code == '640204', 'second_industry_code'] = '640204'
343
+ company_info.loc[company_info.third_industry_code == '640206', 'second_industry_code'] = '640206'
344
+ company_info.loc[company_info.third_industry_code == '640207', 'second_industry_code'] = '640207'
345
+ company_info.loc[company_info.third_industry_code == '640208', 'second_industry_code'] = '640208'
346
+
296
347
  # todo 细分
297
348
  company_info.loc[company_info.third_industry_code == '640209', 'industry'] = '专用设备'
298
- company_info.loc[company_info.third_industry_code == '630402', 'industry'] = '专用设备'
349
+ company_info.loc[company_info.third_industry_code == '640209', 'second_sw_industry'] = '专用设备'
350
+ company_info.loc[company_info.third_industry_code == '640209', 'second_industry_code'] = '640208'
351
+
352
+ company_info.loc[company_info.third_industry_code == '260205', 'industry'] = '专用设备'
353
+ company_info.loc[company_info.third_industry_code == '260205', 'second_sw_industry'] = '专用设备'
354
+ company_info.loc[company_info.third_industry_code == '260205', 'second_industry_code'] = '260205'
355
+
299
356
  # 细分通用设备
300
357
  company_info.loc[company_info.third_industry_code == '640101', 'industry'] = '机床工具'
301
358
  company_info.loc[company_info.third_industry_code == '640103', 'industry'] = '磨具磨料'
302
359
  company_info.loc[company_info.third_industry_code == '640105', 'industry'] = '制冷空调设备'
303
360
  company_info.loc[company_info.third_industry_code == '640106', 'industry'] = '通用设备'
304
361
  company_info.loc[company_info.third_industry_code == '640107', 'industry'] = '仪器仪表'
305
- company_info.loc[company_info.third_industry_code == '640301', 'industry'] = '仪器仪表'
306
- # todo 细分
307
362
  company_info.loc[company_info.third_industry_code == '640108', 'industry'] = '金属制品'
363
+
364
+ company_info.loc[company_info.third_industry_code == '640101', 'second_sw_industry'] = '机床工具'
365
+ company_info.loc[company_info.third_industry_code == '640103', 'second_sw_industry'] = '磨具磨料'
366
+ company_info.loc[company_info.third_industry_code == '640105', 'second_sw_industry'] = '制冷空调设备'
367
+ company_info.loc[company_info.third_industry_code == '640106', 'second_sw_industry'] = '通用设备'
368
+ company_info.loc[company_info.third_industry_code == '640107', 'second_sw_industry'] = '仪器仪表'
369
+ company_info.loc[company_info.third_industry_code == '640108', 'second_sw_industry'] = '金属制品'
370
+
371
+ company_info.loc[company_info.third_industry_code == '640101', 'second_industry_code'] = '640101'
372
+ company_info.loc[company_info.third_industry_code == '640103', 'second_industry_code'] = '640103'
373
+ company_info.loc[company_info.third_industry_code == '640105', 'second_industry_code'] = '640105'
374
+ company_info.loc[company_info.third_industry_code == '640106', 'second_industry_code'] = '640106'
375
+ company_info.loc[company_info.third_industry_code == '640107', 'second_industry_code'] = '640107'
376
+ company_info.loc[company_info.third_industry_code == '640108', 'second_industry_code'] = '640108'
377
+
308
378
  return company_info
309
379
 
310
380
 
@@ -351,14 +421,6 @@ def fix_symbol_industry(company_info, symbol):
351
421
  return company_info
352
422
 
353
423
 
354
- def fix_one_symbol():
355
- symbol = '300483'
356
- company_info = mongodb_util.find_query_data('company_info', query={'_id': symbol})
357
- company_info = fix_symbol_industry(company_info, symbol)
358
- company_info['industry'] = company_info['second_sw_industry']
359
- mongodb_util.save_mongo(company_info, 'company_info')
360
-
361
-
362
424
  def filed_sort(company_info):
363
425
  return company_info[[
364
426
  "_id",
@@ -423,6 +485,5 @@ def filed_sort(company_info):
423
485
 
424
486
 
425
487
  if __name__ == '__main__':
426
- fix_one_symbol()
427
- industry_df_test = get_industry_final_fix_df()
488
+ industry_df_test = get_fix_industry_name_df()
428
489
  print(industry_df_test)
@@ -196,7 +196,7 @@ def update_company_info(new_concept_symbol_df):
196
196
  if new_concept_symbol_df.shape[0] > 0:
197
197
  symbol_list = list(new_concept_symbol_df['symbol'])
198
198
  company_info_sync_api.sync_company_base_info(symbol_list)
199
- company_info_clean_api.fix_company_industry(None)
199
+ company_info_clean_api.clean_company_info(None)
200
200
  # 公司缓存信息清除
201
201
  company_common_service_api.company_info_industry_cache_clear()
202
202
 
@@ -0,0 +1,7 @@
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)
@@ -0,0 +1,7 @@
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)
@@ -0,0 +1,58 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 16
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
8
+ import mns_common.api.ths.concept.app.ths_concept_index_app as ths_concept_index_app
9
+ from datetime import datetime
10
+ import mns_common.component.trade_date.trade_date_common_service_api as trade_date_common_service_api
11
+ import mns_common.utils.date_handle_util as date_handle_util
12
+ import mns_common.utils.data_frame_util as data_frame_util
13
+ import pandas as pd
14
+ import mns_common.component.common_service_fun_api as common_service_fun_api
15
+
16
+
17
+ # 通过api 获取ths行业和指数
18
+ def get_ths_index_by_api(query_type):
19
+ now_date = datetime.now()
20
+ hour = now_date.hour
21
+ minute = now_date.minute
22
+ now_str_day = now_date.strftime('%Y-%m-%d')
23
+
24
+ is_trade_day = trade_date_common_service_api.is_trade_day(now_str_day)
25
+
26
+ if bool(1 - is_trade_day):
27
+ last_trade_day = trade_date_common_service_api.get_before_trade_date(now_str_day, 1)
28
+ begin_time = date_handle_util.no_slash_date(last_trade_day) + '093000'
29
+ end_time = date_handle_util.no_slash_date(last_trade_day) + '150000'
30
+ else:
31
+ if hour < 9 or (hour == 9 and minute <= 25):
32
+ last_trade_day = trade_date_common_service_api.get_before_trade_date(now_str_day, 2)
33
+ begin_time = date_handle_util.no_slash_date(last_trade_day) + '093000'
34
+ end_time = date_handle_util.no_slash_date(last_trade_day) + '150000'
35
+ else:
36
+ begin_time = date_handle_util.no_slash_date(now_str_day) + '093000'
37
+ if hour == 9:
38
+ hour = '0' + str(hour)
39
+ end_time = date_handle_util.no_slash_date(now_str_day) + str(hour) + str(minute) + '00'
40
+ elif (hour == 11 and minute >= 30) or (hour == 12):
41
+ end_time = date_handle_util.no_slash_date(now_str_day) + '113000'
42
+ elif hour >= 15:
43
+ end_time = date_handle_util.no_slash_date(now_str_day) + '150000'
44
+ else:
45
+ end_time = date_handle_util.no_slash_date(now_str_day) + str(hour) + str(minute) + '00'
46
+
47
+ df = ths_concept_index_app.get_ths_concept_his_info(begin_time, end_time, 500, query_type)
48
+ if data_frame_util.is_empty(df):
49
+ return pd.DataFrame()
50
+ df['turnover'] = round(df['turnover'] / common_service_fun_api.HUNDRED_MILLION, 1)
51
+ df['net_inflow_of_main_force'] = round(df['net_inflow_of_main_force'] / common_service_fun_api.TEN_THOUSAND, 1)
52
+ df.fillna('', inplace=True)
53
+ return df
54
+
55
+
56
+ if __name__ == '__main__':
57
+ df_industry = get_ths_index_by_api(1)
58
+ print(df_industry)
@@ -0,0 +1,68 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 16
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
8
+ import mns_scheduler.industry.ths.ths_industry_index_service as ths_industry_index_service
9
+ from mns_common.db.MongodbUtil import MongodbUtil
10
+ import time
11
+ from datetime import datetime
12
+ from loguru import logger
13
+ import mns_common.utils.data_frame_util as data_frame_util
14
+ import mns_common.api.ths.concept.app.ths_concept_detail_app as ths_concept_detail_app
15
+
16
+ mongodb_util = MongodbUtil('27017')
17
+ import mns_common.constant.db_name_constant as db_name_constant
18
+
19
+
20
+ # 同步同花顺行业指数
21
+ def sync_ths_industry_index():
22
+ ths_industry_index_df = ths_industry_index_service.get_ths_index_by_api(1)
23
+ if data_frame_util.is_empty(ths_industry_index_df):
24
+ return None
25
+ ths_industry_index_df['_id'] = ths_industry_index_df['block_code']
26
+ ths_industry_index_df = ths_industry_index_df[[
27
+ '_id',
28
+ 'turnover',
29
+ 'block_market',
30
+ 'block_code',
31
+ 'block_name',
32
+ 'net_inflow_of_main_force',
33
+ 'chg'
34
+ ]]
35
+ now_date = datetime.now()
36
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
37
+ ths_industry_index_df['str_now_date'] = str_now_date
38
+ mongodb_util.save_mongo(ths_industry_index_df, db_name_constant.THS_INDUSTRY_LIST)
39
+
40
+
41
+ def sync_ths_industry_detail():
42
+ ths_industry_list_df = mongodb_util.find_all_data(db_name_constant.THS_INDUSTRY_LIST)
43
+ for industry_one in ths_industry_list_df.itertuples():
44
+ try:
45
+ time.sleep(1)
46
+ now_date = datetime.now()
47
+ str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
48
+
49
+ ths_industry_symbol_detail_df = ths_concept_detail_app.get_ths_concept_detail_by_app(
50
+ industry_one.block_code)
51
+ ths_industry_symbol_detail_df = ths_industry_symbol_detail_df.rename(
52
+ columns={"concept_code": 'ths_industry_code',
53
+ "concept_name": 'ths_industry_name',
54
+ })
55
+ if data_frame_util.is_empty(ths_industry_symbol_detail_df):
56
+ continue
57
+ ths_industry_symbol_detail_df['str_now_date'] = str_now_date
58
+ ths_industry_symbol_detail_df['_id'] = ths_industry_symbol_detail_df['symbol']
59
+ mongodb_util.save_mongo(ths_industry_symbol_detail_df, db_name_constant.THS_STOCK_INDUSTRY_DETAIL)
60
+ logger.info("同步ths行业股票详情:{}", industry_one.block_name)
61
+
62
+ except BaseException as e:
63
+ logger.error("同步ths行业股票详情异常:{}", e)
64
+
65
+
66
+ if __name__ == '__main__':
67
+ sync_ths_industry_index()
68
+ sync_ths_industry_detail()
@@ -56,6 +56,7 @@ import mns_scheduler.hk.hk_industry_info_sync_service_api as hk_industry_info_sy
56
56
  import mns_scheduler.hk.hk_company_info_sync_service_api as hk_company_info_sync_service_api
57
57
  import mns_scheduler.zt.zt_pool.update_null_zt_reason_api as update_null_zt_reason_api
58
58
  import mns_scheduler.trade.tfp.stock_tfp_info_sync as stock_tfp_info_sync
59
+ import mns_scheduler.industry.ths.ths_industry_sync_service as ths_industry_sync_service
59
60
 
60
61
 
61
62
  # 同步交易日期任务完成
@@ -288,7 +289,7 @@ def sync_new_concept_index_task():
288
289
  # 清洗公司基本信息
289
290
  def update_company_base_info():
290
291
  company_info_sync_api.sync_company_base_info(None)
291
- company_info_clean_api.fix_company_industry(None)
292
+ company_info_clean_api.clean_company_info(None)
292
293
  # 退市股票同步
293
294
  de_list_stock_service.sync_de_list_stock()
294
295
  logger.info('同步公司基本信息任务完成')
@@ -404,6 +405,13 @@ def sync_stock_tfp():
404
405
  stock_tfp_info_sync.sync_stock_tfp(str_day)
405
406
 
406
407
 
408
+ def sync_ths_industry_info():
409
+ logger.info("同步同花顺行业信息开始")
410
+ ths_industry_sync_service.sync_ths_industry_index()
411
+ ths_industry_sync_service.sync_ths_industry_detail()
412
+ logger.info("同步同花顺行业信息完成")
413
+
414
+
407
415
  # # 定义BlockingScheduler
408
416
  blockingScheduler = BlockingScheduler()
409
417
  # sync_trade_date 同步交易日期
@@ -495,7 +503,7 @@ blockingScheduler.add_job(trader_client_auto_login, 'cron', hour='08,12', minute
495
503
  # 同步公司备注信息
496
504
  blockingScheduler.add_job(sync_company_remark_info, 'cron', hour='22', minute='30')
497
505
  # 自选股操作
498
- blockingScheduler.add_job(self_choose_stock_task, 'cron', hour='17,22', minute='30')
506
+ blockingScheduler.add_job(self_choose_stock_task, 'cron', hour='08,17,21', minute='30')
499
507
  # 同步财务报表任务
500
508
  blockingScheduler.add_job(sync_financial_report_task, 'cron', hour='17', minute='30')
501
509
 
@@ -504,6 +512,9 @@ blockingScheduler.add_job(sync_hk_company_industry_info, 'cron', hour='08,15', m
504
512
  # 更新空的涨停原因股票
505
513
  blockingScheduler.add_job(update_null_zt_reason, 'cron', hour='16,17,18,19,20,21,22,23', minute='19')
506
514
 
515
+ # 同步同花顺行业信息
516
+ blockingScheduler.add_job(sync_ths_industry_info, 'cron', hour='17,22', minute='38')
517
+
507
518
  # 同步新公告信息 感觉没有必要同步 直接连接过去查看
508
519
  # blockingScheduler.add_job(sync_company_announce, 'cron', hour='07,18,23', minute='33')
509
520
 
@@ -1,4 +1,4 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mns-scheduler
3
- Version: 1.2.3.6
3
+ Version: 1.2.3.7
4
4
 
@@ -10,9 +10,9 @@ mns_scheduler/company_info/base/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4I
10
10
  mns_scheduler/company_info/base/sync_company_base_info_api.py,sha256=aaOqOs9X-0K7Wkqo0uOeuT4BERKx6HkmaSZmGuD3DBc,20553
11
11
  mns_scheduler/company_info/base/sync_company_hold_info_api.py,sha256=W3Nj9st45efx8cy_42PRTcOXijWKnkO1-ZFRyyfR3S0,1587
12
12
  mns_scheduler/company_info/clean/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
13
- mns_scheduler/company_info/clean/company_info_clean_api.py,sha256=HvWZl70zgDxD74wk1z0jZqj3DIUBQGs0wqeT3g6yWi8,4876
13
+ mns_scheduler/company_info/clean/company_info_clean_api.py,sha256=pDTOowP7byNK2i3XQJhKwLx6YFUq2Az30ckeqe5EEQE,6095
14
14
  mns_scheduler/company_info/constant/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
15
- mns_scheduler/company_info/constant/company_constant_data.py,sha256=-v3HDHO5pWrCgfHk-NjDPVrQb2yhjw2PByzyOcHLLwU,18361
15
+ mns_scheduler/company_info/constant/company_constant_data.py,sha256=px-JlvgPNFZXMgf-rpGWpYsrjdObStxRljfXisI-3Oo,22323
16
16
  mns_scheduler/company_info/de_list_stock/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
17
17
  mns_scheduler/company_info/de_list_stock/de_list_stock_service.py,sha256=GCp6hlvO-SuH1oIpEsYZwEnGUOa6fXb2D7CqAUYXKQA,1993
18
18
  mns_scheduler/company_info/remark/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
@@ -23,7 +23,7 @@ mns_scheduler/concept/clean/kpl_concept_clean_api.py,sha256=xxIIgrXLI6xLf10t4unJ
23
23
  mns_scheduler/concept/clean/ths_concept_clean_api.py,sha256=ICp1g2jP13Px1ett1En05vPzUaB25Usp7r2_L-seRgU,7077
24
24
  mns_scheduler/concept/ths/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
25
25
  mns_scheduler/concept/ths/common/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
26
- mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py,sha256=lXzAWRJMU3jsXf1mhFaIOyEsRBWCndXDf41Dc40FDdU,10320
26
+ mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py,sha256=uQ-cOBZ7mpYCvYwSvoJXadOqlHnoLvwUaEbm1ccr6Zs,10318
27
27
  mns_scheduler/concept/ths/common/ths_concept_update_common_api.py,sha256=4BQT3A9t-nDIyCpILgRZF7ZOgK1oabp-gJl5nyWvKWc,4418
28
28
  mns_scheduler/concept/ths/detaill/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
29
  mns_scheduler/concept/ths/detaill/ths_concept_detail_api.py,sha256=WLXmy6dhKF5GJePDoj-E80KLLMwJHeDYlq8bEhGS4W4,10883
@@ -55,6 +55,10 @@ mns_scheduler/finance/sync_financial_report_service_api.py,sha256=NTdL2bIpo3-pGC
55
55
  mns_scheduler/hk/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
56
56
  mns_scheduler/hk/hk_company_info_sync_service_api.py,sha256=yZuJa3hDxudkfjurG4Z0LpA8X5JT6UAKESkVhKRNqx4,3746
57
57
  mns_scheduler/hk/hk_industry_info_sync_service_api.py,sha256=HG-_KMQL3irL5pFbrnnv6srFT1Bo04QWwS_Kh3Qg0OU,2403
58
+ mns_scheduler/industry/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
59
+ mns_scheduler/industry/ths/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
60
+ mns_scheduler/industry/ths/ths_industry_index_service.py,sha256=FcP4J0p3HP2tqD19dNmQfcShTl0hY7Ke7DJWat1MZFE,2686
61
+ mns_scheduler/industry/ths/ths_industry_sync_service.py,sha256=gAzvEG6rHdi0AXmo5vFxeJE81H1bqhE2kMLxZLW0nMQ,2762
58
62
  mns_scheduler/irm/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
59
63
  mns_scheduler/irm/stock_irm_cninfo_service.py,sha256=mTwD7ZYKk9XlA3KD1SQWz2A8-OKAH2mdUl2A9Pzwrz8,9560
60
64
  mns_scheduler/irm/api/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
@@ -142,8 +146,8 @@ mns_scheduler/zt/zt_pool/em_zt_pool_sync_api.py,sha256=F3IzCFgVPRxyC9j90aLLF1SO3
142
146
  mns_scheduler/zt/zt_pool/ths_zt_pool_sync_api.py,sha256=Sy39T-yFwLSIIoSZqQzS-6-W1RlaFWvYpksEXKQVFdI,10456
143
147
  mns_scheduler/zt/zt_pool/update_null_zt_reason_api.py,sha256=1uoiR2Uw46kDfjkvNg2US5rd_4OIkYO3872gIJOufUY,2135
144
148
  mns_scheduler/zz_task/__init__.py,sha256=QWBdZwBCvQw8aS4hnL9_pg3U3ZiNLUXzlImyy9WhUcI,163
145
- mns_scheduler/zz_task/data_sync_task.py,sha256=Kpv5LS_Vw6W90Ak_R2uOtCcYXRMu9LRKqviVA3OqHtI,21201
146
- mns_scheduler-1.2.3.6.dist-info/METADATA,sha256=xGoalNKW0yEnEMLzqY3favOvn-BhWPYzjNKno_sXlxM,64
147
- mns_scheduler-1.2.3.6.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
148
- mns_scheduler-1.2.3.6.dist-info/top_level.txt,sha256=PXQDFBGR1pWmsUbH5yiLAh71P5HZODTRED0zJ8CCgOc,14
149
- mns_scheduler-1.2.3.6.dist-info/RECORD,,
149
+ mns_scheduler/zz_task/data_sync_task.py,sha256=RIk2ymL9xFQB5OkKWL2NAbTaDzQVaAZ1PkkhgQb9pxI,21669
150
+ mns_scheduler-1.2.3.7.dist-info/METADATA,sha256=B_mupKf-iss7p1uQvqOX-YgJIHusaLw-BKGK-RvunFE,64
151
+ mns_scheduler-1.2.3.7.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
152
+ mns_scheduler-1.2.3.7.dist-info/top_level.txt,sha256=PXQDFBGR1pWmsUbH5yiLAh71P5HZODTRED0zJ8CCgOc,14
153
+ mns_scheduler-1.2.3.7.dist-info/RECORD,,