mns-scheduler 1.0.8.7__py3-none-any.whl → 1.4.3.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. mns_scheduler/__init__.py +1 -3
  2. mns_scheduler/company_info/announce/company_announce_sync_service.py +65 -0
  3. mns_scheduler/company_info/{company_info_sync_api.py → base/sync_company_base_info_api.py} +239 -227
  4. mns_scheduler/company_info/base/sync_company_hold_info_api.py +37 -0
  5. mns_scheduler/company_info/base/sync_company_product_area_industry.py +161 -0
  6. mns_scheduler/company_info/clean/company_info_clean_api.py +133 -0
  7. mns_scheduler/company_info/constant/company_constant_data.py +497 -0
  8. mns_scheduler/company_info/{de_list_stock_service.py → de_list_stock/de_list_stock_service.py} +1 -1
  9. mns_scheduler/company_info/em_stock_info/__init__.py +7 -0
  10. mns_scheduler/company_info/em_stock_info/sync_em_stock_info_sync.py +80 -0
  11. mns_scheduler/company_info/remark/__init__.py +7 -0
  12. mns_scheduler/company_info/remark/company_remark_info_sync.py +46 -0
  13. mns_scheduler/concept/clean/kpl_concept_clean_api.py +1 -1
  14. mns_scheduler/concept/clean/ths_concept_clean_api.py +74 -51
  15. mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py +112 -56
  16. mns_scheduler/concept/ths/common/ths_concept_update_common_api.py +6 -6
  17. mns_scheduler/concept/ths/detaill/__init__.py +0 -0
  18. mns_scheduler/concept/ths/detaill/ths_concept_detail_api.py +226 -0
  19. mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_new_index_api.py +169 -0
  20. mns_scheduler/concept/ths/update_concept_info/sync_one_concept_all_symbols_api.py +11 -23
  21. mns_scheduler/concept/ths/update_concept_info/sync_one_symbol_all_concepts_api.py +19 -15
  22. mns_scheduler/db/col_move_service.py +10 -7
  23. mns_scheduler/db/db_status.py +1 -1
  24. mns_scheduler/db/script/__init__.py +7 -0
  25. mns_scheduler/db/script/col_move_script.py +45 -0
  26. mns_scheduler/db/script/db_move/__init__.py +7 -0
  27. mns_scheduler/db/script/db_move/col_move_one_service.py +34 -0
  28. mns_scheduler/db/script/sync/__init__.py +7 -0
  29. mns_scheduler/db/script/sync/local_mongo_util.py +231 -0
  30. mns_scheduler/db/script/sync/remote_data_sync_to_local.py +105 -0
  31. mns_scheduler/db/script/sync/remote_mongo_util.py +306 -0
  32. mns_scheduler/db/script/sync/sync_hui_ce_test_data.py +80 -0
  33. mns_scheduler/db/script/sync/sync_hui_ce_test_data_01.py +69 -0
  34. mns_scheduler/db/script/update/__init__.py +7 -0
  35. mns_scheduler/db/script/update/update_col_field.py +36 -0
  36. mns_scheduler/finance/__init__.py +1 -1
  37. mns_scheduler/finance/{em_financial_asset_liability_sync_service_api.py → em/em_financial_asset_liability_sync_service_api.py} +3 -3
  38. mns_scheduler/finance/{em_financial_profit_sync_service_api.py → em/em_financial_profit_sync_service_api.py} +30 -25
  39. mns_scheduler/finance/{finance_common_api.py → em/finance_common_api.py} +4 -4
  40. mns_scheduler/finance/sync_financial_report_service_task.py +202 -0
  41. mns_scheduler/finance/xue_qiu/down_load_xueqiu_report_api.py +77 -0
  42. mns_scheduler/finance/xue_qiu/sync_xue_qiu_fiance_data.py +161 -0
  43. mns_scheduler/hk/__init__.py +1 -1
  44. mns_scheduler/hk/hk_company_info_sync_service_api.py +49 -5
  45. mns_scheduler/hk/hk_industry_info_sync_service_api.py +68 -0
  46. mns_scheduler/industry/__init__.py +7 -0
  47. mns_scheduler/industry/ths/__init__.py +7 -0
  48. mns_scheduler/industry/ths/ths_industry_index_service.py +58 -0
  49. mns_scheduler/industry/ths/ths_industry_sync_service.py +68 -0
  50. mns_scheduler/irm/__init__.py +1 -1
  51. mns_scheduler/irm/api/__init__.py +1 -1
  52. mns_scheduler/irm/api/sh_stock_sns_sse_info_api.py +1 -1
  53. mns_scheduler/irm/api/sz_stock_sns_sse_info_api.py +1 -1
  54. mns_scheduler/irm/stock_irm_cninfo_service.py +15 -13
  55. mns_scheduler/k_line/clean/daily/__init__.py +1 -1
  56. mns_scheduler/k_line/clean/daily/daily_k_line_clean_common_service.py +57 -7
  57. mns_scheduler/k_line/clean/daily/daily_k_line_service.py +16 -3
  58. mns_scheduler/k_line/clean/k_line_info_clean_impl.py +3 -2
  59. mns_scheduler/k_line/clean/k_line_info_clean_task.py +42 -31
  60. mns_scheduler/k_line/clean/week_month/__init__.py +1 -1
  61. mns_scheduler/k_line/clean/week_month/normal_week_month_k_line_service.py +125 -27
  62. mns_scheduler/k_line/clean/week_month/sub_new_week_month_k_line_service.py +72 -17
  63. mns_scheduler/k_line/common/__init__.py +7 -0
  64. mns_scheduler/k_line/common/k_line_common_api.py +188 -0
  65. mns_scheduler/k_line/hot_stocks/__init__.py +1 -1
  66. mns_scheduler/k_line/hot_stocks/recent_hot_stocks_clean_service.py +1 -1
  67. mns_scheduler/k_line/month_week_daily/bfq_k_line_sync.py +77 -0
  68. mns_scheduler/k_line/{sync → month_week_daily}/daily_week_month_line_sync.py +14 -14
  69. mns_scheduler/k_line/sync_status/__init__.py +7 -0
  70. mns_scheduler/k_line/sync_status/k_line_sync_status_check.py +54 -0
  71. mns_scheduler/k_line/test/__init__.py +7 -0
  72. mns_scheduler/k_line/test/k_line_info_clean_his_data.py +41 -0
  73. mns_scheduler/k_line/year_quarter/__init__.py +7 -0
  74. mns_scheduler/k_line/year_quarter/year_quarter_line_sync.py +76 -0
  75. mns_scheduler/kpl/selection/symbol/sync_best_choose_symbol.py +4 -2
  76. mns_scheduler/kpl/selection/symbol/sync_kpl_concept_symbol_choose_reason_api.py +108 -0
  77. mns_scheduler/kpl/selection/total/sync_kpl_best_total_sync_api.py +12 -7
  78. mns_scheduler/lhb/__init__.py +1 -1
  79. mns_scheduler/lhb/stock_lhb_sync_service.py +1 -1
  80. mns_scheduler/open/__init__.py +1 -1
  81. mns_scheduler/open/sync_one_day_open_data_to_db_service.py +6 -22
  82. mns_scheduler/risk/__init__.py +1 -1
  83. mns_scheduler/risk/compliance/__init__.py +0 -0
  84. mns_scheduler/risk/compliance/undisclosed_annual_report_api.py +71 -0
  85. mns_scheduler/risk/financial/__init__.py +0 -0
  86. mns_scheduler/risk/financial/annual_report_audit_check_api.py +54 -0
  87. mns_scheduler/risk/financial/net_assets_check_api.py +75 -0
  88. mns_scheduler/risk/financial/profit_income_check_api.py +80 -0
  89. mns_scheduler/risk/financial/stock_equity_mortgage_check_api.py +1 -0
  90. mns_scheduler/risk/financial_report_risk_check_api.py +42 -0
  91. mns_scheduler/risk/major_violations/__init__.py +0 -0
  92. mns_scheduler/risk/{register_and_investigate_stock_sync_api.py → major_violations/register_and_investigate_stock_sync_api.py} +17 -8
  93. mns_scheduler/risk/self/__init__.py +0 -0
  94. mns_scheduler/risk/{wei_pan_stock_api.py → self/wei_pan_stock_api.py} +10 -4
  95. mns_scheduler/risk/test/__init__.py +7 -0
  96. mns_scheduler/{finance → risk}/test/fix_blask_list.py +6 -10
  97. mns_scheduler/risk/transactions/__init__.py +0 -0
  98. mns_scheduler/risk/transactions/transactions_check_api.py +183 -0
  99. mns_scheduler/self_choose/__init__.py +7 -0
  100. mns_scheduler/self_choose/ths_self_choose_service.py +158 -0
  101. mns_scheduler/trade/auto_ipo_buy_api.py +2 -2
  102. mns_scheduler/trade/auto_login/__init__.py +7 -0
  103. mns_scheduler/trade/auto_login/trader_auto_service.py +32 -0
  104. mns_scheduler/trade/auto_sell_service_api.py +10 -8
  105. mns_scheduler/trade/balance/__init__.py +7 -0
  106. mns_scheduler/trade/balance/ths_account_balance_service.py +7 -0
  107. mns_scheduler/trade/sync_position_api.py +41 -8
  108. mns_scheduler/trade/task/__init__.py +7 -0
  109. mns_scheduler/trade/task/trader_task_service.py +65 -0
  110. mns_scheduler/trade/tfp/__init__.py +7 -0
  111. mns_scheduler/trade/tfp/stock_tfp_info_sync.py +56 -0
  112. mns_scheduler/zb/stock_zb_pool_sync.py +1 -15
  113. mns_scheduler/zt/high_chg/sync_high_chg_pool_service.py +2 -3
  114. mns_scheduler/zt/high_chg/sync_high_chg_real_time_quotes_service.py +12 -8
  115. mns_scheduler/zt/open_data/kcx_high_chg_open_data_sync.py +10 -25
  116. mns_scheduler/zt/script/__init__.py +1 -1
  117. mns_scheduler/zt/script/fix_error_deal_day.py +41 -0
  118. mns_scheduler/zt/script/kcx_high_chg_open_his_data_handle.py +2 -11
  119. mns_scheduler/zt/script/sync_high_chg_pool_his_data.py +2 -2
  120. mns_scheduler/zt/script/sync_now_higt_chg_zt.py +43 -0
  121. mns_scheduler/zt/zt_pool/em_zt_pool_sync_api.py +413 -0
  122. mns_scheduler/zt/zt_pool/ths_zt_pool_sync_api.py +193 -0
  123. mns_scheduler/zt/zt_pool/update_null_zt_reason_api.py +58 -0
  124. mns_scheduler/zz_task/compensation/__init__.py +0 -0
  125. mns_scheduler/zz_task/compensation/compensate_task.py +161 -0
  126. mns_scheduler/zz_task/compensation/compensate_task_one_day.py +142 -0
  127. mns_scheduler/zz_task/data_sync_task.py +271 -121
  128. {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.4.3.2.dist-info}/METADATA +1 -1
  129. mns_scheduler-1.4.3.2.dist-info/RECORD +169 -0
  130. {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.4.3.2.dist-info}/WHEEL +1 -1
  131. mns_scheduler/backup/app/ths_new_concept_sync_app.py +0 -122
  132. mns_scheduler/backup/em/em_new_concept_his_sync.py +0 -99
  133. mns_scheduler/backup/em/em_new_concept_sync_common_api.py +0 -139
  134. mns_scheduler/backup/em/em_new_concept_sync_web.py +0 -55
  135. mns_scheduler/backup/wen_cai/wen_cai_concept_sync.py +0 -51
  136. mns_scheduler/big_deal/ths_big_deal_sync.py +0 -98
  137. mns_scheduler/company_info/company_constant_data.py +0 -322
  138. mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_by_ak_api.py +0 -103
  139. mns_scheduler/concept/ths/sync_new_index/sync_ths_new_concept_by_web_api.py +0 -89
  140. mns_scheduler/finance/financial_high_risk_stock_clean_service_api.py +0 -202
  141. mns_scheduler/finance/sync_financial_report_service_api.py +0 -113
  142. mns_scheduler/real_time/realtime_quotes_now_create_db_index.py +0 -27
  143. mns_scheduler/real_time/realtime_quotes_now_sync.py +0 -232
  144. mns_scheduler/risk/stock_equity_mortgage_sync_api.py +0 -32
  145. mns_scheduler/zt/zt_pool/zt_pool_sync_api.py +0 -151
  146. mns_scheduler/zz_task/sync_realtime_quotes_task.py +0 -28
  147. mns_scheduler-1.0.8.7.dist-info/RECORD +0 -112
  148. /mns_scheduler/{backup/app → company_info/announce}/__init__.py +0 -0
  149. /mns_scheduler/{backup/em → company_info/base}/__init__.py +0 -0
  150. /mns_scheduler/{backup/wen_cai → company_info/clean}/__init__.py +0 -0
  151. /mns_scheduler/{big_deal → company_info/constant}/__init__.py +0 -0
  152. /mns_scheduler/{real_time → company_info/de_list_stock}/__init__.py +0 -0
  153. /mns_scheduler/{backup → finance/em}/__init__.py +0 -0
  154. /mns_scheduler/finance/{test → xue_qiu}/__init__.py +0 -0
  155. /mns_scheduler/k_line/{sync → month_week_daily}/__init__.py +0 -0
  156. {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.4.3.2.dist-info}/top_level.txt +0 -0
