akshare 1.12.99__py3-none-any.whl → 1.15.72__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 +441 -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.72.dist-info}/METADATA +52 -69
- akshare-1.15.72.dist-info/RECORD +385 -0
- {akshare-1.12.99.dist-info → akshare-1.15.72.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.72.dist-info}/LICENSE +0 -0
- {akshare-1.12.99.dist-info → akshare-1.15.72.dist-info}/top_level.txt +0 -0
|
@@ -1,56 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date: 2024/
|
|
5
|
-
Desc:
|
|
6
|
-
|
|
7
|
-
汽车行业制造企业数据库
|
|
8
|
-
https://i.gasgoo.com/data/ranking
|
|
4
|
+
Date: 2024/4/3 19:00
|
|
5
|
+
Desc: 汽车行业制造企业数据库
|
|
6
|
+
http://i.gasgoo.com/data/ranking
|
|
9
7
|
"""
|
|
8
|
+
|
|
10
9
|
import pandas as pd
|
|
11
10
|
import requests
|
|
12
11
|
|
|
13
12
|
from akshare.utils import demjson
|
|
14
13
|
|
|
15
14
|
|
|
16
|
-
def
|
|
17
|
-
"""
|
|
18
|
-
乘联会-新能源细分市场-整体市场
|
|
19
|
-
https://data.cpcaauto.com/FuelMarket
|
|
20
|
-
:return: 新能源细分市场-整体市场
|
|
21
|
-
:rtype: pandas.DataFrame
|
|
22
|
-
"""
|
|
23
|
-
url = "http://data.cpcaauto.com/api/chartlist"
|
|
24
|
-
params = {"charttype": "6"}
|
|
25
|
-
r = requests.get(url, params=params)
|
|
26
|
-
data_json = r.json()
|
|
27
|
-
temp_df = pd.DataFrame(data_json[0]["dataList"])
|
|
28
|
-
temp_current_year_list = []
|
|
29
|
-
temp_previous_year_list = []
|
|
30
|
-
for item in data_json[0]["dataList"]:
|
|
31
|
-
temp_previous_year_list.append(item[temp_df.columns[2]])
|
|
32
|
-
try:
|
|
33
|
-
temp_current_year_list.append(item[temp_df.columns[1]])
|
|
34
|
-
except:
|
|
35
|
-
continue
|
|
36
|
-
temp_current_year_df = pd.DataFrame(temp_current_year_list)
|
|
37
|
-
temp_previous_year_df = pd.DataFrame(temp_previous_year_list)
|
|
38
|
-
big_df = pd.DataFrame(
|
|
39
|
-
[temp_current_year_df.iloc[:, 2], temp_previous_year_df.iloc[:, 2]]
|
|
40
|
-
).T
|
|
41
|
-
big_df.columns = [temp_df.columns[1], temp_df.columns[2]]
|
|
42
|
-
big_df["月份"] = temp_df["month"]
|
|
43
|
-
big_df = big_df[
|
|
44
|
-
[
|
|
45
|
-
"月份",
|
|
46
|
-
temp_df.columns[2],
|
|
47
|
-
temp_df.columns[1],
|
|
48
|
-
]
|
|
49
|
-
]
|
|
50
|
-
return big_df
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
def car_gasgoo_sale_rank(symbol: str = "车企榜", date: str = "202109") -> pd.DataFrame:
|
|
15
|
+
def car_sale_rank_gasgoo(symbol: str = "车企榜", date: str = "202109") -> pd.DataFrame:
|
|
54
16
|
"""
|
|
55
17
|
盖世汽车-汽车行业制造企业数据库-销量数据
|
|
56
18
|
https://i.gasgoo.com/data/ranking
|
|
@@ -88,7 +50,8 @@ def car_gasgoo_sale_rank(symbol: str = "车企榜", date: str = "202109") -> pd.
|
|
|
88
50
|
"Connection": "keep-alive",
|
|
89
51
|
"Content-Length": "195",
|
|
90
52
|
"Content-Type": "application/json; charset=UTF-8",
|
|
91
|
-
"Cookie": "Hm_lvt_8e90480b1bf68ede548c407057660718=1636981448; _ga=GA1.2.858318653.1636981449;
|
|
53
|
+
"Cookie": "Hm_lvt_8e90480b1bf68ede548c407057660718=1636981448; _ga=GA1.2.858318653.1636981449; "
|
|
54
|
+
"_gid=GA1.2.1448165285.1636981449; _gat=1; Hm_lpvt_8e90480b1bf68ede548c407057660718=1636982578",
|
|
92
55
|
"Host": "i.gasgoo.com",
|
|
93
56
|
"Origin": "https://i.gasgoo.com",
|
|
94
57
|
"Pragma": "no-cache",
|
|
@@ -99,7 +62,8 @@ def car_gasgoo_sale_rank(symbol: str = "车企榜", date: str = "202109") -> pd.
|
|
|
99
62
|
"Sec-Fetch-Dest": "empty",
|
|
100
63
|
"Sec-Fetch-Mode": "cors",
|
|
101
64
|
"Sec-Fetch-Site": "same-origin",
|
|
102
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
|
|
65
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
66
|
+
"Chrome/95.0.4638.69 Safari/537.36",
|
|
103
67
|
"X-Requested-With": "XMLHttpRequest",
|
|
104
68
|
}
|
|
105
69
|
r = requests.post(url, json=payload, headers=headers)
|
|
@@ -110,14 +74,11 @@ def car_gasgoo_sale_rank(symbol: str = "车企榜", date: str = "202109") -> pd.
|
|
|
110
74
|
|
|
111
75
|
|
|
112
76
|
if __name__ == "__main__":
|
|
113
|
-
|
|
114
|
-
print(
|
|
115
|
-
|
|
116
|
-
car_gasgoo_sale_rank_df = car_gasgoo_sale_rank(symbol="品牌榜", date="202311")
|
|
117
|
-
print(car_gasgoo_sale_rank_df)
|
|
77
|
+
car_sale_rank_gasgoo_df = car_sale_rank_gasgoo(symbol="品牌榜", date="202311")
|
|
78
|
+
print(car_sale_rank_gasgoo_df)
|
|
118
79
|
|
|
119
|
-
|
|
120
|
-
print(
|
|
80
|
+
car_sale_rank_gasgoo_df = car_sale_rank_gasgoo(symbol="车型榜", date="202311")
|
|
81
|
+
print(car_sale_rank_gasgoo_df)
|
|
121
82
|
|
|
122
|
-
|
|
123
|
-
print(
|
|
83
|
+
car_sale_rank_gasgoo_df = car_sale_rank_gasgoo(symbol="车企榜", date="202311")
|
|
84
|
+
print(car_sale_rank_gasgoo_df)
|
akshare/qdii/__init__.py
ADDED
|
File without changes
|
akshare/qdii/qdii_jsl.py
ADDED
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding:utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
Date: 2024/10/6 17:00
|
|
5
|
+
Desc: 集思录-T+0 QDII
|
|
6
|
+
集思录:https://www.jisilu.cn/data/qdii/#qdiie
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import pandas as pd
|
|
10
|
+
|
|
11
|
+
from akshare.request import make_request_with_retry_json
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def qdii_e_index_jsl() -> pd.DataFrame:
|
|
15
|
+
"""
|
|
16
|
+
集思录-T+0 QDII-欧美市场-欧美指数
|
|
17
|
+
https://www.jisilu.cn/data/qdii/#qdiia
|
|
18
|
+
:return: T+0 QDII-亚洲市场
|
|
19
|
+
:rtype: pandas.DataFrame
|
|
20
|
+
"""
|
|
21
|
+
url = "https://www.jisilu.cn/data/qdii/qdii_list/E"
|
|
22
|
+
params = {
|
|
23
|
+
"___jsl": "LST___t=1728207798534",
|
|
24
|
+
"rp": "22",
|
|
25
|
+
}
|
|
26
|
+
data_json = make_request_with_retry_json(url, params)
|
|
27
|
+
temp_df = pd.DataFrame([item["cell"] for item in data_json["rows"]])
|
|
28
|
+
temp_df.rename(
|
|
29
|
+
columns={
|
|
30
|
+
"fund_id": "代码",
|
|
31
|
+
"fund_nm": "名称",
|
|
32
|
+
"price": "现价",
|
|
33
|
+
"increase_rt": "涨幅",
|
|
34
|
+
"volume": "成交",
|
|
35
|
+
"amount": "场内份额",
|
|
36
|
+
"amount_incr": "场内新增",
|
|
37
|
+
"fund_nav": "T-2净值",
|
|
38
|
+
"nav_dt": "净值日期",
|
|
39
|
+
"estimate_value": "T-1估值",
|
|
40
|
+
"last_est_dt": "估值日期",
|
|
41
|
+
"discount_rt": "T-1溢价率",
|
|
42
|
+
"index_nm": "相关标的",
|
|
43
|
+
"ref_increase_rt": "T-1指数涨幅",
|
|
44
|
+
"apply_fee": "申购费",
|
|
45
|
+
"redeem_fee": "赎回费",
|
|
46
|
+
"mt_fee": "托管费",
|
|
47
|
+
"issuer_nm": "基金公司",
|
|
48
|
+
},
|
|
49
|
+
inplace=True,
|
|
50
|
+
)
|
|
51
|
+
temp_df = temp_df[
|
|
52
|
+
[
|
|
53
|
+
"代码",
|
|
54
|
+
"名称",
|
|
55
|
+
"现价",
|
|
56
|
+
"涨幅",
|
|
57
|
+
"成交",
|
|
58
|
+
"场内份额",
|
|
59
|
+
"场内新增",
|
|
60
|
+
"T-2净值",
|
|
61
|
+
"净值日期",
|
|
62
|
+
"T-1估值",
|
|
63
|
+
"估值日期",
|
|
64
|
+
"T-1溢价率",
|
|
65
|
+
"相关标的",
|
|
66
|
+
"T-1指数涨幅",
|
|
67
|
+
"申购费",
|
|
68
|
+
"赎回费",
|
|
69
|
+
"托管费",
|
|
70
|
+
"基金公司",
|
|
71
|
+
]
|
|
72
|
+
]
|
|
73
|
+
temp_df["净值日期"] = pd.to_datetime(temp_df["净值日期"], errors="coerce").dt.date
|
|
74
|
+
temp_df["估值日期"] = pd.to_datetime(temp_df["估值日期"], errors="coerce").dt.date
|
|
75
|
+
temp_df["现价"] = pd.to_numeric(temp_df["现价"], errors="coerce")
|
|
76
|
+
temp_df["成交"] = pd.to_numeric(temp_df["成交"], errors="coerce")
|
|
77
|
+
temp_df["场内份额"] = pd.to_numeric(temp_df["场内份额"], errors="coerce")
|
|
78
|
+
temp_df["场内新增"] = pd.to_numeric(temp_df["场内新增"], errors="coerce")
|
|
79
|
+
temp_df["T-2净值"] = pd.to_numeric(temp_df["T-2净值"], errors="coerce")
|
|
80
|
+
temp_df["T-1估值"] = pd.to_numeric(temp_df["T-1估值"], errors="coerce")
|
|
81
|
+
temp_df["托管费"] = pd.to_numeric(temp_df["托管费"], errors="coerce")
|
|
82
|
+
return temp_df
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def qdii_e_comm_jsl() -> pd.DataFrame:
|
|
86
|
+
"""
|
|
87
|
+
集思录-T+0 QDII-欧美市场-商品
|
|
88
|
+
https://www.jisilu.cn/data/qdii/#qdiia
|
|
89
|
+
:return: T+0 QDII-欧美市场-商品
|
|
90
|
+
:rtype: pandas.DataFrame
|
|
91
|
+
"""
|
|
92
|
+
url = "https://www.jisilu.cn/data/qdii/qdii_list/C"
|
|
93
|
+
params = {
|
|
94
|
+
"___jsl": "LST___t=1728207798534",
|
|
95
|
+
"rp": "22",
|
|
96
|
+
}
|
|
97
|
+
data_json = make_request_with_retry_json(url, params=params)
|
|
98
|
+
temp_df = pd.DataFrame([item["cell"] for item in data_json["rows"]])
|
|
99
|
+
temp_df.rename(
|
|
100
|
+
columns={
|
|
101
|
+
"fund_id": "代码",
|
|
102
|
+
"fund_nm": "名称",
|
|
103
|
+
"price": "现价",
|
|
104
|
+
"increase_rt": "涨幅",
|
|
105
|
+
"volume": "成交",
|
|
106
|
+
"amount": "场内份额",
|
|
107
|
+
"amount_incr": "场内新增",
|
|
108
|
+
"fund_nav": "T-2净值",
|
|
109
|
+
"nav_dt": "净值日期",
|
|
110
|
+
"estimate_value": "T-1估值",
|
|
111
|
+
"last_est_dt": "估值日期",
|
|
112
|
+
"discount_rt": "T-1溢价率",
|
|
113
|
+
"index_nm": "相关标的",
|
|
114
|
+
"ref_increase_rt": "T-1指数涨幅",
|
|
115
|
+
"apply_fee": "申购费",
|
|
116
|
+
"redeem_fee": "赎回费",
|
|
117
|
+
"mt_fee": "托管费",
|
|
118
|
+
"issuer_nm": "基金公司",
|
|
119
|
+
},
|
|
120
|
+
inplace=True,
|
|
121
|
+
)
|
|
122
|
+
temp_df = temp_df[
|
|
123
|
+
[
|
|
124
|
+
"代码",
|
|
125
|
+
"名称",
|
|
126
|
+
"现价",
|
|
127
|
+
"涨幅",
|
|
128
|
+
"成交",
|
|
129
|
+
"场内份额",
|
|
130
|
+
"场内新增",
|
|
131
|
+
"T-2净值",
|
|
132
|
+
"净值日期",
|
|
133
|
+
"T-1估值",
|
|
134
|
+
"估值日期",
|
|
135
|
+
"T-1溢价率",
|
|
136
|
+
"相关标的",
|
|
137
|
+
"T-1指数涨幅",
|
|
138
|
+
"申购费",
|
|
139
|
+
"赎回费",
|
|
140
|
+
"托管费",
|
|
141
|
+
"基金公司",
|
|
142
|
+
]
|
|
143
|
+
]
|
|
144
|
+
temp_df["净值日期"] = pd.to_datetime(temp_df["净值日期"], errors="coerce").dt.date
|
|
145
|
+
temp_df["估值日期"] = pd.to_datetime(temp_df["估值日期"], errors="coerce").dt.date
|
|
146
|
+
temp_df["现价"] = pd.to_numeric(temp_df["现价"], errors="coerce")
|
|
147
|
+
temp_df["成交"] = pd.to_numeric(temp_df["成交"], errors="coerce")
|
|
148
|
+
temp_df["场内份额"] = pd.to_numeric(temp_df["场内份额"], errors="coerce")
|
|
149
|
+
temp_df["场内新增"] = pd.to_numeric(temp_df["场内新增"], errors="coerce")
|
|
150
|
+
temp_df["T-2净值"] = pd.to_numeric(temp_df["T-2净值"], errors="coerce")
|
|
151
|
+
temp_df["T-1估值"] = pd.to_numeric(temp_df["T-1估值"], errors="coerce")
|
|
152
|
+
temp_df["托管费"] = pd.to_numeric(temp_df["托管费"], errors="coerce")
|
|
153
|
+
return temp_df
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def qdii_a_index_jsl() -> pd.DataFrame:
|
|
157
|
+
"""
|
|
158
|
+
集思录-T+0 QDII-亚洲市场-亚洲指数
|
|
159
|
+
https://www.jisilu.cn/data/qdii/#qdiia
|
|
160
|
+
:return: T+0 QDII-亚洲市场-亚洲指数
|
|
161
|
+
:rtype: pandas.DataFrame
|
|
162
|
+
"""
|
|
163
|
+
url = "https://www.jisilu.cn/data/qdii/qdii_list/A"
|
|
164
|
+
params = {
|
|
165
|
+
"___jsl": "LST___t=1728206439242",
|
|
166
|
+
"rp": "22",
|
|
167
|
+
}
|
|
168
|
+
data_json = make_request_with_retry_json(url, params=params)
|
|
169
|
+
temp_df = pd.DataFrame([item["cell"] for item in data_json["rows"]])
|
|
170
|
+
temp_df.rename(
|
|
171
|
+
columns={
|
|
172
|
+
"fund_id": "代码",
|
|
173
|
+
"fund_nm": "名称",
|
|
174
|
+
"price": "现价",
|
|
175
|
+
"increase_rt": "涨幅",
|
|
176
|
+
"volume": "成交",
|
|
177
|
+
"amount": "场内份额",
|
|
178
|
+
"amount_incr": "场内新增",
|
|
179
|
+
"fund_nav": "净值",
|
|
180
|
+
"nav_dt": "净值日期",
|
|
181
|
+
"estimate_value": "估值",
|
|
182
|
+
"discount_rt": "溢价率",
|
|
183
|
+
"index_nm": "相关标的",
|
|
184
|
+
"ref_increase_rt": "指数涨幅",
|
|
185
|
+
"apply_fee": "申购费",
|
|
186
|
+
"redeem_fee": "赎回费",
|
|
187
|
+
"mt_fee": "托管费",
|
|
188
|
+
"issuer_nm": "基金公司",
|
|
189
|
+
},
|
|
190
|
+
inplace=True,
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
temp_df = temp_df[
|
|
194
|
+
[
|
|
195
|
+
"代码",
|
|
196
|
+
"名称",
|
|
197
|
+
"现价",
|
|
198
|
+
"涨幅",
|
|
199
|
+
"成交",
|
|
200
|
+
"场内份额",
|
|
201
|
+
"场内新增",
|
|
202
|
+
"净值",
|
|
203
|
+
"净值日期",
|
|
204
|
+
"估值",
|
|
205
|
+
"溢价率",
|
|
206
|
+
"相关标的",
|
|
207
|
+
"指数涨幅",
|
|
208
|
+
"申购费",
|
|
209
|
+
"赎回费",
|
|
210
|
+
"托管费",
|
|
211
|
+
"基金公司",
|
|
212
|
+
]
|
|
213
|
+
]
|
|
214
|
+
temp_df["净值日期"] = pd.to_datetime(temp_df["净值日期"], errors="coerce").dt.date
|
|
215
|
+
temp_df["现价"] = pd.to_numeric(temp_df["现价"], errors="coerce")
|
|
216
|
+
temp_df["成交"] = pd.to_numeric(temp_df["成交"], errors="coerce")
|
|
217
|
+
temp_df["场内份额"] = pd.to_numeric(temp_df["场内份额"], errors="coerce")
|
|
218
|
+
temp_df["场内新增"] = pd.to_numeric(temp_df["场内新增"], errors="coerce")
|
|
219
|
+
temp_df["净值"] = pd.to_numeric(temp_df["净值"], errors="coerce")
|
|
220
|
+
temp_df["估值"] = pd.to_numeric(temp_df["估值"], errors="coerce")
|
|
221
|
+
temp_df["托管费"] = pd.to_numeric(temp_df["托管费"], errors="coerce")
|
|
222
|
+
return temp_df
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
if __name__ == "__main__":
|
|
226
|
+
qdii_e_index_jsl_df = qdii_e_index_jsl()
|
|
227
|
+
print(qdii_e_index_jsl_df)
|
|
228
|
+
|
|
229
|
+
qdii_e_comm_jsl_df = qdii_e_comm_jsl()
|
|
230
|
+
print(qdii_e_comm_jsl_df)
|
|
231
|
+
|
|
232
|
+
qdii_a_index_jsl_df = qdii_a_index_jsl()
|
|
233
|
+
print(qdii_a_index_jsl_df)
|
akshare/request.py
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import time
|
|
2
|
+
|
|
3
|
+
import requests
|
|
4
|
+
from requests.exceptions import RequestException
|
|
5
|
+
|
|
6
|
+
from akshare.exceptions import NetworkError, APIError, RateLimitError, DataParsingError
|
|
7
|
+
from akshare.utils.context import config
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def make_request_with_retry_json(
|
|
11
|
+
url, params=None, headers=None, proxies=None, max_retries=3, retry_delay=1
|
|
12
|
+
):
|
|
13
|
+
"""
|
|
14
|
+
发送 HTTP GET 请求,支持重试机制和代理设置。
|
|
15
|
+
|
|
16
|
+
:param url: 请求的 URL
|
|
17
|
+
:param params: URL 参数 (可选)
|
|
18
|
+
:param headers: 请求头 (可选)
|
|
19
|
+
:param proxies: 代理设置 (可选)
|
|
20
|
+
:param max_retries: 最大重试次数
|
|
21
|
+
:param retry_delay: 初始重试延迟(秒)
|
|
22
|
+
:return: 解析后的 JSON 数据
|
|
23
|
+
"""
|
|
24
|
+
if proxies is None:
|
|
25
|
+
proxies = config.proxies
|
|
26
|
+
for attempt in range(max_retries):
|
|
27
|
+
try:
|
|
28
|
+
response = requests.get(
|
|
29
|
+
url, params=params, headers=headers, proxies=proxies
|
|
30
|
+
)
|
|
31
|
+
if response.status_code == 200:
|
|
32
|
+
try:
|
|
33
|
+
data = response.json()
|
|
34
|
+
if not data:
|
|
35
|
+
raise DataParsingError("Empty response data")
|
|
36
|
+
return data
|
|
37
|
+
except ValueError:
|
|
38
|
+
raise DataParsingError("Failed to parse JSON response")
|
|
39
|
+
elif response.status_code == 429:
|
|
40
|
+
raise RateLimitError(
|
|
41
|
+
f"Rate limit exceeded. Status code: {response.status_code}"
|
|
42
|
+
)
|
|
43
|
+
else:
|
|
44
|
+
raise APIError(
|
|
45
|
+
f"API request failed. Status code: {response.status_code}"
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
except (RequestException, RateLimitError, APIError, DataParsingError) as e:
|
|
49
|
+
if attempt == max_retries - 1:
|
|
50
|
+
if isinstance(e, RateLimitError):
|
|
51
|
+
raise
|
|
52
|
+
elif isinstance(e, (APIError, DataParsingError)):
|
|
53
|
+
raise
|
|
54
|
+
else:
|
|
55
|
+
raise NetworkError(
|
|
56
|
+
f"Failed to connect after {max_retries} attempts: {str(e)}"
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
time.sleep(retry_delay)
|
|
60
|
+
retry_delay *= 2 # 指数退避策略
|
|
61
|
+
|
|
62
|
+
raise NetworkError(f"Failed to connect after {max_retries} attempts")
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def make_request_with_retry_text(
|
|
66
|
+
url, params=None, headers=None, proxies=None, max_retries=3, retry_delay=1
|
|
67
|
+
):
|
|
68
|
+
"""
|
|
69
|
+
发送 HTTP GET 请求,支持重试机制和代理设置。
|
|
70
|
+
|
|
71
|
+
:param url: 请求的 URL
|
|
72
|
+
:param params: URL 参数 (可选)
|
|
73
|
+
:param headers: 请求头 (可选)
|
|
74
|
+
:param proxies: 代理设置 (可选)
|
|
75
|
+
:param max_retries: 最大重试次数
|
|
76
|
+
:param retry_delay: 初始重试延迟(秒)
|
|
77
|
+
:return: 解析后的 JSON 数据
|
|
78
|
+
"""
|
|
79
|
+
if proxies is None:
|
|
80
|
+
proxies = config.proxies
|
|
81
|
+
for attempt in range(max_retries):
|
|
82
|
+
try:
|
|
83
|
+
response = requests.get(
|
|
84
|
+
url, params=params, headers=headers, proxies=proxies
|
|
85
|
+
)
|
|
86
|
+
if response.status_code == 200:
|
|
87
|
+
try:
|
|
88
|
+
data = response.text
|
|
89
|
+
if not data:
|
|
90
|
+
raise DataParsingError("Empty response data")
|
|
91
|
+
return data
|
|
92
|
+
except ValueError:
|
|
93
|
+
raise DataParsingError("Failed to parse JSON response")
|
|
94
|
+
elif response.status_code == 429:
|
|
95
|
+
raise RateLimitError(
|
|
96
|
+
f"Rate limit exceeded. Status code: {response.status_code}"
|
|
97
|
+
)
|
|
98
|
+
else:
|
|
99
|
+
raise APIError(
|
|
100
|
+
f"API request failed. Status code: {response.status_code}"
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
except (RequestException, RateLimitError, APIError, DataParsingError) as e:
|
|
104
|
+
if attempt == max_retries - 1:
|
|
105
|
+
if isinstance(e, RateLimitError):
|
|
106
|
+
raise
|
|
107
|
+
elif isinstance(e, (APIError, DataParsingError)):
|
|
108
|
+
raise
|
|
109
|
+
else:
|
|
110
|
+
raise NetworkError(
|
|
111
|
+
f"Failed to connect after {max_retries} attempts: {str(e)}"
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
time.sleep(retry_delay)
|
|
115
|
+
retry_delay *= 2 # 指数退避策略
|
|
116
|
+
|
|
117
|
+
raise NetworkError(f"Failed to connect after {max_retries} attempts")
|