akshare 1.12.99__py3-none-any.whl → 1.15.73__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 akshare might be problematic. Click here for more details.
- akshare/__init__.py +442 -138
- akshare/air/air_hebei.py +79 -53
- akshare/air/air_zhenqi.py +29 -43
- akshare/air/sunrise_tad.py +32 -17
- akshare/bank/bank_cbirc_2020.py +12 -9
- akshare/bond/bond_cb_ths.py +17 -9
- akshare/bond/bond_china.py +38 -39
- akshare/bond/bond_china_money.py +75 -48
- akshare/bond/bond_info_cm.py +28 -8
- akshare/bond/bond_issue_cninfo.py +73 -30
- akshare/bond/bond_zh_cov.py +1 -1
- akshare/bond/bond_zh_sina.py +57 -51
- akshare/cal/__init__.py +0 -0
- akshare/cal/rv.py +170 -0
- akshare/cost/cost_living.py +7 -5
- akshare/currency/currency_safe.py +7 -6
- akshare/data/cninfo.js +15 -0
- akshare/datasets.py +10 -21
- akshare/economic/macro_bank.py +95 -653
- akshare/economic/macro_china.py +772 -1024
- akshare/economic/macro_china_hk.py +65 -243
- akshare/economic/macro_china_nbs.py +24 -7
- akshare/economic/macro_constitute.py +17 -12
- akshare/economic/macro_euro.py +13 -6
- akshare/economic/macro_finance_ths.py +133 -0
- akshare/economic/macro_info_ws.py +100 -0
- akshare/economic/macro_japan.py +5 -4
- akshare/economic/macro_other.py +12 -9
- akshare/economic/macro_usa.py +376 -1940
- akshare/economic/marco_cnbs.py +11 -6
- akshare/energy/energy_carbon.py +94 -125
- akshare/event/migration.py +3 -2
- akshare/exceptions.py +43 -0
- akshare/file_fold/calendar.json +245 -2
- akshare/fortune/fortune_500.py +15 -48
- akshare/fund/fund_amac.py +157 -75
- akshare/fund/fund_em.py +191 -184
- akshare/fund/fund_etf_em.py +16 -15
- akshare/fund/fund_etf_sina.py +71 -23
- akshare/fund/fund_etf_ths.py +93 -0
- akshare/fund/fund_fee_em.py +98 -0
- akshare/fund/fund_portfolio_em.py +60 -50
- akshare/fund/fund_rank_em.py +91 -82
- akshare/fund/fund_report_cninfo.py +63 -48
- akshare/fund/fund_scale_sina.py +20 -10
- akshare/fund/fund_xq.py +139 -109
- akshare/futures/cons.py +8 -31
- akshare/futures/cot.py +185 -137
- akshare/futures/futures_basis.py +97 -32
- akshare/futures/futures_comm_ctp.py +37 -0
- akshare/futures/futures_comm_qihuo.py +74 -45
- akshare/futures/futures_daily_bar.py +121 -184
- akshare/futures/futures_hf_em.py +66 -61
- akshare/futures/futures_hq_sina.py +79 -61
- akshare/futures/futures_index_ccidx.py +6 -3
- akshare/futures/futures_inventory_99.py +61 -272
- akshare/futures/futures_news_shmet.py +4 -2
- akshare/futures/futures_roll_yield.py +12 -25
- akshare/futures/futures_spot_stock_em.py +19 -13
- akshare/futures/futures_stock_js.py +14 -12
- akshare/futures/futures_to_spot.py +38 -33
- akshare/futures/futures_warehouse_receipt.py +75 -71
- akshare/futures/futures_zh_sina.py +5 -5
- akshare/futures/symbol_var.py +18 -13
- akshare/futures_derivative/futures_contract_info_czce.py +60 -52
- akshare/futures_derivative/futures_contract_info_ine.py +43 -34
- akshare/futures_derivative/futures_contract_info_shfe.py +46 -35
- akshare/futures_derivative/futures_cot_sina.py +26 -19
- akshare/futures_derivative/futures_spot_sys.py +21 -8
- akshare/fx/currency_investing.py +19 -285
- akshare/index/index_cflp.py +29 -26
- akshare/index/index_cni.py +86 -88
- akshare/index/index_cons.py +26 -10
- akshare/index/index_cx.py +248 -47
- akshare/index/index_drewry.py +17 -16
- akshare/index/index_option_qvix.py +329 -0
- akshare/index/index_research_fund_sw.py +134 -0
- akshare/index/{index_sw_research.py → index_research_sw.py} +122 -58
- akshare/index/index_spot.py +9 -5
- akshare/index/index_stock_hk.py +35 -16
- akshare/index/index_stock_us_sina.py +1 -1
- akshare/index/index_stock_zh.py +180 -89
- akshare/index/index_stock_zh_csindex.py +15 -369
- akshare/index/index_sw.py +62 -34
- akshare/index/index_yw.py +46 -23
- akshare/index/index_zh_a_scope.py +48 -0
- akshare/index/index_zh_em.py +6 -4
- akshare/interest_rate/interbank_rate_em.py +14 -9
- akshare/movie/artist_yien.py +32 -5
- akshare/movie/movie_yien.py +92 -18
- akshare/movie/video_yien.py +28 -5
- akshare/news/news_baidu.py +78 -44
- akshare/news/news_cctv.py +38 -38
- akshare/news/news_stock.py +6 -3
- akshare/nlp/nlp_interface.py +7 -8
- akshare/option/cons.py +11 -11
- akshare/option/option_comm_qihuo.py +86 -0
- akshare/option/option_commodity.py +178 -51
- akshare/option/option_daily_stats_sse_szse.py +146 -0
- akshare/option/option_em.py +147 -138
- akshare/option/option_finance_sina.py +160 -137
- akshare/option/option_lhb_em.py +62 -56
- akshare/option/option_risk_indicator_sse.py +17 -14
- akshare/other/other_car_cpca.py +934 -0
- akshare/other/{other_car.py → other_car_gasgoo.py} +15 -54
- akshare/qdii/__init__.py +0 -0
- akshare/qdii/qdii_jsl.py +233 -0
- akshare/request.py +117 -0
- akshare/spot/spot_hog_soozhu.py +232 -0
- akshare/spot/spot_price_qh.py +121 -0
- akshare/spot/spot_sge.py +63 -10
- akshare/stock/stock_allotment_cninfo.py +10 -9
- akshare/stock/stock_board_concept_em.py +23 -14
- akshare/stock/stock_board_industry_em.py +40 -34
- akshare/stock/stock_cg_equity_mortgage.py +15 -11
- akshare/stock/stock_cg_guarantee.py +41 -51
- akshare/stock/stock_cg_lawsuit.py +36 -35
- akshare/stock/stock_dividend_cninfo.py +12 -6
- akshare/stock/stock_dzjy_em.py +347 -260
- akshare/stock/stock_fund_em.py +332 -84
- akshare/stock/stock_hk_famous.py +108 -0
- akshare/stock/stock_hk_sina.py +8 -7
- akshare/stock/stock_hold_control_cninfo.py +100 -15
- akshare/stock/stock_hold_control_em.py +4 -3
- akshare/stock/stock_hold_num_cninfo.py +18 -12
- akshare/stock/stock_hot_rank_em.py +2 -1
- akshare/stock/stock_hot_search_baidu.py +5 -2
- akshare/stock/stock_industry_cninfo.py +24 -18
- akshare/stock/stock_industry_pe_cninfo.py +45 -31
- akshare/stock/stock_industry_sw.py +9 -10
- akshare/stock/stock_info.py +25 -15
- akshare/stock/stock_info_em.py +5 -2
- akshare/stock/stock_intraday_em.py +5 -2
- akshare/stock/stock_intraday_sina.py +22 -18
- akshare/stock/stock_ipo_summary_cninfo.py +25 -10
- akshare/stock/stock_new_cninfo.py +32 -19
- akshare/stock/stock_news_cx.py +39 -0
- akshare/stock/stock_profile_cninfo.py +9 -8
- akshare/stock/stock_rank_forecast.py +8 -6
- akshare/stock/stock_share_changes_cninfo.py +18 -14
- akshare/stock/stock_share_hold.py +24 -19
- akshare/stock/stock_summary.py +54 -26
- akshare/stock/stock_us_famous.py +15 -6
- akshare/stock/stock_us_pink.py +7 -5
- akshare/stock/stock_us_sina.py +15 -12
- akshare/stock/stock_xq.py +38 -12
- akshare/stock/stock_zh_a_sina.py +53 -78
- akshare/stock/stock_zh_b_sina.py +32 -55
- akshare/stock/stock_zh_kcb_report.py +11 -9
- akshare/stock/stock_zh_kcb_sina.py +67 -64
- akshare/stock_feature/stock_a_below_net_asset_statistics.py +5 -2
- akshare/stock_feature/stock_a_high_low.py +5 -2
- akshare/stock_feature/stock_a_indicator.py +12 -9
- akshare/stock_feature/stock_a_pe_and_pb.py +27 -6
- akshare/stock_feature/stock_account_em.py +58 -40
- akshare/stock_feature/stock_analyst_em.py +36 -27
- akshare/stock_feature/stock_board_industry_ths.py +136 -400
- akshare/stock_feature/stock_comment_em.py +118 -85
- akshare/stock_feature/stock_concept_futu.py +183 -0
- akshare/stock_feature/stock_cyq_em.py +58 -54
- akshare/stock_feature/stock_disclosure_cninfo.py +147 -102
- akshare/stock_feature/stock_esg_sina.py +216 -11
- akshare/stock_feature/stock_fhps_em.py +60 -25
- akshare/stock_feature/stock_fhps_ths.py +25 -6
- akshare/stock_feature/stock_fund_flow.py +38 -25
- akshare/stock_feature/stock_gdfx_em.py +180 -95
- akshare/stock_feature/stock_gdhs.py +73 -49
- akshare/stock_feature/stock_gpzy_em.py +78 -46
- akshare/stock_feature/stock_hist_em.py +55 -23
- akshare/stock_feature/stock_hk_valuation_baidu.py +20 -8
- akshare/stock_feature/stock_hsgt_em.py +184 -452
- akshare/stock_feature/stock_info.py +52 -29
- akshare/stock_feature/stock_inner_trade_xq.py +39 -31
- akshare/stock_feature/stock_irm_cninfo.py +32 -9
- akshare/stock_feature/stock_jgdy_em.py +41 -38
- akshare/stock_feature/stock_lh_yybpm.py +36 -37
- akshare/stock_feature/stock_lhb_em.py +135 -71
- akshare/stock_feature/stock_lhb_sina.py +93 -46
- akshare/stock_feature/stock_margin_em.py +102 -0
- akshare/stock_feature/{stock_sse_margin.py → stock_margin_sse.py} +21 -15
- akshare/stock_feature/{stock_szse_margin.py → stock_margin_szse.py} +23 -19
- akshare/stock_feature/stock_market_legu.py +13 -8
- akshare/stock_feature/stock_pankou_em.py +72 -34
- akshare/stock_feature/stock_report_em.py +244 -54
- akshare/stock_feature/stock_research_report_em.py +48 -19
- akshare/stock_feature/stock_sns_sseinfo.py +15 -12
- akshare/stock_feature/stock_sy_em.py +86 -33
- akshare/stock_feature/stock_technology_ths.py +152 -120
- akshare/stock_feature/stock_tfp_em.py +35 -13
- akshare/stock_feature/stock_three_report_em.py +119 -77
- akshare/stock_feature/stock_ttm_lyr.py +4 -7
- akshare/stock_feature/stock_value_em.py +83 -0
- akshare/stock_feature/stock_wencai.py +21 -9
- akshare/stock_feature/stock_yjyg_em.py +63 -28
- akshare/stock_feature/stock_zf_pg.py +61 -38
- akshare/stock_feature/stock_zh_valuation_baidu.py +3 -2
- akshare/stock_feature/stock_ztb_em.py +62 -40
- akshare/stock_fundamental/stock_finance.py +150 -58
- akshare/stock_fundamental/stock_finance_ths.py +116 -31
- akshare/stock_fundamental/stock_mda_ym.py +5 -3
- akshare/stock_fundamental/stock_notice.py +29 -15
- akshare/stock_fundamental/stock_profit_forecast_em.py +31 -13
- akshare/stock_fundamental/stock_profit_forecast_ths.py +19 -10
- akshare/stock_fundamental/stock_register_em.py +448 -0
- akshare/stock_fundamental/stock_restricted_em.py +79 -32
- akshare/stock_fundamental/stock_zygc.py +10 -8
- akshare/stock_fundamental/stock_zyjs_ths.py +5 -3
- akshare/tool/trade_date_hist.py +4 -3
- akshare/utils/cons.py +10 -0
- akshare/utils/context.py +43 -0
- akshare/utils/demjson.py +2 -2
- akshare/utils/func.py +26 -0
- akshare/utils/tqdm.py +13 -3
- {akshare-1.12.99.dist-info → akshare-1.15.73.dist-info}/METADATA +52 -69
- akshare-1.15.73.dist-info/RECORD +385 -0
- {akshare-1.12.99.dist-info → akshare-1.15.73.dist-info}/WHEEL +1 -1
- tests/test_func.py +3 -5
- akshare/bond/bond_futures.py +0 -50
- akshare/bond/bond_investing.py +0 -139
- akshare/crypto/crypto_hist_investing.py +0 -249
- akshare/fortune/fortune_it_juzi.py +0 -123
- akshare/futures/futures_international.py +0 -170
- akshare/futures/futures_news_baidu.py +0 -54
- akshare/futures/inventory_data.py +0 -100
- akshare/futures_derivative/futures_index_price_nh.py +0 -61
- akshare/futures_derivative/futures_index_return_nh.py +0 -47
- akshare/futures_derivative/futures_index_volatility_nh.py +0 -51
- akshare/futures_derivative/futures_other_index_nh.py +0 -145
- akshare/index/index_fear_greed_funddb.py +0 -71
- akshare/index/index_investing.py +0 -232
- akshare/sport/sport_olympic_winter.py +0 -39
- akshare/stock_feature/stock_board_concept_ths.py +0 -422
- akshare/stock_fundamental/stock_register.py +0 -292
- akshare-1.12.99.dist-info/RECORD +0 -374
- {akshare-1.12.99.dist-info → akshare-1.15.73.dist-info}/LICENSE +0 -0
- {akshare-1.12.99.dist-info → akshare-1.15.73.dist-info}/top_level.txt +0 -0
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
# -*- coding:utf-8 -*-
|
|
2
2
|
# !/usr/bin/env python
|
|
3
3
|
"""
|
|
4
|
-
Date:
|
|
4
|
+
Date: 2024/6/19 22:00
|
|
5
5
|
Desc: 巨潮资讯-数据中心-专题统计-债券报表-债券发行
|
|
6
6
|
http://webapi.cninfo.com.cn/#/thematicStatistics
|
|
7
7
|
"""
|
|
8
|
-
import time
|
|
9
8
|
|
|
10
9
|
import pandas as pd
|
|
11
10
|
import requests
|
|
12
|
-
|
|
11
|
+
import py_mini_racer
|
|
13
12
|
|
|
14
13
|
from akshare.datasets import get_ths_js
|
|
15
14
|
|
|
@@ -23,7 +22,7 @@ def _get_file_content_cninfo(file: str = "cninfo.js") -> str:
|
|
|
23
22
|
:rtype: str
|
|
24
23
|
"""
|
|
25
24
|
setting_file_path = get_ths_js(file)
|
|
26
|
-
with open(setting_file_path) as f:
|
|
25
|
+
with open(setting_file_path, encoding="utf-8") as f:
|
|
27
26
|
file_data = f.read()
|
|
28
27
|
return file_data
|
|
29
28
|
|
|
@@ -58,7 +57,8 @@ def bond_treasure_issue_cninfo(
|
|
|
58
57
|
"Pragma": "no-cache",
|
|
59
58
|
"Proxy-Connection": "keep-alive",
|
|
60
59
|
"Referer": "http://webapi.cninfo.com.cn/",
|
|
61
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
|
|
60
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
61
|
+
"Chrome/93.0.4577.63 Safari/537.36",
|
|
62
62
|
"X-Requested-With": "XMLHttpRequest",
|
|
63
63
|
}
|
|
64
64
|
params = {
|
|
@@ -107,8 +107,12 @@ def bond_treasure_issue_cninfo(
|
|
|
107
107
|
"债券名称",
|
|
108
108
|
]
|
|
109
109
|
]
|
|
110
|
-
temp_df["发行起始日"] = pd.to_datetime(
|
|
111
|
-
|
|
110
|
+
temp_df["发行起始日"] = pd.to_datetime(
|
|
111
|
+
temp_df["发行起始日"], errors="coerce"
|
|
112
|
+
).dt.date
|
|
113
|
+
temp_df["发行终止日"] = pd.to_datetime(
|
|
114
|
+
temp_df["发行终止日"], errors="coerce"
|
|
115
|
+
).dt.date
|
|
112
116
|
temp_df["缴款日"] = pd.to_datetime(temp_df["缴款日"], errors="coerce").dt.date
|
|
113
117
|
temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
|
|
114
118
|
temp_df["计划发行总量"] = pd.to_numeric(temp_df["计划发行总量"], errors="coerce")
|
|
@@ -133,7 +137,6 @@ def bond_local_government_issue_cninfo(
|
|
|
133
137
|
:rtype: pandas.DataFrame
|
|
134
138
|
"""
|
|
135
139
|
url = "http://webapi.cninfo.com.cn/api/sysapi/p_sysapi1121"
|
|
136
|
-
random_time_str = str(int(time.time()))
|
|
137
140
|
js_code = py_mini_racer.MiniRacer()
|
|
138
141
|
js_content = _get_file_content_cninfo("cninfo.js")
|
|
139
142
|
js_code.eval(js_content)
|
|
@@ -150,7 +153,8 @@ def bond_local_government_issue_cninfo(
|
|
|
150
153
|
"Pragma": "no-cache",
|
|
151
154
|
"Proxy-Connection": "keep-alive",
|
|
152
155
|
"Referer": "http://webapi.cninfo.com.cn/",
|
|
153
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
|
|
156
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
157
|
+
"Chrome/93.0.4577.63 Safari/537.36",
|
|
154
158
|
"X-Requested-With": "XMLHttpRequest",
|
|
155
159
|
}
|
|
156
160
|
params = {
|
|
@@ -199,8 +203,12 @@ def bond_local_government_issue_cninfo(
|
|
|
199
203
|
"债券名称",
|
|
200
204
|
]
|
|
201
205
|
]
|
|
202
|
-
temp_df["发行起始日"] = pd.to_datetime(
|
|
203
|
-
|
|
206
|
+
temp_df["发行起始日"] = pd.to_datetime(
|
|
207
|
+
temp_df["发行起始日"], errors="coerce"
|
|
208
|
+
).dt.date
|
|
209
|
+
temp_df["发行终止日"] = pd.to_datetime(
|
|
210
|
+
temp_df["发行终止日"], errors="coerce"
|
|
211
|
+
).dt.date
|
|
204
212
|
temp_df["缴款日"] = pd.to_datetime(temp_df["缴款日"], errors="coerce").dt.date
|
|
205
213
|
temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
|
|
206
214
|
temp_df["计划发行总量"] = pd.to_numeric(temp_df["计划发行总量"], errors="coerce")
|
|
@@ -241,7 +249,8 @@ def bond_corporate_issue_cninfo(
|
|
|
241
249
|
"Pragma": "no-cache",
|
|
242
250
|
"Proxy-Connection": "keep-alive",
|
|
243
251
|
"Referer": "http://webapi.cninfo.com.cn/",
|
|
244
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
|
|
252
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
253
|
+
"Chrome/93.0.4577.63 Safari/537.36",
|
|
245
254
|
"X-Requested-With": "XMLHttpRequest",
|
|
246
255
|
}
|
|
247
256
|
params = {
|
|
@@ -295,8 +304,12 @@ def bond_corporate_issue_cninfo(
|
|
|
295
304
|
]
|
|
296
305
|
]
|
|
297
306
|
temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
|
|
298
|
-
temp_df["交易所网上发行起始日"] = pd.to_datetime(
|
|
299
|
-
|
|
307
|
+
temp_df["交易所网上发行起始日"] = pd.to_datetime(
|
|
308
|
+
temp_df["交易所网上发行起始日"], errors="coerce"
|
|
309
|
+
).dt.date
|
|
310
|
+
temp_df["交易所网上发行终止日"] = pd.to_datetime(
|
|
311
|
+
temp_df["交易所网上发行终止日"], errors="coerce"
|
|
312
|
+
).dt.date
|
|
300
313
|
temp_df["计划发行总量"] = pd.to_numeric(temp_df["计划发行总量"], errors="coerce")
|
|
301
314
|
temp_df["实际发行总量"] = pd.to_numeric(temp_df["实际发行总量"], errors="coerce")
|
|
302
315
|
temp_df["发行面值"] = pd.to_numeric(temp_df["发行面值"], errors="coerce")
|
|
@@ -336,7 +349,8 @@ def bond_cov_issue_cninfo(
|
|
|
336
349
|
"Pragma": "no-cache",
|
|
337
350
|
"Proxy-Connection": "keep-alive",
|
|
338
351
|
"Referer": "http://webapi.cninfo.com.cn/",
|
|
339
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
|
|
352
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
353
|
+
"Chrome/93.0.4577.63 Safari/537.36",
|
|
340
354
|
"X-Requested-With": "XMLHttpRequest",
|
|
341
355
|
}
|
|
342
356
|
params = {
|
|
@@ -418,23 +432,47 @@ def bond_cov_issue_cninfo(
|
|
|
418
432
|
]
|
|
419
433
|
]
|
|
420
434
|
temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
|
|
421
|
-
temp_df["发行起始日"] = pd.to_datetime(
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
temp_df["
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
temp_df["
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
temp_df["
|
|
435
|
+
temp_df["发行起始日"] = pd.to_datetime(
|
|
436
|
+
temp_df["发行起始日"], errors="coerce"
|
|
437
|
+
).dt.date
|
|
438
|
+
temp_df["发行终止日"] = pd.to_datetime(
|
|
439
|
+
temp_df["发行终止日"], errors="coerce"
|
|
440
|
+
).dt.date
|
|
441
|
+
temp_df["转股开始日期"] = pd.to_datetime(
|
|
442
|
+
temp_df["转股开始日期"], errors="coerce"
|
|
443
|
+
).dt.date
|
|
444
|
+
temp_df["转股终止日期"] = pd.to_datetime(
|
|
445
|
+
temp_df["转股终止日期"], errors="coerce"
|
|
446
|
+
).dt.date
|
|
447
|
+
temp_df["转股终止日期"] = pd.to_datetime(
|
|
448
|
+
temp_df["转股终止日期"], errors="coerce"
|
|
449
|
+
).dt.date
|
|
450
|
+
temp_df["网上申购日期"] = pd.to_datetime(
|
|
451
|
+
temp_df["网上申购日期"], errors="coerce"
|
|
452
|
+
).dt.date
|
|
453
|
+
temp_df["网上申购中签结果公告日及退款日"] = pd.to_datetime(
|
|
454
|
+
temp_df["网上申购中签结果公告日及退款日"], errors="coerce"
|
|
455
|
+
).dt.date
|
|
456
|
+
temp_df["债权登记日"] = pd.to_datetime(
|
|
457
|
+
temp_df["债权登记日"], errors="coerce"
|
|
458
|
+
).dt.date
|
|
459
|
+
temp_df["优先申购日"] = pd.to_datetime(
|
|
460
|
+
temp_df["优先申购日"], errors="coerce"
|
|
461
|
+
).dt.date
|
|
462
|
+
temp_df["优先申购缴款日"] = pd.to_datetime(
|
|
463
|
+
temp_df["优先申购缴款日"], errors="coerce"
|
|
464
|
+
).dt.date
|
|
431
465
|
temp_df["计划发行总量"] = pd.to_numeric(temp_df["计划发行总量"], errors="coerce")
|
|
432
466
|
temp_df["实际发行总量"] = pd.to_numeric(temp_df["实际发行总量"], errors="coerce")
|
|
433
467
|
temp_df["发行面值"] = pd.to_numeric(temp_df["发行面值"], errors="coerce")
|
|
434
468
|
temp_df["发行价格"] = pd.to_numeric(temp_df["发行价格"], errors="coerce")
|
|
435
469
|
temp_df["初始转股价格"] = pd.to_numeric(temp_df["初始转股价格"], errors="coerce")
|
|
436
|
-
temp_df["网上申购数量上限"] = pd.to_numeric(
|
|
437
|
-
|
|
470
|
+
temp_df["网上申购数量上限"] = pd.to_numeric(
|
|
471
|
+
temp_df["网上申购数量上限"], errors="coerce"
|
|
472
|
+
)
|
|
473
|
+
temp_df["网上申购数量下限"] = pd.to_numeric(
|
|
474
|
+
temp_df["网上申购数量下限"], errors="coerce"
|
|
475
|
+
)
|
|
438
476
|
temp_df["网上申购单位"] = pd.to_numeric(temp_df["网上申购单位"], errors="coerce")
|
|
439
477
|
temp_df["配售价格"] = pd.to_numeric(temp_df["配售价格"], errors="coerce")
|
|
440
478
|
return temp_df
|
|
@@ -464,7 +502,8 @@ def bond_cov_stock_issue_cninfo() -> pd.DataFrame:
|
|
|
464
502
|
"Pragma": "no-cache",
|
|
465
503
|
"Proxy-Connection": "keep-alive",
|
|
466
504
|
"Referer": "http://webapi.cninfo.com.cn/",
|
|
467
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
|
|
505
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
506
|
+
"Chrome/93.0.4577.63 Safari/537.36",
|
|
468
507
|
"X-Requested-With": "XMLHttpRequest",
|
|
469
508
|
}
|
|
470
509
|
r = requests.post(url, headers=headers)
|
|
@@ -500,8 +539,12 @@ def bond_cov_stock_issue_cninfo() -> pd.DataFrame:
|
|
|
500
539
|
]
|
|
501
540
|
]
|
|
502
541
|
temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
|
|
503
|
-
temp_df["自愿转换期起始日"] = pd.to_datetime(
|
|
504
|
-
|
|
542
|
+
temp_df["自愿转换期起始日"] = pd.to_datetime(
|
|
543
|
+
temp_df["自愿转换期起始日"], errors="coerce"
|
|
544
|
+
).dt.date
|
|
545
|
+
temp_df["自愿转换期终止日"] = pd.to_datetime(
|
|
546
|
+
temp_df["自愿转换期终止日"], errors="coerce"
|
|
547
|
+
).dt.date
|
|
505
548
|
temp_df["转股价格"] = pd.to_numeric(temp_df["转股价格"], errors="coerce")
|
|
506
549
|
return temp_df
|
|
507
550
|
|
akshare/bond/bond_zh_cov.py
CHANGED
akshare/bond/bond_zh_sina.py
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date: 2024/
|
|
4
|
+
Date: 2024/6/18 18:30
|
|
5
5
|
Desc: 新浪财经-债券-沪深债券-实时行情数据和历史行情数据
|
|
6
6
|
https://vip.stock.finance.sina.com.cn/mkt/#hs_z
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
import datetime
|
|
9
10
|
import re
|
|
10
11
|
|
|
11
12
|
import pandas as pd
|
|
12
13
|
import requests
|
|
13
|
-
|
|
14
|
+
import py_mini_racer
|
|
14
15
|
|
|
15
16
|
from akshare.bond.cons import (
|
|
16
17
|
zh_sina_bond_hs_count_url,
|
|
@@ -41,7 +42,7 @@ def get_zh_bond_hs_page_count() -> int:
|
|
|
41
42
|
return int(page_count) + 1
|
|
42
43
|
|
|
43
44
|
|
|
44
|
-
def bond_zh_hs_spot() -> pd.DataFrame:
|
|
45
|
+
def bond_zh_hs_spot(start_page: str = "1", end_page: str = "10") -> pd.DataFrame:
|
|
45
46
|
"""
|
|
46
47
|
新浪财经-债券-沪深债券-实时行情数据, 大量抓取容易封IP
|
|
47
48
|
https://vip.stock.finance.sina.com.cn/mkt/#hs_z
|
|
@@ -49,59 +50,64 @@ def bond_zh_hs_spot() -> pd.DataFrame:
|
|
|
49
50
|
:rtype: pandas.DataFrame
|
|
50
51
|
"""
|
|
51
52
|
page_count = get_zh_bond_hs_page_count()
|
|
53
|
+
page_count = int(page_count)
|
|
52
54
|
zh_sina_bond_hs_payload_copy = zh_sina_bond_hs_payload.copy()
|
|
53
55
|
tqdm = get_tqdm()
|
|
54
56
|
big_df = pd.DataFrame()
|
|
55
|
-
|
|
57
|
+
start_page = int(start_page)
|
|
58
|
+
end_page = int(end_page) + 1 if int(end_page) + 1 <= page_count else page_count
|
|
59
|
+
for page in tqdm(range(start_page, end_page), leave=False):
|
|
56
60
|
zh_sina_bond_hs_payload_copy.update({"page": page})
|
|
57
61
|
r = requests.get(zh_sina_bond_hs_url, params=zh_sina_bond_hs_payload_copy)
|
|
58
62
|
data_json = demjson.decode(r.text)
|
|
59
63
|
temp_df = pd.DataFrame(data_json)
|
|
60
64
|
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
|
|
61
65
|
big_df.columns = [
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
66
|
+
"代码",
|
|
67
|
+
"-",
|
|
68
|
+
"名称",
|
|
69
|
+
"最新价",
|
|
70
|
+
"涨跌额",
|
|
71
|
+
"涨跌幅",
|
|
72
|
+
"买入",
|
|
73
|
+
"卖出",
|
|
74
|
+
"昨收",
|
|
75
|
+
"今开",
|
|
76
|
+
"最高",
|
|
77
|
+
"最低",
|
|
78
|
+
"成交量",
|
|
79
|
+
"成交额",
|
|
80
|
+
"-",
|
|
81
|
+
"-",
|
|
82
|
+
"-",
|
|
83
|
+
"-",
|
|
84
|
+
"-",
|
|
85
|
+
"-",
|
|
86
|
+
]
|
|
87
|
+
big_df = big_df[
|
|
88
|
+
[
|
|
89
|
+
"代码",
|
|
90
|
+
"名称",
|
|
91
|
+
"最新价",
|
|
92
|
+
"涨跌额",
|
|
93
|
+
"涨跌幅",
|
|
94
|
+
"买入",
|
|
95
|
+
"卖出",
|
|
96
|
+
"昨收",
|
|
97
|
+
"今开",
|
|
98
|
+
"最高",
|
|
99
|
+
"最低",
|
|
100
|
+
"成交量",
|
|
101
|
+
"成交额",
|
|
102
|
+
]
|
|
82
103
|
]
|
|
83
|
-
big_df = big_df[
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
'卖出',
|
|
91
|
-
'昨收',
|
|
92
|
-
'今开',
|
|
93
|
-
'最高',
|
|
94
|
-
'最低',
|
|
95
|
-
'成交量',
|
|
96
|
-
'成交额',
|
|
97
|
-
]]
|
|
98
|
-
big_df['买入'] = pd.to_numeric(big_df['买入'], errors="coerce")
|
|
99
|
-
big_df['卖出'] = pd.to_numeric(big_df['卖出'], errors="coerce")
|
|
100
|
-
big_df['昨收'] = pd.to_numeric(big_df['昨收'], errors="coerce")
|
|
101
|
-
big_df['今开'] = pd.to_numeric(big_df['今开'], errors="coerce")
|
|
102
|
-
big_df['最高'] = pd.to_numeric(big_df['最高'], errors="coerce")
|
|
103
|
-
big_df['最低'] = pd.to_numeric(big_df['最低'], errors="coerce")
|
|
104
|
-
big_df['最新价'] = pd.to_numeric(big_df['最新价'], errors="coerce")
|
|
104
|
+
big_df["买入"] = pd.to_numeric(big_df["买入"], errors="coerce")
|
|
105
|
+
big_df["卖出"] = pd.to_numeric(big_df["卖出"], errors="coerce")
|
|
106
|
+
big_df["昨收"] = pd.to_numeric(big_df["昨收"], errors="coerce")
|
|
107
|
+
big_df["今开"] = pd.to_numeric(big_df["今开"], errors="coerce")
|
|
108
|
+
big_df["最高"] = pd.to_numeric(big_df["最高"], errors="coerce")
|
|
109
|
+
big_df["最低"] = pd.to_numeric(big_df["最低"], errors="coerce")
|
|
110
|
+
big_df["最新价"] = pd.to_numeric(big_df["最新价"], errors="coerce")
|
|
105
111
|
return big_df
|
|
106
112
|
|
|
107
113
|
|
|
@@ -126,15 +132,15 @@ def bond_zh_hs_daily(symbol: str = "sh010107") -> pd.DataFrame:
|
|
|
126
132
|
) # 执行 js 解密代码
|
|
127
133
|
data_df = pd.DataFrame(dict_list)
|
|
128
134
|
data_df["date"] = pd.to_datetime(data_df["date"], errors="coerce").dt.date
|
|
129
|
-
data_df[
|
|
130
|
-
data_df[
|
|
131
|
-
data_df[
|
|
132
|
-
data_df[
|
|
135
|
+
data_df["open"] = pd.to_numeric(data_df["open"], errors="coerce")
|
|
136
|
+
data_df["high"] = pd.to_numeric(data_df["high"], errors="coerce")
|
|
137
|
+
data_df["low"] = pd.to_numeric(data_df["low"], errors="coerce")
|
|
138
|
+
data_df["close"] = pd.to_numeric(data_df["close"], errors="coerce")
|
|
133
139
|
return data_df
|
|
134
140
|
|
|
135
141
|
|
|
136
142
|
if __name__ == "__main__":
|
|
137
|
-
bond_zh_hs_spot_df = bond_zh_hs_spot()
|
|
143
|
+
bond_zh_hs_spot_df = bond_zh_hs_spot(start_page="1", end_page="5")
|
|
138
144
|
print(bond_zh_hs_spot_df)
|
|
139
145
|
|
|
140
146
|
bond_zh_hs_daily_df = bond_zh_hs_daily(symbol="sh010107")
|
akshare/cal/__init__.py
ADDED
|
File without changes
|
akshare/cal/rv.py
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Yang-Zhang-s-Realized-Volatility-Automated-Estimation-in-Python
|
|
3
|
+
https://github.com/hugogobato/Yang-Zhang-s-Realized-Volatility-Automated-Estimation-in-Python
|
|
4
|
+
论文地址:https://www.jstor.org/stable/10.1086/209650
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import warnings
|
|
8
|
+
|
|
9
|
+
import numpy as np
|
|
10
|
+
import pandas as pd
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def rv_from_stock_zh_a_hist_min_em(
|
|
14
|
+
symbol="000001",
|
|
15
|
+
start_date="2021-10-20 09:30:00",
|
|
16
|
+
end_date="2024-11-01 15:00:00",
|
|
17
|
+
period="1",
|
|
18
|
+
adjust="hfq",
|
|
19
|
+
) -> pd.DataFrame:
|
|
20
|
+
"""
|
|
21
|
+
从东方财富网获取股票的分钟级历史行情数据,并进行数据清洗和格式化为计算 yz 已实现波动率所需的数据格式
|
|
22
|
+
https://quote.eastmoney.com/concept/sh603777.html?from=classic
|
|
23
|
+
:param symbol: 股票代码,如"000001"
|
|
24
|
+
:type symbol: str
|
|
25
|
+
:param start_date: 开始日期时间,格式"YYYY-MM-DD HH:MM:SS"
|
|
26
|
+
:type start_date: str
|
|
27
|
+
:param end_date: 结束日期时间,格式"YYYY-MM-DD HH:MM:SS"
|
|
28
|
+
:type end_date: str
|
|
29
|
+
:param period: 时间周期,可选{'1','5','15','30','60'}分钟
|
|
30
|
+
:type period: str
|
|
31
|
+
:param adjust: 复权方式,可选{'','qfq'(前复权),'hfq'(后复权)}
|
|
32
|
+
:type adjust: str
|
|
33
|
+
:return: 整理后的分钟行情数据,包含Date(索引),Open,High,Low,Close列
|
|
34
|
+
:rtype: pandas.DataFrame
|
|
35
|
+
"""
|
|
36
|
+
from akshare.stock_feature.stock_hist_em import stock_zh_a_hist_min_em
|
|
37
|
+
|
|
38
|
+
temp_df = stock_zh_a_hist_min_em(
|
|
39
|
+
symbol=symbol,
|
|
40
|
+
start_date=start_date,
|
|
41
|
+
end_date=end_date,
|
|
42
|
+
period=period,
|
|
43
|
+
adjust=adjust,
|
|
44
|
+
)
|
|
45
|
+
temp_df.rename(
|
|
46
|
+
columns={
|
|
47
|
+
"时间": "Date",
|
|
48
|
+
"开盘": "Open",
|
|
49
|
+
"最高": "High",
|
|
50
|
+
"最低": "Low",
|
|
51
|
+
"收盘": "Close",
|
|
52
|
+
},
|
|
53
|
+
inplace=True,
|
|
54
|
+
)
|
|
55
|
+
temp_df = temp_df[temp_df["Open"] != 0]
|
|
56
|
+
temp_df["Date"] = pd.to_datetime(temp_df["Date"])
|
|
57
|
+
temp_df.set_index(keys="Date", inplace=True)
|
|
58
|
+
return temp_df
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def rv_from_futures_zh_minute_sina(
|
|
62
|
+
symbol: str = "IF2008", period: str = "5"
|
|
63
|
+
) -> pd.DataFrame:
|
|
64
|
+
"""
|
|
65
|
+
从新浪财经获取期货的分钟级历史行情数据,并进行数据清洗和格式化
|
|
66
|
+
https://vip.stock.finance.sina.com.cn/quotes_service/view/qihuohangqing.html#titlePos_3
|
|
67
|
+
:param symbol: 期货合约代码,如"IF2008"代表沪深300期货2020年8月合约
|
|
68
|
+
:type symbol: str
|
|
69
|
+
:param period: 时间周期,可选{'1','5','15','30','60'}分钟
|
|
70
|
+
:type period: str
|
|
71
|
+
:return: 整理后的分钟行情数据,包含Date(索引),Open,High,Low,Close列
|
|
72
|
+
:rtype: pandas.DataFrame
|
|
73
|
+
"""
|
|
74
|
+
from akshare.futures.futures_zh_sina import futures_zh_minute_sina
|
|
75
|
+
|
|
76
|
+
temp_df = futures_zh_minute_sina(symbol=symbol, period=period)
|
|
77
|
+
temp_df.rename(
|
|
78
|
+
columns={
|
|
79
|
+
"datetime": "Date",
|
|
80
|
+
"open": "Open",
|
|
81
|
+
"high": "High",
|
|
82
|
+
"low": "Low",
|
|
83
|
+
"close": "Close",
|
|
84
|
+
},
|
|
85
|
+
inplace=True,
|
|
86
|
+
)
|
|
87
|
+
temp_df["Date"] = pd.to_datetime(temp_df["Date"])
|
|
88
|
+
temp_df.set_index(keys="Date", inplace=True)
|
|
89
|
+
return temp_df
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def volatility_yz_rv(data: pd.DataFrame) -> pd.DataFrame:
|
|
93
|
+
"""
|
|
94
|
+
波动率-已实现波动率-Yang-Zhang 已实现波动率(Yang-Zhang Realized Volatility)
|
|
95
|
+
https://github.com/hugogobato/Yang-Zhang-s-Realized-Volatility-Automated-Estimation-in-Python
|
|
96
|
+
论文地址:https://www.jstor.org/stable/10.1086/209650
|
|
97
|
+
基于以下公式计算:
|
|
98
|
+
RV^2 = Vo + k*Vc + (1-k)*Vrs
|
|
99
|
+
其中:
|
|
100
|
+
- Vo: 隔夜波动率, Vo = 1/(n-1)*sum(Oi-Obar)^2
|
|
101
|
+
Oi为标准化开盘价, Obar为标准化开盘价均值
|
|
102
|
+
- Vc: 收盘波动率, Vc = 1/(n-1)*sum(ci-Cbar)^2
|
|
103
|
+
ci为标准化收盘价, Cbar为标准化收盘价均值
|
|
104
|
+
- k: 权重系数, k = 0.34/(1.34+(n+1)/(n-1))
|
|
105
|
+
n为样本数量
|
|
106
|
+
- Vrs: Rogers-Satchell波动率代理, Vrs = ui(ui-ci)+di(di-ci)
|
|
107
|
+
ui = ln(Hi/Oi), ci = ln(Ci/Oi), di = ln(Li/Oi), oi = ln(Oi/Ci-1)
|
|
108
|
+
Hi/Li/Ci/Oi分别为最高价/最低价/收盘价/开盘价
|
|
109
|
+
|
|
110
|
+
:param data: 包含 OHLC(开高低收) 价格的 pandas.DataFrame
|
|
111
|
+
:type data: pandas.DataFrame
|
|
112
|
+
:return: 包含 Yang-Zhang 实现波动率的 pandas.DataFrame
|
|
113
|
+
:rtype: pandas.DataFrame
|
|
114
|
+
|
|
115
|
+
要求输入数据包含以下列:
|
|
116
|
+
- Open: 开盘价
|
|
117
|
+
- High: 最高价
|
|
118
|
+
- Low: 最低价
|
|
119
|
+
- Close: 收盘价
|
|
120
|
+
# yang_zhang_rv formula is give as:
|
|
121
|
+
# RV^2 = Vo + k*Vc + (1-k)*Vrs
|
|
122
|
+
# where Vo = 1/(n-1)*sum(Oi-Obar)^2
|
|
123
|
+
# with oi = normalized opening price at time t and Obar = mean of normalized opening prices
|
|
124
|
+
# Vc = = 1/(n-1)*sum(ci-Cbar)^2
|
|
125
|
+
# with ci = normalized close price at time t and Cbar = mean of normalized close prices
|
|
126
|
+
# k = 0.34/(1.34+(n+1)/(n-1))
|
|
127
|
+
# with n = total number of days or time periods considered
|
|
128
|
+
# Vrs (Rogers & Satchell RV proxy) = ui(ui-ci)+di(di-ci)
|
|
129
|
+
# with ui = ln(Hi/Oi), ci = ln(Ci/Oi), di=(Li/Oi), oi = ln(Oi/Ci-1)
|
|
130
|
+
# where Hi = high price at time t and Li = low price at time t
|
|
131
|
+
""" ""
|
|
132
|
+
warnings.filterwarnings("ignore")
|
|
133
|
+
|
|
134
|
+
data["ui"] = np.log(np.divide(data["High"][1:], data["Open"][1:]))
|
|
135
|
+
data["ci"] = np.log(np.divide(data["Close"][1:], data["Open"][1:]))
|
|
136
|
+
data["di"] = np.log(np.divide(data["Low"][1:], data["Open"][1:]))
|
|
137
|
+
data["oi"] = np.log(np.divide(data["Open"][1:], data["Close"][: len(data) - 1]))
|
|
138
|
+
data = data[1:]
|
|
139
|
+
data["RS"] = data["ui"] * (data["ui"] - data["ci"]) + data["di"] * (
|
|
140
|
+
data["di"] - data["ci"]
|
|
141
|
+
)
|
|
142
|
+
rs_var = data["RS"].groupby(pd.Grouper(freq="1D")).mean().dropna()
|
|
143
|
+
vc_and_vo = data[["oi", "ci"]].groupby(pd.Grouper(freq="1D")).var().dropna()
|
|
144
|
+
n = int(len(data) / len(rs_var))
|
|
145
|
+
k = 0.34 / (1.34 + (n + 1) / (n - 1))
|
|
146
|
+
yang_zhang_rv = np.sqrt((1 - k) * rs_var + vc_and_vo["oi"] + vc_and_vo["ci"] * k)
|
|
147
|
+
yang_zhang_rv_df = pd.DataFrame(yang_zhang_rv)
|
|
148
|
+
yang_zhang_rv_df.rename(columns={0: "yz_rv"}, inplace=True)
|
|
149
|
+
yang_zhang_rv_df.reset_index(inplace=True)
|
|
150
|
+
yang_zhang_rv_df.columns = ["date", "rv"]
|
|
151
|
+
yang_zhang_rv_df["date"] = pd.to_datetime(
|
|
152
|
+
yang_zhang_rv_df["date"], errors="coerce"
|
|
153
|
+
).dt.date
|
|
154
|
+
return yang_zhang_rv_df
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
if __name__ == "__main__":
|
|
158
|
+
futures_df = rv_from_futures_zh_minute_sina(symbol="IF2008", period="1")
|
|
159
|
+
volatility_yz_rv_df = volatility_yz_rv(data=futures_df)
|
|
160
|
+
print(volatility_yz_rv_df)
|
|
161
|
+
|
|
162
|
+
stock_df = rv_from_stock_zh_a_hist_min_em(
|
|
163
|
+
symbol="000001",
|
|
164
|
+
start_date="2021-10-20 09:30:00",
|
|
165
|
+
end_date="2024-11-01 15:00:00",
|
|
166
|
+
period="5",
|
|
167
|
+
adjust="",
|
|
168
|
+
)
|
|
169
|
+
volatility_yz_rv_df = volatility_yz_rv(data=stock_df)
|
|
170
|
+
print(volatility_yz_rv_df)
|
akshare/cost/cost_living.py
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date: 2024/
|
|
4
|
+
Date: 2024/8/28 15:20
|
|
5
5
|
Desc: 世界各大城市生活成本数据
|
|
6
6
|
https://expatistan.com/cost-of-living/index
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
from io import StringIO
|
|
9
10
|
|
|
10
11
|
import pandas as pd
|
|
@@ -20,14 +21,14 @@ def _get_region() -> dict:
|
|
|
20
21
|
"""
|
|
21
22
|
url = "https://www.expatistan.com/cost-of-living/index"
|
|
22
23
|
r = requests.get(url)
|
|
23
|
-
soup = BeautifulSoup(r.text, "lxml")
|
|
24
|
+
soup = BeautifulSoup(r.text, features="lxml")
|
|
24
25
|
half_url_list = [
|
|
25
26
|
item["href"]
|
|
26
|
-
for item in soup.find("ul", attrs={"class": "regions"}).find_all("a")
|
|
27
|
+
for item in soup.find(name="ul", attrs={"class": "regions"}).find_all("a")
|
|
27
28
|
]
|
|
28
29
|
name_list = [
|
|
29
30
|
item["href"].split("/")[-1]
|
|
30
|
-
for item in soup.find("ul", attrs={"class": "regions"}).find_all("a")
|
|
31
|
+
for item in soup.find(name="ul", attrs={"class": "regions"}).find_all("a")
|
|
31
32
|
]
|
|
32
33
|
name_url_dict = dict(zip(name_list, half_url_list))
|
|
33
34
|
name_url_dict["world"] = "/cost-of-living/index"
|
|
@@ -38,7 +39,8 @@ def cost_living(symbol: str = "world") -> pd.DataFrame:
|
|
|
38
39
|
"""
|
|
39
40
|
国家或地区生活成本数据
|
|
40
41
|
https://expatistan.com/cost-of-living/index
|
|
41
|
-
:param symbol: choice of {"europe", "north-america", "latin-america",
|
|
42
|
+
:param symbol: choice of {"europe", "north-america", "latin-america",
|
|
43
|
+
"asia", "middle-east", "africa", "oceania", "world"}
|
|
42
44
|
:type symbol: str
|
|
43
45
|
:return: 国家或地区生活成本数据
|
|
44
46
|
:rtype: pandas.DataFrame
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
# -*- coding:utf-8 -*-
|
|
2
2
|
# !/usr/bin/env python
|
|
3
3
|
"""
|
|
4
|
-
Date:
|
|
4
|
+
Date: 2024/4/29 17:00
|
|
5
5
|
Desc: 人民币汇率中间价
|
|
6
6
|
https://www.safe.gov.cn/safe/rmbhlzjj/index.html
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
import re
|
|
9
10
|
from datetime import datetime
|
|
10
11
|
from io import StringIO
|
|
@@ -24,11 +25,11 @@ def currency_boc_safe() -> pd.DataFrame:
|
|
|
24
25
|
url = "https://www.safe.gov.cn/safe/2020/1218/17833.html"
|
|
25
26
|
r = requests.get(url)
|
|
26
27
|
r.encoding = "utf8"
|
|
27
|
-
soup = BeautifulSoup(r.text, "lxml")
|
|
28
|
-
content = soup.find("a", string=re.compile("人民币汇率"))["href"]
|
|
28
|
+
soup = BeautifulSoup(r.text, features="lxml")
|
|
29
|
+
content = soup.find(name="a", string=re.compile("人民币汇率"))["href"]
|
|
29
30
|
url = f"https://www.safe.gov.cn{content}"
|
|
30
31
|
temp_df = pd.read_excel(url)
|
|
31
|
-
temp_df.sort_values(["日期"], inplace=True)
|
|
32
|
+
temp_df.sort_values(by=["日期"], inplace=True)
|
|
32
33
|
temp_df.reset_index(inplace=True, drop=True)
|
|
33
34
|
start_date = (
|
|
34
35
|
(pd.Timestamp(temp_df["日期"].tolist()[-1]) + pd.Timedelta(days=1))
|
|
@@ -44,9 +45,9 @@ def currency_boc_safe() -> pd.DataFrame:
|
|
|
44
45
|
}
|
|
45
46
|
r = requests.post(url, data=payload)
|
|
46
47
|
current_temp_df = pd.read_html(StringIO(r.text))[-1]
|
|
47
|
-
current_temp_df.sort_values(["日期"], inplace=True)
|
|
48
|
+
current_temp_df.sort_values(by=["日期"], inplace=True)
|
|
48
49
|
current_temp_df.reset_index(inplace=True, drop=True)
|
|
49
|
-
big_df = pd.concat([temp_df, current_temp_df], ignore_index=True)
|
|
50
|
+
big_df = pd.concat(objs=[temp_df, current_temp_df], ignore_index=True)
|
|
50
51
|
column_name_list = big_df.columns[1:]
|
|
51
52
|
for item in column_name_list:
|
|
52
53
|
big_df[item] = pd.to_numeric(big_df[item], errors="coerce")
|
akshare/data/cninfo.js
CHANGED
|
@@ -5998,4 +5998,19 @@ function my_decode(data) {
|
|
|
5998
5998
|
}
|
|
5999
5999
|
);
|
|
6000
6000
|
return encrypted.toString(CryptoJS.enc.Utf8);
|
|
6001
|
+
}
|
|
6002
|
+
|
|
6003
|
+
function new_my_decode(data) {
|
|
6004
|
+
let key = CryptoJS.enc.Utf8.parse('bieyanjiulexixishuibatoufameill1'); // 密钥需要是32字节,这里可能需要调整
|
|
6005
|
+
let iv = CryptoJS.enc.Utf8.parse('nengnongchulainbl1'); // 向量通常是16字节
|
|
6006
|
+
let decrypted = CryptoJS.AES.decrypt(
|
|
6007
|
+
data,
|
|
6008
|
+
key,
|
|
6009
|
+
{
|
|
6010
|
+
iv: iv,
|
|
6011
|
+
mode: CryptoJS.mode.CBC,
|
|
6012
|
+
padding: CryptoJS.pad.Pkcs7
|
|
6013
|
+
}
|
|
6014
|
+
);
|
|
6015
|
+
return decrypted.toString(CryptoJS.enc.Utf8);
|
|
6001
6016
|
}
|