@@ -9,9 +9,8 @@ sys.path.append(project_path)
9
9
  from datetime import datetime
10
10
  import pandas as pd
11
11
  from loguru import logger
12
- import mns_common.api.ths.ths_stock_api as ths_stock_api
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 company_constant_data_api
12
+ import mns_common.api.ths.concept.web.ths_company_info_web as ths_company_info_web
13
+ import mns_common.component.em.em_stock_info_api as em_stock_info_api
15
14
  import mns_common.component.common_service_fun_api as common_service_fun_api
16
15
  import mns_common.component.concept.ths_concept_common_service_api as ths_concept_common_service_api
17
16
  from mns_common.db.MongodbUtil import MongodbUtil
@@ -21,10 +20,12 @@ import mns_common.api.kpl.constant.kpl_constant as kpl_constant
21
20
  import mns_common.component.company.company_common_service_api as company_common_service_api
22
21
  import mns_common.component.k_line.common.k_line_common_service_api as k_line_common_service_api
23
22
  import mns_common.constant.db_name_constant as db_name_constant
23
+ from functools import lru_cache
24
+ import mns_scheduler.company_info.base.sync_company_hold_info_api as sync_company_hold_info_api
24
25
 
25
26
  mongodb_util = MongodbUtil('27017')
26
27
  # 分页大小
