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.
- mns_scheduler/__init__.py +1 -3
- mns_scheduler/company_info/announce/company_announce_sync_service.py +65 -0
- mns_scheduler/company_info/{company_info_sync_api.py → base/sync_company_base_info_api.py} +239 -227
- mns_scheduler/company_info/base/sync_company_hold_info_api.py +37 -0
- mns_scheduler/company_info/base/sync_company_product_area_industry.py +161 -0
- mns_scheduler/company_info/clean/company_info_clean_api.py +133 -0
- mns_scheduler/company_info/constant/company_constant_data.py +497 -0
- mns_scheduler/company_info/{de_list_stock_service.py → de_list_stock/de_list_stock_service.py} +1 -1
- mns_scheduler/company_info/em_stock_info/__init__.py +7 -0
- mns_scheduler/company_info/em_stock_info/sync_em_stock_info_sync.py +80 -0
- mns_scheduler/company_info/remark/__init__.py +7 -0
- mns_scheduler/company_info/remark/company_remark_info_sync.py +46 -0
- mns_scheduler/concept/clean/kpl_concept_clean_api.py +1 -1
- mns_scheduler/concept/clean/ths_concept_clean_api.py +74 -51
- mns_scheduler/concept/ths/common/ths_concept_sync_common_api.py +112 -56
- mns_scheduler/concept/ths/common/ths_concept_update_common_api.py +6 -6
- mns_scheduler/concept/ths/detaill/__init__.py +0 -0
- mns_scheduler/concept/ths/detaill/ths_concept_detail_api.py +226 -0
- mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_new_index_api.py +169 -0
- mns_scheduler/concept/ths/update_concept_info/sync_one_concept_all_symbols_api.py +11 -23
- mns_scheduler/concept/ths/update_concept_info/sync_one_symbol_all_concepts_api.py +19 -15
- mns_scheduler/db/col_move_service.py +10 -7
- mns_scheduler/db/db_status.py +1 -1
- mns_scheduler/db/script/__init__.py +7 -0
- mns_scheduler/db/script/col_move_script.py +45 -0
- mns_scheduler/db/script/db_move/__init__.py +7 -0
- mns_scheduler/db/script/db_move/col_move_one_service.py +34 -0
- mns_scheduler/db/script/sync/__init__.py +7 -0
- mns_scheduler/db/script/sync/local_mongo_util.py +231 -0
- mns_scheduler/db/script/sync/remote_data_sync_to_local.py +105 -0
- mns_scheduler/db/script/sync/remote_mongo_util.py +306 -0
- mns_scheduler/db/script/sync/sync_hui_ce_test_data.py +80 -0
- mns_scheduler/db/script/sync/sync_hui_ce_test_data_01.py +69 -0
- mns_scheduler/db/script/update/__init__.py +7 -0
- mns_scheduler/db/script/update/update_col_field.py +36 -0
- mns_scheduler/finance/__init__.py +1 -1
- mns_scheduler/finance/{em_financial_asset_liability_sync_service_api.py → em/em_financial_asset_liability_sync_service_api.py} +3 -3
- mns_scheduler/finance/{em_financial_profit_sync_service_api.py → em/em_financial_profit_sync_service_api.py} +30 -25
- mns_scheduler/finance/{finance_common_api.py → em/finance_common_api.py} +4 -4
- mns_scheduler/finance/sync_financial_report_service_task.py +202 -0
- mns_scheduler/finance/xue_qiu/down_load_xueqiu_report_api.py +77 -0
- mns_scheduler/finance/xue_qiu/sync_xue_qiu_fiance_data.py +161 -0
- mns_scheduler/hk/__init__.py +1 -1
- mns_scheduler/hk/hk_company_info_sync_service_api.py +49 -5
- mns_scheduler/hk/hk_industry_info_sync_service_api.py +68 -0
- mns_scheduler/industry/__init__.py +7 -0
- mns_scheduler/industry/ths/__init__.py +7 -0
- mns_scheduler/industry/ths/ths_industry_index_service.py +58 -0
- mns_scheduler/industry/ths/ths_industry_sync_service.py +68 -0
- mns_scheduler/irm/__init__.py +1 -1
- mns_scheduler/irm/api/__init__.py +1 -1
- mns_scheduler/irm/api/sh_stock_sns_sse_info_api.py +1 -1
- mns_scheduler/irm/api/sz_stock_sns_sse_info_api.py +1 -1
- mns_scheduler/irm/stock_irm_cninfo_service.py +15 -13
- mns_scheduler/k_line/clean/daily/__init__.py +1 -1
- mns_scheduler/k_line/clean/daily/daily_k_line_clean_common_service.py +57 -7
- mns_scheduler/k_line/clean/daily/daily_k_line_service.py +16 -3
- mns_scheduler/k_line/clean/k_line_info_clean_impl.py +3 -2
- mns_scheduler/k_line/clean/k_line_info_clean_task.py +42 -31
- mns_scheduler/k_line/clean/week_month/__init__.py +1 -1
- mns_scheduler/k_line/clean/week_month/normal_week_month_k_line_service.py +125 -27
- mns_scheduler/k_line/clean/week_month/sub_new_week_month_k_line_service.py +72 -17
- mns_scheduler/k_line/common/__init__.py +7 -0
- mns_scheduler/k_line/common/k_line_common_api.py +188 -0
- mns_scheduler/k_line/hot_stocks/__init__.py +1 -1
- mns_scheduler/k_line/hot_stocks/recent_hot_stocks_clean_service.py +1 -1
- mns_scheduler/k_line/month_week_daily/bfq_k_line_sync.py +77 -0
- mns_scheduler/k_line/{sync → month_week_daily}/daily_week_month_line_sync.py +14 -14
- mns_scheduler/k_line/sync_status/__init__.py +7 -0
- mns_scheduler/k_line/sync_status/k_line_sync_status_check.py +54 -0
- mns_scheduler/k_line/test/__init__.py +7 -0
- mns_scheduler/k_line/test/k_line_info_clean_his_data.py +41 -0
- mns_scheduler/k_line/year_quarter/__init__.py +7 -0
- mns_scheduler/k_line/year_quarter/year_quarter_line_sync.py +76 -0
- mns_scheduler/kpl/selection/symbol/sync_best_choose_symbol.py +4 -2
- mns_scheduler/kpl/selection/symbol/sync_kpl_concept_symbol_choose_reason_api.py +108 -0
- mns_scheduler/kpl/selection/total/sync_kpl_best_total_sync_api.py +12 -7
- mns_scheduler/lhb/__init__.py +1 -1
- mns_scheduler/lhb/stock_lhb_sync_service.py +1 -1
- mns_scheduler/open/__init__.py +1 -1
- mns_scheduler/open/sync_one_day_open_data_to_db_service.py +6 -22
- mns_scheduler/risk/__init__.py +1 -1
- mns_scheduler/risk/compliance/__init__.py +0 -0
- mns_scheduler/risk/compliance/undisclosed_annual_report_api.py +71 -0
- mns_scheduler/risk/financial/__init__.py +0 -0
- mns_scheduler/risk/financial/annual_report_audit_check_api.py +54 -0
- mns_scheduler/risk/financial/net_assets_check_api.py +75 -0
- mns_scheduler/risk/financial/profit_income_check_api.py +80 -0
- mns_scheduler/risk/financial/stock_equity_mortgage_check_api.py +1 -0
- mns_scheduler/risk/financial_report_risk_check_api.py +42 -0
- mns_scheduler/risk/major_violations/__init__.py +0 -0
- mns_scheduler/risk/{register_and_investigate_stock_sync_api.py → major_violations/register_and_investigate_stock_sync_api.py} +17 -8
- mns_scheduler/risk/self/__init__.py +0 -0
- mns_scheduler/risk/{wei_pan_stock_api.py → self/wei_pan_stock_api.py} +10 -4
- mns_scheduler/risk/test/__init__.py +7 -0
- mns_scheduler/{finance → risk}/test/fix_blask_list.py +6 -10
- mns_scheduler/risk/transactions/__init__.py +0 -0
- mns_scheduler/risk/transactions/transactions_check_api.py +183 -0
- mns_scheduler/self_choose/__init__.py +7 -0
- mns_scheduler/self_choose/ths_self_choose_service.py +158 -0
- mns_scheduler/trade/auto_ipo_buy_api.py +2 -2
- mns_scheduler/trade/auto_login/__init__.py +7 -0
- mns_scheduler/trade/auto_login/trader_auto_service.py +32 -0
- mns_scheduler/trade/auto_sell_service_api.py +10 -8
- mns_scheduler/trade/balance/__init__.py +7 -0
- mns_scheduler/trade/balance/ths_account_balance_service.py +7 -0
- mns_scheduler/trade/sync_position_api.py +41 -8
- mns_scheduler/trade/task/__init__.py +7 -0
- mns_scheduler/trade/task/trader_task_service.py +65 -0
- mns_scheduler/trade/tfp/__init__.py +7 -0
- mns_scheduler/trade/tfp/stock_tfp_info_sync.py +56 -0
- mns_scheduler/zb/stock_zb_pool_sync.py +1 -15
- mns_scheduler/zt/high_chg/sync_high_chg_pool_service.py +2 -3
- mns_scheduler/zt/high_chg/sync_high_chg_real_time_quotes_service.py +12 -8
- mns_scheduler/zt/open_data/kcx_high_chg_open_data_sync.py +10 -25
- mns_scheduler/zt/script/__init__.py +1 -1
- mns_scheduler/zt/script/fix_error_deal_day.py +41 -0
- mns_scheduler/zt/script/kcx_high_chg_open_his_data_handle.py +2 -11
- mns_scheduler/zt/script/sync_high_chg_pool_his_data.py +2 -2
- mns_scheduler/zt/script/sync_now_higt_chg_zt.py +43 -0
- mns_scheduler/zt/zt_pool/em_zt_pool_sync_api.py +413 -0
- mns_scheduler/zt/zt_pool/ths_zt_pool_sync_api.py +193 -0
- mns_scheduler/zt/zt_pool/update_null_zt_reason_api.py +58 -0
- mns_scheduler/zz_task/compensation/__init__.py +0 -0
- mns_scheduler/zz_task/compensation/compensate_task.py +161 -0
- mns_scheduler/zz_task/compensation/compensate_task_one_day.py +142 -0
- mns_scheduler/zz_task/data_sync_task.py +271 -121
- {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.4.3.2.dist-info}/METADATA +1 -1
- mns_scheduler-1.4.3.2.dist-info/RECORD +169 -0
- {mns_scheduler-1.0.8.7.dist-info → mns_scheduler-1.4.3.2.dist-info}/WHEEL +1 -1
- mns_scheduler/backup/app/ths_new_concept_sync_app.py +0 -122
- mns_scheduler/backup/em/em_new_concept_his_sync.py +0 -99
- mns_scheduler/backup/em/em_new_concept_sync_common_api.py +0 -139
- mns_scheduler/backup/em/em_new_concept_sync_web.py +0 -55
- mns_scheduler/backup/wen_cai/wen_cai_concept_sync.py +0 -51
- mns_scheduler/big_deal/ths_big_deal_sync.py +0 -98
- mns_scheduler/company_info/company_constant_data.py +0 -322
- mns_scheduler/concept/ths/sync_new_index/sync_ths_concept_by_ak_api.py +0 -103
- mns_scheduler/concept/ths/sync_new_index/sync_ths_new_concept_by_web_api.py +0 -89
- mns_scheduler/finance/financial_high_risk_stock_clean_service_api.py +0 -202
- mns_scheduler/finance/sync_financial_report_service_api.py +0 -113
- mns_scheduler/real_time/realtime_quotes_now_create_db_index.py +0 -27
- mns_scheduler/real_time/realtime_quotes_now_sync.py +0 -232
- mns_scheduler/risk/stock_equity_mortgage_sync_api.py +0 -32
- mns_scheduler/zt/zt_pool/zt_pool_sync_api.py +0 -151
- mns_scheduler/zz_task/sync_realtime_quotes_task.py +0 -28
- mns_scheduler-1.0.8.7.dist-info/RECORD +0 -112
- /mns_scheduler/{backup/app → company_info/announce}/__init__.py +0 -0
- /mns_scheduler/{backup/em → company_info/base}/__init__.py +0 -0
- /mns_scheduler/{backup/wen_cai → company_info/clean}/__init__.py +0 -0
- /mns_scheduler/{big_deal → company_info/constant}/__init__.py +0 -0
- /mns_scheduler/{real_time → company_info/de_list_stock}/__init__.py +0 -0
- /mns_scheduler/{backup → finance/em}/__init__.py +0 -0
- /mns_scheduler/finance/{test → xue_qiu}/__init__.py +0 -0
- /mns_scheduler/k_line/{sync → month_week_daily}/__init__.py +0 -0
- {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.
|
|
13
|
-
import mns_common.
|
|
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 =
|
|
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.
|
|
257
|
-
thread = threading.Thread(target=single_thread_sync_company_info,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
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
|
-
|
|
407
|
-
|
|
408
|
-
|
|
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['
|
|
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
|
-
|
|
518
|
-
|
|
519
|
-
#
|
|
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')
|