mns-common 1.5.2.1__py3-none-any.whl → 1.5.2.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of mns-common might be problematic. Click here for more details.
- mns_common/api/akshare/__init__.py +7 -0
- mns_common/api/akshare/k_line_api.py +123 -0
- mns_common/api/akshare/stock_bid_ask_api.py +94 -0
- mns_common/api/akshare/stock_dt_pool.py +47 -0
- mns_common/api/akshare/stock_zb_pool.py +48 -0
- mns_common/api/akshare/stock_zt_pool_api.py +47 -0
- mns_common/api/akshare/yjyg_sync_api.py +98 -0
- {mns_common-1.5.2.1.dist-info → mns_common-1.5.2.2.dist-info}/METADATA +1 -1
- {mns_common-1.5.2.1.dist-info → mns_common-1.5.2.2.dist-info}/RECORD +11 -4
- {mns_common-1.5.2.1.dist-info → mns_common-1.5.2.2.dist-info}/WHEEL +0 -0
- {mns_common-1.5.2.1.dist-info → mns_common-1.5.2.2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
file_path = os.path.abspath(__file__)
|
|
5
|
+
end = file_path.index('mns') + 14
|
|
6
|
+
project_path = file_path[0:end]
|
|
7
|
+
sys.path.append(project_path)
|
|
8
|
+
import requests
|
|
9
|
+
import pandas as pd
|
|
10
|
+
import mns_common.component.common_service_fun_api as common_service_fun_api
|
|
11
|
+
from datetime import datetime
|
|
12
|
+
import numpy as np
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def stock_zh_a_hist(
|
|
16
|
+
symbol: str = "0.000001",
|
|
17
|
+
period: str = 'daily',
|
|
18
|
+
start_date: str = "19700101",
|
|
19
|
+
end_date: str = "22220101",
|
|
20
|
+
adjust: str = "",
|
|
21
|
+
proxies: str = None
|
|
22
|
+
) -> pd.DataFrame:
|
|
23
|
+
"""
|
|
24
|
+
东方财富网-行情首页-沪深京 A 股-每日行情
|
|
25
|
+
http://quote.eastmoney.com/concept/sh603777.html?from=classic
|
|
26
|
+
:param symbol: 股票代码
|
|
27
|
+
:type symbol: str
|
|
28
|
+
:param period: choice of {'daily', 'weekly', 'monthly'}
|
|
29
|
+
:type period: str
|
|
30
|
+
:param start_date: 开始日期
|
|
31
|
+
:type start_date: str
|
|
32
|
+
:param end_date: 结束日期
|
|
33
|
+
:type end_date: str
|
|
34
|
+
:param adjust: choice of {"qfq": "前复权", "hfq": "后复权", "": "不复权"}
|
|
35
|
+
:type adjust: str
|
|
36
|
+
:param proxies: 代理ip
|
|
37
|
+
:type proxies: str
|
|
38
|
+
|
|
39
|
+
:return: 每日行情
|
|
40
|
+
:rtype: pandas.DataFrame
|
|
41
|
+
"""
|
|
42
|
+
adjust_dict = {"qfq": "1", "hfq": "2", "": "0"}
|
|
43
|
+
period_dict = {'daily': '101', 'weekly': '102', 'monthly': '103'}
|
|
44
|
+
url = "http://push2his.eastmoney.com/api/qt/stock/kline/get"
|
|
45
|
+
now_date = datetime.now()
|
|
46
|
+
now_time = int(now_date.timestamp() * 1000)
|
|
47
|
+
now_time = str(now_time)
|
|
48
|
+
|
|
49
|
+
params = {
|
|
50
|
+
"fields1": "f1,f2,f3,f4,f5,f6",
|
|
51
|
+
"fields2": "f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61,f116",
|
|
52
|
+
"ut": "7eea3edcaed734bea9cbfc24409ed989",
|
|
53
|
+
"klt": period_dict[period],
|
|
54
|
+
"fqt": adjust_dict[adjust],
|
|
55
|
+
"secid": symbol,
|
|
56
|
+
"beg": "0",
|
|
57
|
+
"end": "20500000",
|
|
58
|
+
"_": now_time,
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if proxies is None:
|
|
62
|
+
r = requests.get(url, params=params)
|
|
63
|
+
else:
|
|
64
|
+
r = requests.get(url, params=params, proxies=proxies)
|
|
65
|
+
|
|
66
|
+
data_json = r.json()
|
|
67
|
+
temp_df = pd.DataFrame([item.split(",") for item in data_json["data"]["klines"]])
|
|
68
|
+
temp_df.columns = [
|
|
69
|
+
"date",
|
|
70
|
+
"open",
|
|
71
|
+
"close",
|
|
72
|
+
"high",
|
|
73
|
+
"low",
|
|
74
|
+
"volume",
|
|
75
|
+
"amount",
|
|
76
|
+
"pct_chg",
|
|
77
|
+
"chg",
|
|
78
|
+
"change",
|
|
79
|
+
"exchange",
|
|
80
|
+
]
|
|
81
|
+
|
|
82
|
+
temp_df['date'] = temp_df['date'].apply(
|
|
83
|
+
lambda x: x.replace("-", ""))
|
|
84
|
+
temp_df.index = temp_df["date"]
|
|
85
|
+
temp_df = temp_df[start_date:end_date]
|
|
86
|
+
temp_df.reset_index(inplace=True, drop=True)
|
|
87
|
+
temp_df['open'] = pd.to_numeric(temp_df['open'])
|
|
88
|
+
temp_df['close'] = pd.to_numeric(temp_df['close'])
|
|
89
|
+
temp_df['high'] = pd.to_numeric(temp_df['high'])
|
|
90
|
+
temp_df['low'] = pd.to_numeric(temp_df['low'])
|
|
91
|
+
temp_df['volume'] = pd.to_numeric(temp_df['volume'])
|
|
92
|
+
temp_df['amount'] = pd.to_numeric(temp_df['amount'])
|
|
93
|
+
temp_df['pct_chg'] = pd.to_numeric(temp_df['pct_chg'])
|
|
94
|
+
temp_df['chg'] = pd.to_numeric(temp_df['chg'])
|
|
95
|
+
temp_df['change'] = pd.to_numeric(temp_df['change'])
|
|
96
|
+
temp_df['exchange'] = pd.to_numeric(temp_df['exchange'])
|
|
97
|
+
|
|
98
|
+
temp_df['symbol'] = symbol
|
|
99
|
+
temp_df['_id'] = temp_df['symbol'] + '-' + temp_df['date']
|
|
100
|
+
temp_df['last_price'] = round(((temp_df['close']) / (1 + temp_df['chg'] / 100)), 2)
|
|
101
|
+
temp_df['max_chg'] = round(
|
|
102
|
+
((temp_df['high'] - temp_df['last_price']) / temp_df['last_price']) * 100, 2)
|
|
103
|
+
temp_df['amount_level'] = round((temp_df['amount'] / common_service_fun_api.HUNDRED_MILLION), 2)
|
|
104
|
+
temp_df['flow_mv'] = round(temp_df['amount'] * 100 / temp_df['exchange'], 2)
|
|
105
|
+
temp_df['flow_mv_sp'] = round(temp_df['flow_mv'] / common_service_fun_api.HUNDRED_MILLION, 2)
|
|
106
|
+
|
|
107
|
+
temp_df.replace([np.inf, -np.inf], 0, inplace=True)
|
|
108
|
+
temp_df.fillna(0, inplace=True)
|
|
109
|
+
return temp_df
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
import mns_common.component.proxies.proxy_common_api as proxy_common_api
|
|
113
|
+
|
|
114
|
+
if __name__ == '__main__':
|
|
115
|
+
while True:
|
|
116
|
+
proxy_ip = proxy_common_api.get_proxy_ip(5)
|
|
117
|
+
df = stock_zh_a_hist("0.000001",
|
|
118
|
+
'daily',
|
|
119
|
+
"19700101",
|
|
120
|
+
"22220101",
|
|
121
|
+
"",
|
|
122
|
+
proxy_ip)
|
|
123
|
+
print(df)
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
file_path = os.path.abspath(__file__)
|
|
5
|
+
end = file_path.index('mns') + 7
|
|
6
|
+
project_path = file_path[0:end]
|
|
7
|
+
sys.path.append(project_path)
|
|
8
|
+
import pandas as pd
|
|
9
|
+
import requests
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def stock_bid_ask_em(symbol: str = "000001") -> pd.DataFrame:
|
|
13
|
+
"""
|
|
14
|
+
东方财富-行情报价
|
|
15
|
+
https://quote.eastmoney.com/sz000001.html
|
|
16
|
+
:param symbol: 股票代码
|
|
17
|
+
:type symbol: str
|
|
18
|
+
:return: 行情报价
|
|
19
|
+
:rtype: pandas.DataFrame
|
|
20
|
+
"""
|
|
21
|
+
url = "https://push2.eastmoney.com/api/qt/stock/get"
|
|
22
|
+
params = {
|
|
23
|
+
"fltt": "2",
|
|
24
|
+
"invt": "2",
|
|
25
|
+
"fields": "f120,f121,f122,f174,f175,f59,f163,f43,f57,f58,f169,f170,f46,f44,f51,"
|
|
26
|
+
"f168,f47,f164,f116,f60,f45,f52,f50,f48,f167,f117,f71,f161,f49,f530,"
|
|
27
|
+
"f135,f136,f137,f138,f139,f141,f142,f144,f145,f147,f148,f140,f143,f146,"
|
|
28
|
+
"f149,f55,f62,f162,f92,f173,f104,f105,f84,f85,f183,f184,f185,f186,f187,"
|
|
29
|
+
"f188,f189,f190,f191,f192,f107,f111,f86,f177,f78,f110,f262,f263,f264,f267,"
|
|
30
|
+
"f268,f255,f256,f257,f258,f127,f199,f128,f198,f259,f260,f261,f171,f277,f278,"
|
|
31
|
+
"f279,f288,f152,f250,f251,f252,f253,f254,f269,f270,f271,f272,f273,f274,f275,"
|
|
32
|
+
"f276,f265,f266,f289,f290,f286,f285,f292,f293,f294,f295",
|
|
33
|
+
|
|
34
|
+
"secid": symbol,
|
|
35
|
+
}
|
|
36
|
+
r = requests.get(url, params=params)
|
|
37
|
+
data_json = r.json()
|
|
38
|
+
tick_dict = {
|
|
39
|
+
"now_price": data_json["data"]["f43"],
|
|
40
|
+
"dt_price": data_json["data"]["f52"],
|
|
41
|
+
"zt_price": data_json["data"]["f51"],
|
|
42
|
+
"wei_bi": data_json["data"]["f191"],
|
|
43
|
+
"sell_5": data_json["data"]["f31"],
|
|
44
|
+
"sell_5_vol": data_json["data"]["f32"] * 100,
|
|
45
|
+
"sell_4": data_json["data"]["f33"],
|
|
46
|
+
"sell_4_vol": data_json["data"]["f34"] * 100,
|
|
47
|
+
"sell_3": data_json["data"]["f35"],
|
|
48
|
+
"sell_3_vol": data_json["data"]["f36"] * 100,
|
|
49
|
+
"sell_2": data_json["data"]["f37"],
|
|
50
|
+
"sell_2_vol": data_json["data"]["f38"] * 100,
|
|
51
|
+
"sell_1": data_json["data"]["f39"],
|
|
52
|
+
"sell_1_vol": data_json["data"]["f40"] * 100,
|
|
53
|
+
"buy_1": data_json["data"]["f19"],
|
|
54
|
+
"buy_1_vol": data_json["data"]["f20"] * 100,
|
|
55
|
+
"buy_2": data_json["data"]["f17"],
|
|
56
|
+
"buy_2_vol": data_json["data"]["f18"] * 100,
|
|
57
|
+
"buy_3": data_json["data"]["f15"],
|
|
58
|
+
"buy_3_vol": data_json["data"]["f16"] * 100,
|
|
59
|
+
"buy_4": data_json["data"]["f13"],
|
|
60
|
+
"buy_4_vol": data_json["data"]["f14"] * 100,
|
|
61
|
+
"buy_5": data_json["data"]["f11"],
|
|
62
|
+
"buy_5_vol": data_json["data"]["f12"] * 100,
|
|
63
|
+
}
|
|
64
|
+
temp_df = pd.DataFrame(tick_dict, index=[1])
|
|
65
|
+
temp_df.reset_index(inplace=True)
|
|
66
|
+
temp_df.loc[temp_df['wei_bi'] == '-', 'wei_bi'] = 0
|
|
67
|
+
temp_df.loc[temp_df['sell_5_vol'] == '-', 'sell_5_vol'] = 0
|
|
68
|
+
temp_df.loc[temp_df['sell_5'] == '-', 'sell_5'] = 0
|
|
69
|
+
temp_df.loc[temp_df['sell_4_vol'] == '-', 'sell_4_vol'] = 0
|
|
70
|
+
temp_df.loc[temp_df['sell_4'] == '-', 'sell_4'] = 0
|
|
71
|
+
temp_df.loc[temp_df['sell_3_vol'] == '-', 'sell_3_vol'] = 0
|
|
72
|
+
temp_df.loc[temp_df['sell_3'] == '-', 'sell_3'] = 0
|
|
73
|
+
temp_df.loc[temp_df['sell_2_vol'] == '-', 'sell_2_vol'] = 0
|
|
74
|
+
temp_df.loc[temp_df['sell_2'] == '-', 'sell_2'] = 0
|
|
75
|
+
temp_df.loc[temp_df['sell_1_vol'] == '-', 'sell_1_vol'] = 0
|
|
76
|
+
temp_df.loc[temp_df['sell_1'] == '-', 'sell_1'] = 0
|
|
77
|
+
temp_df.loc[temp_df['buy_1_vol'] == '-', 'buy_1_vol'] = 0
|
|
78
|
+
temp_df.loc[temp_df['buy_1'] == '-', 'buy_1'] = 0
|
|
79
|
+
temp_df.loc[temp_df['buy_2_vol'] == '-', 'buy_2_vol'] = 0
|
|
80
|
+
temp_df.loc[temp_df['buy_2'] == '-', 'buy_2'] = 0
|
|
81
|
+
temp_df.loc[temp_df['buy_3_vol'] == '-', 'buy_3_vol'] = 0
|
|
82
|
+
temp_df.loc[temp_df['buy_3'] == '-', 'buy_3'] = 0
|
|
83
|
+
temp_df.loc[temp_df['buy_4_vol'] == '-', 'buy_4_vol'] = 0
|
|
84
|
+
temp_df.loc[temp_df['buy_4'] == '-', 'buy_4'] = 0
|
|
85
|
+
temp_df.loc[temp_df['buy_5_vol'] == '-', 'buy_5_vol'] = 0
|
|
86
|
+
temp_df.loc[temp_df['buy_5'] == '-', 'buy_5'] = 0
|
|
87
|
+
temp_df['symbol'] = symbol
|
|
88
|
+
return temp_df
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
if __name__ == '__main__':
|
|
92
|
+
while True:
|
|
93
|
+
df = stock_bid_ask_em('0.000001')
|
|
94
|
+
print(df)
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
file_path = os.path.abspath(__file__)
|
|
5
|
+
end = file_path.index('mns') + 14
|
|
6
|
+
project_path = file_path[0:end]
|
|
7
|
+
sys.path.append(project_path)
|
|
8
|
+
import akshare as ak
|
|
9
|
+
from loguru import logger
|
|
10
|
+
import mns_common.utils.data_frame_util as data_frame_util
|
|
11
|
+
import mns_common.utils.date_handle_util as date_handle_util
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def stock_em_dt_pool_df(date):
|
|
15
|
+
try:
|
|
16
|
+
date = date_handle_util.no_slash_date(date)
|
|
17
|
+
stock_dt_pool_df = ak.stock_zt_pool_dtgc_em(date)
|
|
18
|
+
if data_frame_util.is_empty(stock_dt_pool_df):
|
|
19
|
+
return None
|
|
20
|
+
stock_dt_pool_df.rename(columns={"序号": "index",
|
|
21
|
+
"代码": "symbol",
|
|
22
|
+
"名称": "name",
|
|
23
|
+
"涨跌幅": "chg",
|
|
24
|
+
"最新价": "now_price",
|
|
25
|
+
"成交额": "amount",
|
|
26
|
+
"流通市值": "flow_mv",
|
|
27
|
+
"总市值": "total_mv",
|
|
28
|
+
"动态市盈率": "ttm_pe",
|
|
29
|
+
"换手率": "exchange",
|
|
30
|
+
"封单资金": "closure_funds",
|
|
31
|
+
"最后封板时间": "last_closure_time",
|
|
32
|
+
"板上成交额": "plates_deal",
|
|
33
|
+
"连续跌停": "connected_boards_numbers",
|
|
34
|
+
"开板次数": "frying_plates_numbers",
|
|
35
|
+
"所属行业": "industry"
|
|
36
|
+
}, inplace=True)
|
|
37
|
+
stock_dt_pool_df.loc[stock_dt_pool_df['amount'] == '-', 'amount'] = 0
|
|
38
|
+
stock_dt_pool_df.loc[stock_dt_pool_df['exchange'] == '-', 'exchange'] = 0
|
|
39
|
+
stock_dt_pool_df.loc[stock_dt_pool_df['closure_funds'] == '-', 'closure_funds'] = 0
|
|
40
|
+
return stock_dt_pool_df
|
|
41
|
+
except BaseException as e:
|
|
42
|
+
logger.error("同步股票跌停数据出现异常:{},{}", date, e)
|
|
43
|
+
return None
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
if __name__ == '__main__':
|
|
47
|
+
stock_em_dt_pool_df('20231215')
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
file_path = os.path.abspath(__file__)
|
|
5
|
+
end = file_path.index('mns') + 14
|
|
6
|
+
project_path = file_path[0:end]
|
|
7
|
+
sys.path.append(project_path)
|
|
8
|
+
import akshare as ak
|
|
9
|
+
from loguru import logger
|
|
10
|
+
import mns_common.utils.data_frame_util as data_frame_util
|
|
11
|
+
import mns_common.utils.date_handle_util as date_handle_util
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def stock_zb_pool_df(date):
|
|
15
|
+
try:
|
|
16
|
+
date = date_handle_util.no_slash_date(date)
|
|
17
|
+
stock_zb_pool = ak.stock_zt_pool_zbgc_em(date)
|
|
18
|
+
if data_frame_util.is_empty(stock_zb_pool):
|
|
19
|
+
return None
|
|
20
|
+
stock_zb_pool.rename(columns={"序号": "index",
|
|
21
|
+
"代码": "symbol",
|
|
22
|
+
"名称": "name",
|
|
23
|
+
"涨跌幅": "chg",
|
|
24
|
+
"最新价": "now_price",
|
|
25
|
+
"炸板股价": "zt_price",
|
|
26
|
+
"成交额": "amount",
|
|
27
|
+
"流通市值": "flow_mv",
|
|
28
|
+
"总市值": "total_mv",
|
|
29
|
+
"动态市盈率": "ttm_pe",
|
|
30
|
+
"换手率": "exchange",
|
|
31
|
+
"涨速": "speed",
|
|
32
|
+
"首次封板时间": "first_closure_time",
|
|
33
|
+
"炸板次数": "frying_plates_numbers",
|
|
34
|
+
"炸板股统计": "statistics",
|
|
35
|
+
"振幅": "pct_chg",
|
|
36
|
+
"所属行业": "industry"
|
|
37
|
+
}, inplace=True)
|
|
38
|
+
stock_zb_pool.loc[stock_zb_pool['amount'] == '-', 'amount'] = 0
|
|
39
|
+
stock_zb_pool.loc[stock_zb_pool['exchange'] == '-', 'exchange'] = 0
|
|
40
|
+
return stock_zb_pool
|
|
41
|
+
except BaseException as e:
|
|
42
|
+
logger.error("同步股票炸板数据出现异常:{},{}", date, e)
|
|
43
|
+
return None
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
if __name__ == '__main__':
|
|
47
|
+
df = stock_zb_pool_df('2024-09-04')
|
|
48
|
+
print(df)
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
file_path = os.path.abspath(__file__)
|
|
5
|
+
end = file_path.index('mns') + 14
|
|
6
|
+
project_path = file_path[0:end]
|
|
7
|
+
sys.path.append(project_path)
|
|
8
|
+
import akshare as ak
|
|
9
|
+
from loguru import logger
|
|
10
|
+
import mns_common.utils.date_handle_util as date_handle_util
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def stock_em_zt_pool_df(date):
|
|
14
|
+
try:
|
|
15
|
+
date = date_handle_util.no_slash_date(date)
|
|
16
|
+
zt_df = ak.stock_zt_pool_em(date)
|
|
17
|
+
if zt_df is None or zt_df.shape[0] == 0:
|
|
18
|
+
return None
|
|
19
|
+
zt_df.rename(columns={"序号": "index",
|
|
20
|
+
"代码": "symbol",
|
|
21
|
+
"名称": "name",
|
|
22
|
+
"最新价": "now_price",
|
|
23
|
+
"涨跌幅": "chg",
|
|
24
|
+
"成交额": "amount",
|
|
25
|
+
"流通市值": "flow_mv",
|
|
26
|
+
"总市值": "total_mv",
|
|
27
|
+
"换手率": "exchange",
|
|
28
|
+
"封板资金": "closure_funds",
|
|
29
|
+
"首次封板时间": "first_closure_time",
|
|
30
|
+
"最后封板时间": "last_closure_time",
|
|
31
|
+
"炸板次数": "frying_plates_numbers",
|
|
32
|
+
"涨停统计": "statistics",
|
|
33
|
+
"连板数": "connected_boards_numbers",
|
|
34
|
+
"所属行业": "industry"
|
|
35
|
+
}, inplace=True)
|
|
36
|
+
zt_df.loc[zt_df['amount'] == '-', 'amount'] = 0
|
|
37
|
+
zt_df.loc[zt_df['exchange'] == '-', 'exchange'] = 0
|
|
38
|
+
zt_df.loc[zt_df['closure_funds'] == '-', 'closure_funds'] = 0
|
|
39
|
+
return zt_df
|
|
40
|
+
except BaseException as e:
|
|
41
|
+
logger.error("同步股票涨停数据出现异常:{},{}", date, e)
|
|
42
|
+
return None
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
if __name__ == '__main__':
|
|
46
|
+
df = stock_em_zt_pool_df('2025-10-24')
|
|
47
|
+
print(df)
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import os
|
|
3
|
+
import akshare as ak
|
|
4
|
+
from mns_common.db.MongodbUtil import MongodbUtil
|
|
5
|
+
import mns_common.utils.data_frame_util as data_frame_util
|
|
6
|
+
import pandas as pd
|
|
7
|
+
from datetime import datetime
|
|
8
|
+
|
|
9
|
+
file_path = os.path.abspath(__file__)
|
|
10
|
+
end = file_path.index('mns') + 14
|
|
11
|
+
project_path = file_path[0:end]
|
|
12
|
+
sys.path.append(project_path)
|
|
13
|
+
mongodb_util = MongodbUtil('27017')
|
|
14
|
+
|
|
15
|
+
predictor_translation_map = {
|
|
16
|
+
"主营业务收入": "main_operating_revenue",
|
|
17
|
+
"净利润": "net_profit",
|
|
18
|
+
"归属于上市公司股东的净利润": "net_profit_attributable_to_shareholders",
|
|
19
|
+
"扣除后营业收入": "operating_revenue_deducted",
|
|
20
|
+
"扣除非经常性损益后的净利润": "net_profit_excluding_non_recurring_items",
|
|
21
|
+
"扣非后每股收益": "earnings_per_share_excluding_non_recurring_items",
|
|
22
|
+
"每股收益": "earnings_per_share",
|
|
23
|
+
"营业收入": "operating_revenue",
|
|
24
|
+
"非经常性损益": "non_recurring_items"
|
|
25
|
+
}
|
|
26
|
+
# ['net_profit', 'net_profit_attributable_to_shareholders', 'net_profit_excluding_non_recurring_items',
|
|
27
|
+
# 'earnings_per_share_excluding_non_recurring_items', 'earnings_per_share']
|
|
28
|
+
predict_type_translation_map = {
|
|
29
|
+
"不确定": "uncertain",
|
|
30
|
+
"减亏": "loss_reduction",
|
|
31
|
+
"增亏": "increased_loss",
|
|
32
|
+
"扭亏": "turnaround",
|
|
33
|
+
"略减": "slight_decrease",
|
|
34
|
+
"略增": "slight_increase",
|
|
35
|
+
"续亏": "continued_loss",
|
|
36
|
+
"续盈": "continued_profit",
|
|
37
|
+
"预减": "pre_loss",
|
|
38
|
+
"预增": "pre_increase",
|
|
39
|
+
"首亏": "first_loss"
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
# ['turnaround', 'slight_increase', 'continued_profit', 'pre_increase']
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def sync_yjyg_data(period):
|
|
47
|
+
stock_yjyg_em_df = ak.stock_yjyg_em(date=period)
|
|
48
|
+
if data_frame_util.is_empty(stock_yjyg_em_df):
|
|
49
|
+
return None
|
|
50
|
+
now_date = datetime.now()
|
|
51
|
+
str_now_date = now_date.strftime('%Y-%m-%d %H:%M:%S')
|
|
52
|
+
sync_day = now_date.strftime('%Y-%m-%d')
|
|
53
|
+
stock_yjyg_em_df.rename(columns={"序号": "index",
|
|
54
|
+
"股票代码": "symbol",
|
|
55
|
+
"股票简称": "name",
|
|
56
|
+
"预测指标": "predictor",
|
|
57
|
+
"业绩变动": "perform_change_detail",
|
|
58
|
+
"预测数值": "predicted_value",
|
|
59
|
+
"业绩变动幅度": "perform_chg",
|
|
60
|
+
"业绩变动原因": "perform_change_reason",
|
|
61
|
+
"预告类型": "predict_type",
|
|
62
|
+
"上年同期值": "last_year_period",
|
|
63
|
+
"公告日期": "release_day"}, inplace=True)
|
|
64
|
+
|
|
65
|
+
stock_yjyg_em_df['predictor_en'] = stock_yjyg_em_df['predictor'].map(lambda x: predictor_translation_map.get(x, x))
|
|
66
|
+
stock_yjyg_em_df['predict_type_en'] = stock_yjyg_em_df['predict_type'].map(
|
|
67
|
+
lambda x: predict_type_translation_map.get(x, x))
|
|
68
|
+
|
|
69
|
+
stock_yjyg_em_df.loc[:, 'period'] = period
|
|
70
|
+
stock_yjyg_em_df.loc[:, 'sync_day'] = sync_day
|
|
71
|
+
stock_yjyg_em_df.loc[:, 'str_now_date'] = str_now_date
|
|
72
|
+
stock_yjyg_em_df['release_day'] = pd.to_datetime(stock_yjyg_em_df['release_day'])
|
|
73
|
+
stock_yjyg_em_df['release_day'] = stock_yjyg_em_df['release_day'].dt.strftime('%Y-%m-%d')
|
|
74
|
+
|
|
75
|
+
stock_yjyg_em_df['perform_chg'].fillna(0, inplace=True)
|
|
76
|
+
stock_yjyg_em_df['_id'] = stock_yjyg_em_df['symbol'] + '_' + period + '_' + stock_yjyg_em_df[
|
|
77
|
+
'predictor_en'] + '_' + stock_yjyg_em_df['predict_type_en']
|
|
78
|
+
stock_yjyg_em_df = stock_yjyg_em_df[
|
|
79
|
+
['_id', 'symbol', 'name', 'predictor',
|
|
80
|
+
'predictor_en',
|
|
81
|
+
'perform_change_detail',
|
|
82
|
+
'predicted_value',
|
|
83
|
+
'perform_chg',
|
|
84
|
+
'perform_change_reason',
|
|
85
|
+
'predict_type',
|
|
86
|
+
'predict_type_en',
|
|
87
|
+
'last_year_period',
|
|
88
|
+
'release_day',
|
|
89
|
+
'period',
|
|
90
|
+
'sync_day',
|
|
91
|
+
'str_now_date',
|
|
92
|
+
'index']]
|
|
93
|
+
|
|
94
|
+
mongodb_util.save_mongo(stock_yjyg_em_df, 'stock_yjyg_em_df')
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
if __name__ == '__main__':
|
|
98
|
+
sync_yjyg_data('20230630')
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
mns_common/__init__.py,sha256=2U9DiKslxsWwLLEcZKjS8UiQPN1QgALvnK3HiJNIZE0,163
|
|
2
2
|
mns_common/api/__init__.py,sha256=2U9DiKslxsWwLLEcZKjS8UiQPN1QgALvnK3HiJNIZE0,163
|
|
3
|
+
mns_common/api/akshare/__init__.py,sha256=2U9DiKslxsWwLLEcZKjS8UiQPN1QgALvnK3HiJNIZE0,163
|
|
4
|
+
mns_common/api/akshare/k_line_api.py,sha256=IfqJDG2e-_Ry1f_MqjIff6jad9IIC3TjnpmaJ9H_pbk,4290
|
|
5
|
+
mns_common/api/akshare/stock_bid_ask_api.py,sha256=Af9t6Pv_-p7PJJ_7rF_JVaGBomkvePMMqALwuBh2Gfw,4139
|
|
6
|
+
mns_common/api/akshare/stock_dt_pool.py,sha256=sKedOTzqsBZprJHJEr2sRYa8xbeSK7tRenqBE3wOdUc,2245
|
|
7
|
+
mns_common/api/akshare/stock_zb_pool.py,sha256=ylcVgZTzsD3qz9WaItLtoqTf4t-Ex49MDtZUk0xaB5Q,2126
|
|
8
|
+
mns_common/api/akshare/stock_zt_pool_api.py,sha256=-j_GZI3TTPV8XWnczgGjct5XZAHZdlptBcECv7Rfyzw,1929
|
|
9
|
+
mns_common/api/akshare/yjyg_sync_api.py,sha256=cvk50_XhJWUqduOiC15SYvQTCQqECt6td_L2Hvnl7Jg,4108
|
|
3
10
|
mns_common/api/em/__init__.py,sha256=2U9DiKslxsWwLLEcZKjS8UiQPN1QgALvnK3HiJNIZE0,163
|
|
4
11
|
mns_common/api/em/concept/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
|
|
5
12
|
mns_common/api/em/concept/em_concept_index_api.py,sha256=PP87ES8a_y0o3SKLzBsPrc7DCPI3MBCD-4SmoUUirl0,8285
|
|
@@ -152,7 +159,7 @@ mns_common/utils/date_handle_util.py,sha256=XS-MyA8_7k35LOCFAYOHgVcVkMft_Kc4Wa9U
|
|
|
152
159
|
mns_common/utils/db_util.py,sha256=hSmfNAN4vEeEaUva6_cicZEhb2jSnib-Gvk2reke1vc,2590
|
|
153
160
|
mns_common/utils/file_util.py,sha256=egWu6PenGPRp_ixrNTHKarT4dAnOT6FETR82EHUZJnQ,1042
|
|
154
161
|
mns_common/utils/ip_util.py,sha256=UTcYfz_uytB__6nlBf7T-izuI7hi4XdB6ET0sJgEel4,969
|
|
155
|
-
mns_common-1.5.2.
|
|
156
|
-
mns_common-1.5.2.
|
|
157
|
-
mns_common-1.5.2.
|
|
158
|
-
mns_common-1.5.2.
|
|
162
|
+
mns_common-1.5.2.2.dist-info/METADATA,sha256=k7MWw_x8uvUMxv94QjZDSqWPLw5Zt-AnILwHBPeimrk,61
|
|
163
|
+
mns_common-1.5.2.2.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
|
|
164
|
+
mns_common-1.5.2.2.dist-info/top_level.txt,sha256=ZC58kAR-8Hvc6U2xhYNBNLAh3mb6sZazbdj5nZpvEkQ,11
|
|
165
|
+
mns_common-1.5.2.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|