27
- MAX_PAGE_NUMBER = 6000
28
+ MAX_PAGE_NUMBER = 2000
28
29
  import threading
29
30
 
30
31
  # 定义一个全局锁,用于保护 result 变量的访问
@@ -33,200 +34,15 @@ result_lock = threading.Lock()
33
34
  result = []
34
35
 
35
36
 
36
- # 计算实际流通比例
37
- def calculate_circu_ratio(symbol):
38
- query = {"symbol": symbol}
39
- stock_gdfx_free_top_10 = mongodb_util.descend_query(query, 'stock_gdfx_free_top_10', "period", 10)
40
- if stock_gdfx_free_top_10.shape[0] == 0:
41
- mv_circulation_ratio = 1
42
- else:
43
- # 排除香港结算公司 大于5%减持不用发公告 香港中央结算 HKSCC
44
- stock_gdfx_free_top_10['is_hk'] = stock_gdfx_free_top_10['shareholder_name'].apply(
45
- lambda shareholder_name: "HK" if shareholder_name.startswith('香港中央结算') or shareholder_name.startswith(
46
- 'HKSCC') else "A")
47
-
48
- # 持股大于5% # 排除香港结算公司 大于5%减持不用发公告 香港中央结算 HKSCC
49
- stock_gdfx_free_top_10 = stock_gdfx_free_top_10.loc[
50
- (stock_gdfx_free_top_10['circulation_ratio'] >= 5) & (stock_gdfx_free_top_10['is_hk'] == 'A')]
51
-
52
- circulation_ratio = sum(stock_gdfx_free_top_10['circulation_ratio'])
53
- mv_circulation_ratio = round((100 - circulation_ratio) / 100, 2)
54
- # 防止错误数据
55
- if mv_circulation_ratio < 0:
56
- mv_circulation_ratio = 1
57
- return mv_circulation_ratio
58
-
59
-
60
- def filed_sort(company_info):
61
- return company_info[[
62
- "_id",
63
- "name",
64
- "industry",
65
- "first_sw_industry",
66
- "first_industry_code",
67
- "second_sw_industry",
68
- "second_industry_code",
69
- "third_sw_industry",
70
- "third_industry_code",
71
- "ths_concept_name",
72
- "ths_concept_code",
73
- "ths_concept_sync_day",
74
- "em_industry",
75
- "em_concept",
76
- "business_nature",
77
- "actual_controller_name",
78
- "actual_controller_rate",
79
- "final_controller_name",
80
- "final_controller_rate",
81
- "mv_circulation_ratio",
82
- "flow_mv_sp",
83
- "total_mv_sp",
84
- "now_price",
85
- "total_share",
86
- "flow_share",
87
- "total_mv",
88
- "flow_mv",
89
- "flow_mv_level",
90
- "holder_controller_name",
91
- "holder_controller_rate",
92
- "area",
93
- "list_date",
94
- "deal_days",
95
- "pe_ttm",
96
- "pb",
97
- "ROE",
98
- "classification",
99
- "base_business",
100
- "address",
101
- "market_id",
102
- "symbol",
103
- "amount",
104
- "sync_date",
105
- "ths_concept_list_info",
106
- "kpl_plate_name",
107
- "kpl_most_relative_name",
108
- "kpl_plate_list_info",
109
- 'operate_profit',
110
- 'total_operate_income'
111
- ]]
112
-
113
-
114
- def get_east_money_stock_info():
115
- all_real_time_quotes = east_money_stock_v2_api.get_all_real_time_quotes()
116
- all_real_time_quotes = all_real_time_quotes[['symbol',
117
- 'name',
118
- "now_price",
119
- 'total_mv',
120
- 'flow_mv',
121
- 'pe_ttm',
122
- 'sz_sh',
123
- 'area',
124
- 'pb',
125
- 'list_date',
126
- 'ROE',
127
- 'total_share',
128
- 'flow_share',
129
- 'industry',
130
- 'amount',
131
- 'concept']]
132
-
133
- return all_real_time_quotes
134
-
135
-
136
- def create_index():
137
- mongodb_util.create_index('company_info',
138
- [("classification", 1)])
139
- mongodb_util.create_index('company_info',
140
- [("industry", 1)])
141
- mongodb_util.create_index('company_info',
142
- [("flow_mv", 1)])
143
- mongodb_util.create_index('company_info',
144
- [("list_date", 1)])
145
- mongodb_util.create_index('company_info',
146
- [("symbol", 1)])
147
-
148
-
149
- # 修改行业信息
150
- def fix_company_industry(symbol):
151
- if symbol is not None:
152
- query = {"symbol": symbol}
153
- company_info = mongodb_util.find_query_data('company_info_base', query)
154
- else:
155
- company_info = mongodb_util.find_all_data('company_info_base')
156
-
157
- company_info = company_info.set_index(['second_sw_industry'], drop=False)
158
- del company_info['industry']
159
- # fix industry name
160
- industry_final_fix_df = company_constant_data_api.get_industry_final_fix_df()
161
- industry_final_fix_df = industry_final_fix_df.set_index(['second_sw_industry'], drop=True)
162
- company_info = pd.merge(company_info, industry_final_fix_df, how='outer',
163
- left_index=True, right_index=True)
164
- # 将申万第三行业做为行业
165
- company_info = company_constant_data_api.fix_industry_use_sw_third(company_info.copy())
166
- company_info['industry'] = company_info['industry'].fillna('综合')
167
- company_info = filed_sort(company_info)
168
- company_info['company_type'] = company_info['business_nature']
169
-
170
- # 将list_date列中的所有NaN值设置为99990909
171
- company_info['list_date'].fillna(20990909.0, inplace=True)
172
-
173
- # 将日期数值转换为日期时间格式
174
- company_info['list_date_01'] = pd.to_datetime(company_info['list_date'], format='%Y%m%d')
175
-
176
- company_info['list_date'] = company_info['list_date'].apply(
177
- lambda x: pd.to_numeric(x, errors="coerce"))
178
-
179
- now_date = datetime.now()
180
-
181
- # 计算日期差值 距离现在上市时间
182
- company_info['diff_days'] = company_info.apply(
183
- lambda row: (now_date - row['list_date_01']).days, axis=1)
184
-
185
- str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
186
- company_info['sync_date'] = str_now_date
187
-
188
- try:
189
- # 次新股
190
- sub_stock = ths_stock_api.ths_stock_concept('885598')
191
- sub_stock_symbol_list = list(sub_stock['symbol'])
192
- except BaseException as e:
193
- logger.error("出现异常:{},{}", symbol, e)
194
- query = {'concept_code': 885598}
195
- ths_stock_concept_detail = mongodb_util.find_query_data('ths_stock_concept_detail', query)
196
- sub_stock_symbol_list = list(ths_stock_concept_detail['symbol'])
197
- company_info.loc[:, 'sub_stock'] = False
198
- company_info.loc[company_info['symbol'].isin(sub_stock_symbol_list), 'sub_stock'] = True
199
-
200
- try:
201
- company_info.dropna(subset=['symbol'], axis=0, inplace=True)
202
- company_info.dropna(subset=['_id'], axis=0, inplace=True)
203
- mongodb_util.save_mongo(company_info, db_name_constant.COMPANY_INFO)
204
- # 保存历史数据
205
- save_company_info_his(company_info)
206
- except BaseException as e:
207
- logger.error("出现异常:{},{}", symbol, e)
208
-
209
- return company_info
210
-
211
-
212
- def save_company_info_his(company_info_df):
213
- now_date = datetime.now()
214
- str_day = now_date.strftime('%Y-%m-%d')
215
- company_info_df['symbol'] = company_info_df['_id']
216
- company_info_df['str_day'] = str_day
217
- company_info_df['_id'] = company_info_df['_id'] + "_" + str_day
218
- remove_query = {'str_day': str_day}
219
- tag = mongodb_util.remove_data(remove_query, db_name_constant.COMPANY_INFO_HIS)
220
- success = tag.acknowledged
221
- if success:
222
- mongodb_util.insert_mongo(company_info_df, db_name_constant.COMPANY_INFO_HIS)
223
-
37
+ # 同步公司基本信息
224
38
 
225
39
  def sync_company_base_info(symbol_list):
226
40
  global result
227
41
  result = []
228
42
  create_index()
229
43
  east_money_stock_info = get_east_money_stock_info()
44
+ east_money_stock_info = east_money_stock_info.sort_values(by=['list_date'], ascending=False)
45
+
230
46
  de_listed_stock_list = company_common_service_api.get_de_list_company()
231
47
  east_money_stock_info = east_money_stock_info.loc[~(
232
48
  east_money_stock_info['symbol'].isin(de_listed_stock_list))]
@@ -240,7 +56,7 @@ def sync_company_base_info(symbol_list):
240
56
  # 将日期数值转换为日期时间格式
241
57
  east_money_stock_info['list_date_01'] = pd.to_datetime(east_money_stock_info['list_date'], format='%Y%m%d')
242
58
 
243
- # 开票啦实时数据
59
+ # 开盘啦实时数据
244
60
  kpl_real_time_quotes = kpl_real_time_quotes_api.get_kpl_real_time_quotes()
245
61
 
246
62
  if symbol_list is not None:
@@ -249,12 +65,16 @@ def sync_company_base_info(symbol_list):
249
65
  page_number = round(count / MAX_PAGE_NUMBER, 0) + 1
250
66
  page_number = int(page_number)
251
67
  threads = []
68
+
69
+ exist_company_df = mongodb_util.find_all_data(db_name_constant.COMPANY_INFO)
70
+
252
71
  # 创建多个线程来获取数据
253
72
  for page in range(page_number): # 0到100页
254
73
  end_count = (page + 1) * MAX_PAGE_NUMBER
255
74
  begin_count = page * MAX_PAGE_NUMBER
256
- page_df = east_money_stock_info.loc[begin_count:end_count]
257
- thread = threading.Thread(target=single_thread_sync_company_info, args=(page_df, kpl_real_time_quotes))
75
+ page_df = east_money_stock_info.iloc[begin_count:end_count]
76
+ thread = threading.Thread(target=single_thread_sync_company_info,
77
+ args=(page_df, kpl_real_time_quotes, exist_company_df))
258
78
  threads.append(thread)
259
79
  thread.start()
260
80
 
@@ -263,23 +83,55 @@ def sync_company_base_info(symbol_list):
263
83
  thread.join()
264
84
 
265
85
  fail_df = east_money_stock_info.loc[east_money_stock_info['symbol'].isin(result)]
266
- single_thread_sync_company_info(fail_df, kpl_real_time_quotes)
86
+ single_thread_sync_company_info(fail_df, kpl_real_time_quotes, exist_company_df)
87
+
88
+
89
+ def get_east_money_stock_info():
90
+ all_real_time_quotes = em_stock_info_api.get_a_stock_info()
91
+ all_real_time_quotes = all_real_time_quotes[['symbol',
92
+ 'name',
93
+ "now_price",
94
+ 'total_mv',
95
+ 'flow_mv',
96
+ 'pe_ttm',
97
+ 'sz_sh',
98
+ 'area',
99
+ 'pb',
100
+ 'list_date',
101
+ 'ROE',
102
+ 'total_share',
103
+ 'flow_share',
104
+ 'industry',
105
+ 'amount',
106
+ "hk_stock_code",
107
+ "hk_stock_name",
108
+ 'concept']]
109
+
110
+ return all_real_time_quotes
267
111
 
268
112
 
269
113
  def single_thread_sync_company_info(east_money_stock_info,
270
- kpl_real_time_quotes):
114
+ kpl_real_time_quotes, exist_company_df):
271
115
  global result
272
116
  fail_list = []
273
117
  for company_one in east_money_stock_info.itertuples():
274
118
  try:
275
- company_info_type = ths_stock_api.get_company_info_detail(company_one.symbol)
119
+ # 同步公司控股子公司信息 异步执行
120
+ sync_company_hold_info_api.sync_company_hold_info(company_one.symbol)
121
+
122
+ company_info_type = ths_company_info_web.get_company_info_detail(company_one.symbol)
123
+ company_info_type = set_kzz_debt(company_info_type, company_one.symbol)
276
124
  company_info_type['first_industry_code'] = company_info_type['hycode'].apply(
277
125
  lambda x: x[1:3] + '0000')
278
126
  company_info_type['second_industry_code'] = company_info_type['hy2code'].apply(
279
127
  lambda x: x[1:5] + '00')
280
128
  company_info_type['third_industry_code'] = company_info_type['hy3code'].apply(
281
129
  lambda x: x[1:7])
282
-
130
+ # company_info_type['main_business_list'] = company_info_type['main_business_list']
131
+ # company_info_type['most_profitable_business'] = company_info_type['most_profitable_business']
132
+ # company_info_type['most_profitable_business_rate'] = company_info_type['most_profitable_business_rate']
133
+ # company_info_type['most_profitable_business_profit'] = company_info_type['most_profitable_business_profit']
134
+ #
283
135
  company_info_type['first_sw_industry'] = company_info_type['hy']
284
136
  company_info_type['second_sw_industry'] = company_info_type['hy2']
285
137
  company_info_type['third_sw_industry'] = company_info_type['hy3']
@@ -293,6 +145,9 @@ def single_thread_sync_company_info(east_money_stock_info,
293
145
  company_info_type['em_industry'] = company_one.industry
294
146
  company_info_type['em_concept'] = company_one.concept
295
147
 
148
+ company_info_type['hk_stock_code'] = company_one.hk_stock_code
149
+ company_info_type['hk_stock_name'] = company_one.hk_stock_name
150
+
296
151
  company_info_type['now_price'] = company_one.now_price
297
152
  company_info_type['total_share'] = company_one.total_share
298
153
  company_info_type['flow_share'] = company_one.flow_share
@@ -311,16 +166,27 @@ def single_thread_sync_company_info(east_money_stock_info,
311
166
  company_info_type['total_mv_sp'] = company_one.total_mv_sp
312
167
  company_info_type['flow_mv_level'] = company_one.flow_mv_level
313
168
  company_info_type['classification'] = company_one.classification
314
- company_info_type['mv_circulation_ratio'] = calculate_circu_ratio(company_one.symbol)
315
- # 获取同花顺最新概念
316
- company_info_type = ths_concept_common_service_api.set_ths_concept(company_one.symbol, company_info_type)
169
+
317
170
  now_date = datetime.now()
318
171
  str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
172
+
173
+ now_str_day = now_date.strftime('%Y-%m-%d')
319
174
  company_info_type['sync_date'] = str_now_date
320
- fix_symbol_industry_df = company_constant_data_api.get_fix_symbol_industry()
175
+
176
+ result_dict = calculate_circulation_ratio(company_one.symbol, now_str_day)
177
+
178
+ company_info_type['mv_circulation_ratio'] = result_dict['mv_circulation_ratio']
179
+ company_info_type['qfii_type'] = result_dict['qfii_type']
180
+ company_info_type['qfii_number'] = result_dict['qfii_number']
181
+ company_info_type['share_holder_sync_day'] = result_dict['share_holder_sync_day']
182
+
183
+ # 获取同花顺最新概念
184
+ company_info_type = ths_concept_common_service_api.set_ths_concept(company_one.symbol, company_info_type)
185
+
186
+ fix_symbol_industry_df = company_constant_data.get_fix_symbol_industry()
321
187
  if company_one.symbol in list(fix_symbol_industry_df['symbol']):
322
188
  # fix sw_industry
323
- company_info_type = company_constant_data_api.fix_symbol_industry(company_info_type, company_one.symbol)
189
+ company_info_type = company_constant_data.fix_symbol_industry(company_info_type, company_one.symbol)
324
190
 
325
191
  # todo fix industry
326
192
  company_info_type['industry'] = company_info_type['second_sw_industry']
@@ -333,8 +199,9 @@ def single_thread_sync_company_info(east_money_stock_info,
333
199
  str_day = now_date.strftime('%Y-%m-%d')
334
200
  deal_days = k_line_common_service_api.get_deal_days(str_day, company_one.symbol)
335
201
  company_info_type['deal_days'] = deal_days
202
+
336
203
  # 设置年报信息
337
- company_info_type = get_recent_year_income(company_one.symbol, company_info_type)
204
+ company_info_type = get_recent_year_income(company_one.symbol, company_info_type, exist_company_df)
338
205
 
339
206
  try:
340
207
  if data_frame_util.is_not_empty(kpl_real_time_quotes):
@@ -355,7 +222,7 @@ def single_thread_sync_company_info(east_money_stock_info,
355
222
  except BaseException as e:
356
223
  logger.warning("设置开盘啦数据异常:{},{}", company_one.symbol, e)
357
224
 
358
- company_info_type = filed_sort(company_info_type)
225
+ company_info_type = company_constant_data.filed_sort(company_info_type)
359
226
  mongodb_util.save_mongo(company_info_type.copy(), 'company_info_base')
360
227
  logger.info("同步公司信息完成:{}", company_one.symbol + '-' + company_one.name)
361
228
  except BaseException as e:
@@ -366,6 +233,113 @@ def single_thread_sync_company_info(east_money_stock_info,
366
233
  result = fail_list
367
234
 
368
235
 
236
+ # 计算实际流通比例
237
+ def calculate_circulation_ratio(symbol, now_str_day):
238
+ query = {"symbol": symbol}
239
+ stock_gdfx_free_top_1 = mongodb_util.descend_query(query, 'stock_gdfx_free_top_10', "period", 1)
240
+ if stock_gdfx_free_top_1.shape[0] == 0:
241
+ mv_circulation_ratio = 1
242
+ qfii_number = 0
243
+ qfii_type = 'A股'
244
+ share_holder_sync_day = now_str_day
245
+ else:
246
+ period_time = list(stock_gdfx_free_top_1['period'])[0]
247
+
248
+ query_free = {'symbol': symbol, 'period': period_time}
249
+ stock_gdfx_free_top_10 = mongodb_util.find_query_data('stock_gdfx_free_top_10', query_free)
250
+
251
+ stock_gdfx_free_top_10['shares_number_str'] = stock_gdfx_free_top_10['shares_number'].astype(str)
252
+
253
+ stock_gdfx_free_top_10['id_key'] = stock_gdfx_free_top_10['symbol'] + '_' + stock_gdfx_free_top_10[
254
+ 'period'] + '_' + stock_gdfx_free_top_10.shares_number_str
255
+
256
+ stock_gdfx_free_top_10.drop_duplicates('id_key', keep='last', inplace=True)
257
+
258
+ # 排除香港结算公司 大于5%减持不用发公告 香港中央结算 HKSCC
259
+ stock_gdfx_free_top_10['is_hk'] = stock_gdfx_free_top_10['shareholder_name'].apply(
260
+ lambda shareholder_name: "HK" if shareholder_name.startswith('香港中央结算') or shareholder_name.startswith(
261
+ 'HKSCC') else "A")
262
+
263
+ # 持股大于5% 减持需要发公告
264
+ # 排除香港结算公司不发公共 小于5%减持不用发公告
265
+ # 香港中央结算 HKSCC
266
+ stock_free_top_greater_than_5 = stock_gdfx_free_top_10.loc[
267
+ (stock_gdfx_free_top_10['circulation_ratio'] >= 5) & (stock_gdfx_free_top_10['is_hk'] == 'A')]
268
+
269
+ stock_free_qfii = stock_gdfx_free_top_10.loc[stock_gdfx_free_top_10['shareholder_nature'] == 'QFII']
270
+
271
+ share_holder_sync_day = list(stock_gdfx_free_top_10['create_day'])[0]
272
+
273
+ # qfii 数量
274
+ qfii_number = stock_free_qfii.shape[0]
275
+ # qfii 类型
276
+ qfii_type = set_qfii_type(qfii_number, stock_free_qfii.copy())
277
+
278
+ circulation_ratio = sum(stock_free_top_greater_than_5['circulation_ratio'])
279
+ mv_circulation_ratio = round((100 - circulation_ratio) / 100, 2)
280
+ # 防止错误数据
281
+ if mv_circulation_ratio < 0:
282
+ mv_circulation_ratio = 1
283
+
284
+ result_dict = {
285
+ 'mv_circulation_ratio': mv_circulation_ratio,
286
+ 'qfii_type': qfii_type,
287
+ 'qfii_number': qfii_number,
288
+ 'share_holder_sync_day': share_holder_sync_day
289
+
290
+ }
291
+ return result_dict
292
+
293
+
294
+ def set_qfii_type(qfii_number, stock_free_qfii):
295
+ if qfii_number > 0:
296
+ stock_free_qfii['new_change'] = stock_free_qfii['change']
297
+ stock_free_qfii.loc[stock_free_qfii['change_ratio'] == 0, 'new_change'] = 0
298
+ stock_free_qfii.loc[stock_free_qfii['change'] == '新进', 'new_change'] = \
299
+ stock_free_qfii['shares_number']
300
+ stock_free_qfii['new_change'] = stock_free_qfii['new_change'].astype(float)
301
+
302
+ stock_free_qfii_new_in = stock_free_qfii.loc[stock_free_qfii['change'] == '新进']
303
+ if data_frame_util.is_not_empty(stock_free_qfii_new_in):
304
+ qfii_type = 1
305
+ return qfii_type
306
+
307
+ stock_free_qfii_add = stock_free_qfii.loc[
308
+ (~stock_free_qfii['change'].isin(['不变', '新进'])) & (stock_free_qfii['new_change'] > 0)]
309
+
310
+ if data_frame_util.is_not_empty(stock_free_qfii_add):
311
+ qfii_type = 2
312
+ return qfii_type
313
+
314
+ stock_free_qfii_not_change = stock_free_qfii.loc[stock_free_qfii['change'] == '不变']
315
+
316
+ if data_frame_util.is_not_empty(stock_free_qfii_not_change):
317
+ qfii_type = 3
318
+ return qfii_type
319
+
320
+ stock_free_qfii_reduce = stock_free_qfii.loc[
321
+ (~stock_free_qfii['change'].isin(['不变', '新进'])) & (stock_free_qfii['new_change'] < 0)]
322
+
323
+ if data_frame_util.is_not_empty(stock_free_qfii_reduce):
324
+ qfii_type = 4
325
+ return qfii_type
326
+ else:
327
+ return 0
328
+
329
+
330
+ def create_index():
331
+ mongodb_util.create_index('company_info',
332
+ [("classification", 1)])
333
+ mongodb_util.create_index('company_info',
334
+ [("industry", 1)])
335
+ mongodb_util.create_index('company_info',
336
+ [("flow_mv", 1)])
337
+ mongodb_util.create_index('company_info',
338
+ [("list_date", 1)])
339
+ mongodb_util.create_index('company_info',
340
+ [("symbol", 1)])
341
+
342
+
369
343
  def set_kpl_data(kpl_real_time_quotes_one, company_info_type, company_one):
370
344
  if data_frame_util.is_not_empty(kpl_real_time_quotes_one):
371
345
  company_info_type['kpl_plate_name'] = list(kpl_real_time_quotes_one['plate_name_list'])[0]
@@ -394,22 +368,38 @@ def set_kpl_data(kpl_real_time_quotes_one, company_info_type, company_one):
394
368
  return company_info_type
395
369
 
396
370
 
397
- # 更新新上市公司信息
398
- def new_company_info_update():
399
- east_money_stock_info = get_east_money_stock_info()
400
- new_stock = common_service_fun_api.get_new_stock(east_money_stock_info)
401
- for company_one in new_stock.itertuples():
402
- try:
403
- sync_company_base_info([company_one.symbol])
404
- fix_company_industry(company_one.symbol)
371
+ # 获取可转债信息
372
+ @lru_cache(maxsize=None)
373
+ def get_kzz_debt_info():
374
+ query = {}
375
+ kzz_debt_info_df = mongodb_util.find_query_data(db_name_constant.KZZ_DEBT_INFO, query)
376
+ kzz_debt_info_df = kzz_debt_info_df[[
377
+ 'symbol',
378
+ 'name',
379
+ 'stock_code',
380
+ 'apply_date',
381
+ 'list_date',
382
+ 'due_date'
383
+ ]]
384
+ return kzz_debt_info_df
405
385
 
406
- except BaseException as e:
407
- logger.error("出现异常:{}", e)
408
- company_common_service_api.company_info_industry_cache_clear
386
+
387
+ def set_kzz_debt(df, symbol):
388
+ kzz_debt_info_df_all = get_kzz_debt_info()
389
+ kzz_debt_info_df = kzz_debt_info_df_all.loc[kzz_debt_info_df_all['stock_code'] == symbol]
390
+ df.loc[:, 'kzz_debt_list'] = ''
391
+ if data_frame_util.is_not_empty(kzz_debt_info_df):
392
+ kzz_debt_info_df_list = kzz_debt_info_df.to_dict(orient='records')
393
+ df.at[0, 'kzz_debt_list'] = kzz_debt_info_df_list
394
+ return df
409
395
 
410
396
 
411
397
  # 保存申万行业分类
412
398
  def save_sw_data(company_info_type):
399
+ now_date = datetime.now()
400
+ hour = now_date.hour
401
+ if hour <= 15:
402
+ return company_info_type
413
403
  first_sw_info = company_info_type[[
414
404
  'first_sw_industry',
415
405
  'first_industry_code'
@@ -485,15 +475,38 @@ def save_sw_data(company_info_type):
485
475
 
486
476
 
487
477
  # 获取最近年报收入
488
- def get_recent_year_income(symbol, company_info_type):
478
+ def get_recent_year_income(symbol, company_info_type, exist_company_df):
479
+ now_date = datetime.now()
480
+ hour = now_date.hour
481
+ # if hour <= 15:
482
+ # exist_company_one_df = exist_company_df.loc[exist_company_df['_id'] == symbol]
483
+ # if data_frame_util.is_not_empty(exist_company_one_df):
484
+ # company_info_type['operate_profit'] = list(exist_company_one_df['operate_profit'])[0]
485
+ # company_info_type['total_operate_income'] = list(exist_company_one_df['total_operate_income'])[0]
486
+ # if 'operate_date_name' in exist_company_one_df:
487
+ # company_info_type['operate_date_name'] = list(exist_company_one_df['total_operate_income'])[0]
488
+ # else:
489
+ # company_info_type['operate_date_name'] = '暂无年报'
490
+ # else:
491
+ # company_info_type['operate_profit'] = 0
492
+ # company_info_type['total_operate_income'] = 0
493
+ # company_info_type['operate_date_name'] = '暂无年报'
494
+ # return company_info_type
489
495
  query = {'symbol': symbol, "REPORT_TYPE": "年报"}
490
496
  em_stock_profit = mongodb_util.descend_query(query, db_name_constant.EM_STOCK_PROFIT, 'REPORT_DATE', 1)
491
497
  if data_frame_util.is_not_empty(em_stock_profit):
492
498
  company_info_type['operate_profit'] = list(em_stock_profit['OPERATE_PROFIT'])[0]
493
- company_info_type['total_operate_income'] = list(em_stock_profit['TOTAL_OPERATE_INCOME'])[0]
499
+ company_info_type['operate_date_name'] = list(em_stock_profit['REPORT_DATE_NAME'])[0]
500
+ total_operate_income = list(em_stock_profit['TOTAL_OPERATE_INCOME'])[0]
501
+ # 金融机构大多收入计入在这个字段中
502
+ if total_operate_income == 0:
503
+ total_operate_income = list(em_stock_profit['OPERATE_INCOME'])[0]
504
+
505
+ company_info_type['total_operate_income'] = total_operate_income
494
506
  else:
495
507
  company_info_type['operate_profit'] = 0
496
508
  company_info_type['total_operate_income'] = 0
509
+ company_info_type['operate_date_name'] = '暂无年报'
497
510
  company_info_type['operate_profit'] = round(
498
511
  company_info_type['operate_profit'] / common_service_fun_api.HUNDRED_MILLION, 2)
499
512
  company_info_type['total_operate_income'] = round(
@@ -501,12 +514,9 @@ def get_recent_year_income(symbol, company_info_type):
501
514
  return company_info_type
502
515
 
503
516
 
517
+ import mns_scheduler.company_info.constant.company_constant_data as company_constant_data
518
+
504
519
  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
520
  # sync_company_base_info()
511
521
  # fix_company_industry()
512
522
  # calculate_circu_ratio("601069")
@@ -514,6 +524,8 @@ if __name__ == '__main__':
514
524
  # 300293
515
525
  # sync_company_base_info(None)
516
526
  # new_company_info_update()
517
- sync_company_base_info(['920002'])
518
- fix_company_industry(None)
519
- # group_by_industry()
527
+ # query = {"total_operate_income": 0}
528
+ # un_report_company_info = mongodb_util.find_query_data(db_name_constant.COMPANY_INFO, query)
529
+ # symbol_list = list(un_report_company_info['symbol'])
530
+ sync_company_base_info(['920009'])
531
+ sync_company_base_info(None)
@@ -0,0 +1,37 @@
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.company.ths_company_info_api as ths_company_info_api
9
+ import mns_common.component.cookie.cookie_info_service as cookie_info_service
10
+ import mns_common.utils.data_frame_util as data_frame_util
11
+ from mns_common.db.MongodbUtil import MongodbUtil
12
+ import mns_common.constant.db_name_constant as db_name_constant
13
+ from datetime import datetime
14
+ from mns_common.utils.async_fun import async_fun
15
+ from loguru import logger
16
+
17
+ mongodb_util = MongodbUtil('27017')
18
+
19
+
20
+ # 同步公司控股子公司信息
21
+ @async_fun
22
+ def sync_company_hold_info(symbol):
23
+ try:
24
+ ths_cookie = cookie_info_service.get_ths_cookie()
25
+ company_hold_info_df = ths_company_info_api.get_company_hold_info(symbol, ths_cookie)
26
+
27
+ now_date = datetime.now()
28
+ sync_str_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
29
+ if data_frame_util.is_not_empty(company_hold_info_df):
30
+ company_hold_info_df['sync_str_date'] = sync_str_date
31
+ mongodb_util.insert_mongo(company_hold_info_df, db_name_constant.COMPANY_HOLDING_INFO)
32
+ except BaseException as e:
33
+ logger.error("同步公司控股子公司信息:{},{}", symbol, e)
34
+
35
+
36
+ if __name__ == '__main__':
37
+ sync_company_hold_info('300085')