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
akshare/economic/marco_cnbs.py
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date: 2023/
|
|
4
|
+
Date: 2023/8/14 11:10
|
|
5
5
|
Desc: 国家金融与发展实验室-中国宏观杠杆率数据
|
|
6
6
|
http://114.115.232.154:8080/
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
import pandas as pd
|
|
9
10
|
|
|
10
11
|
|
|
@@ -50,16 +51,20 @@ def macro_cnbs() -> pd.DataFrame:
|
|
|
50
51
|
"金融部门负债方",
|
|
51
52
|
]
|
|
52
53
|
temp_df = temp_df.reindex(columns=column_order)
|
|
53
|
-
|
|
54
54
|
temp_df["居民部门"] = pd.to_numeric(temp_df["居民部门"], errors="coerce")
|
|
55
|
-
temp_df["非金融企业部门"] = pd.to_numeric(
|
|
55
|
+
temp_df["非金融企业部门"] = pd.to_numeric(
|
|
56
|
+
temp_df["非金融企业部门"], errors="coerce"
|
|
57
|
+
)
|
|
56
58
|
temp_df["政府部门"] = pd.to_numeric(temp_df["政府部门"], errors="coerce")
|
|
57
59
|
temp_df["中央政府"] = pd.to_numeric(temp_df["中央政府"], errors="coerce")
|
|
58
60
|
temp_df["地方政府"] = pd.to_numeric(temp_df["地方政府"], errors="coerce")
|
|
59
61
|
temp_df["实体经济部门"] = pd.to_numeric(temp_df["实体经济部门"], errors="coerce")
|
|
60
|
-
temp_df["金融部门资产方"] = pd.to_numeric(
|
|
61
|
-
|
|
62
|
-
|
|
62
|
+
temp_df["金融部门资产方"] = pd.to_numeric(
|
|
63
|
+
temp_df["金融部门资产方"], errors="coerce"
|
|
64
|
+
)
|
|
65
|
+
temp_df["金融部门负债方"] = pd.to_numeric(
|
|
66
|
+
temp_df["金融部门负债方"], errors="coerce"
|
|
67
|
+
)
|
|
63
68
|
return temp_df
|
|
64
69
|
|
|
65
70
|
|
akshare/energy/energy_carbon.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date:
|
|
4
|
+
Date: 2024/6/25 15:00
|
|
5
5
|
Desc: 碳排放交易
|
|
6
6
|
北京市碳排放权电子交易平台-北京市碳排放权公开交易行情
|
|
7
7
|
https://www.bjets.com.cn/article/jyxx/
|
|
@@ -18,8 +18,8 @@ http://www.cerx.cn/dailynewsOuter/index.htm
|
|
|
18
18
|
广州碳排放权交易中心-行情信息
|
|
19
19
|
http://www.cnemission.com/article/hqxx/
|
|
20
20
|
"""
|
|
21
|
-
|
|
22
|
-
from
|
|
21
|
+
|
|
22
|
+
from io import StringIO
|
|
23
23
|
|
|
24
24
|
import pandas as pd
|
|
25
25
|
import requests
|
|
@@ -27,9 +27,9 @@ from bs4 import BeautifulSoup
|
|
|
27
27
|
from tqdm import tqdm
|
|
28
28
|
|
|
29
29
|
from akshare.utils import demjson
|
|
30
|
+
from akshare.utils.cons import headers
|
|
30
31
|
|
|
31
32
|
|
|
32
|
-
@lru_cache()
|
|
33
33
|
def energy_carbon_domestic(symbol: str = "湖北") -> pd.DataFrame:
|
|
34
34
|
"""
|
|
35
35
|
碳交易网-行情信息
|
|
@@ -39,9 +39,7 @@ def energy_carbon_domestic(symbol: str = "湖北") -> pd.DataFrame:
|
|
|
39
39
|
:return: 行情信息
|
|
40
40
|
:rtype: pandas.DataFrame
|
|
41
41
|
"""
|
|
42
|
-
url =
|
|
43
|
-
"http://k.tanjiaoyi.com:8080/KDataController/getHouseDatasInAverage.do"
|
|
44
|
-
)
|
|
42
|
+
url = "http://k.tanjiaoyi.com:8080/KDataController/getHouseDatasInAverage.do"
|
|
45
43
|
params = {
|
|
46
44
|
"lcnK": "53f75bfcefff58e4046ccfa42171636c",
|
|
47
45
|
"brand": "TAN",
|
|
@@ -69,14 +67,13 @@ def energy_carbon_domestic(symbol: str = "湖北") -> pd.DataFrame:
|
|
|
69
67
|
"地点",
|
|
70
68
|
]
|
|
71
69
|
]
|
|
72
|
-
temp_df["日期"] = pd.to_datetime(temp_df["日期"]).dt.date
|
|
73
|
-
temp_df["成交价"] = pd.to_numeric(temp_df["成交价"])
|
|
74
|
-
temp_df["成交量"] = pd.to_numeric(temp_df["成交量"])
|
|
75
|
-
temp_df["成交额"] = pd.to_numeric(temp_df["成交额"])
|
|
70
|
+
temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
|
|
71
|
+
temp_df["成交价"] = pd.to_numeric(temp_df["成交价"], errors="coerce")
|
|
72
|
+
temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
|
|
73
|
+
temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce")
|
|
76
74
|
return temp_df
|
|
77
75
|
|
|
78
76
|
|
|
79
|
-
@lru_cache()
|
|
80
77
|
def energy_carbon_bj() -> pd.DataFrame:
|
|
81
78
|
"""
|
|
82
79
|
北京市碳排放权电子交易平台-北京市碳排放权公开交易行情
|
|
@@ -85,8 +82,8 @@ def energy_carbon_bj() -> pd.DataFrame:
|
|
|
85
82
|
:rtype: pandas.DataFrame
|
|
86
83
|
"""
|
|
87
84
|
url = "https://www.bjets.com.cn/article/jyxx/"
|
|
88
|
-
r = requests.get(url)
|
|
89
|
-
soup = BeautifulSoup(r.text, "lxml")
|
|
85
|
+
r = requests.get(url, verify=False, headers=headers)
|
|
86
|
+
soup = BeautifulSoup(r.text, features="lxml")
|
|
90
87
|
total_page = (
|
|
91
88
|
soup.find("table")
|
|
92
89
|
.find("script")
|
|
@@ -104,10 +101,10 @@ def energy_carbon_bj() -> pd.DataFrame:
|
|
|
104
101
|
if i == 1:
|
|
105
102
|
i = ""
|
|
106
103
|
url = f"https://www.bjets.com.cn/article/jyxx/?{i}"
|
|
107
|
-
r = requests.get(url)
|
|
104
|
+
r = requests.get(url, verify=False, headers=headers)
|
|
108
105
|
r.encoding = "utf-8"
|
|
109
|
-
df = pd.read_html(r.text)[0]
|
|
110
|
-
temp_df = pd.concat([temp_df, df], ignore_index=True)
|
|
106
|
+
df = pd.read_html(StringIO(r.text))[0]
|
|
107
|
+
temp_df = pd.concat(objs=[temp_df, df], ignore_index=True)
|
|
111
108
|
temp_df.columns = ["日期", "成交量", "成交均价", "成交额"]
|
|
112
109
|
temp_df["成交单位"] = (
|
|
113
110
|
temp_df["成交额"]
|
|
@@ -125,17 +122,16 @@ def energy_carbon_bj() -> pd.DataFrame:
|
|
|
125
122
|
.str.split("(", expand=True)
|
|
126
123
|
.iloc[:, 0]
|
|
127
124
|
)
|
|
128
|
-
temp_df["成交量"] = pd.to_numeric(temp_df["成交量"])
|
|
129
|
-
temp_df["成交均价"] = pd.to_numeric(temp_df["成交均价"])
|
|
125
|
+
temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
|
|
126
|
+
temp_df["成交均价"] = pd.to_numeric(temp_df["成交均价"], errors="coerce")
|
|
130
127
|
temp_df["成交额"] = temp_df["成交额"].str.replace(",", "")
|
|
131
128
|
temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce")
|
|
132
|
-
temp_df["日期"] = pd.to_datetime(temp_df["日期"]).dt.date
|
|
133
|
-
temp_df.sort_values("日期", inplace=True)
|
|
129
|
+
temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
|
|
130
|
+
temp_df.sort_values(by="日期", inplace=True)
|
|
134
131
|
temp_df.reset_index(inplace=True, drop=True)
|
|
135
132
|
return temp_df
|
|
136
133
|
|
|
137
134
|
|
|
138
|
-
@lru_cache()
|
|
139
135
|
def energy_carbon_sz() -> pd.DataFrame:
|
|
140
136
|
"""
|
|
141
137
|
深圳碳排放交易所-国内碳情
|
|
@@ -144,33 +140,30 @@ def energy_carbon_sz() -> pd.DataFrame:
|
|
|
144
140
|
:rtype: pandas.DataFrame
|
|
145
141
|
"""
|
|
146
142
|
url = "http://www.cerx.cn/dailynewsCN/index.htm"
|
|
147
|
-
r = requests.get(url)
|
|
148
|
-
soup = BeautifulSoup(r.text, "lxml")
|
|
149
|
-
page_num = int(
|
|
150
|
-
|
|
151
|
-
)
|
|
152
|
-
big_df = pd.read_html(r.text, header=0)[0]
|
|
143
|
+
r = requests.get(url, headers=headers)
|
|
144
|
+
soup = BeautifulSoup(r.text, features="lxml")
|
|
145
|
+
page_num = int(soup.find(attrs={"class": "pagebar"}).find_all("option")[-1].text)
|
|
146
|
+
big_df = pd.read_html(StringIO(r.text), header=0)[0]
|
|
153
147
|
for page in tqdm(
|
|
154
148
|
range(2, page_num + 1), desc="Please wait for a moment", leave=False
|
|
155
149
|
):
|
|
156
150
|
url = f"http://www.cerx.cn/dailynewsCN/index_{page}.htm"
|
|
157
|
-
r = requests.get(url)
|
|
158
|
-
temp_df = pd.read_html(r.text, header=0)[0]
|
|
159
|
-
big_df = pd.concat([big_df, temp_df], ignore_index=True)
|
|
160
|
-
big_df["交易日期"] = pd.to_datetime(big_df["交易日期"]).dt.date
|
|
161
|
-
big_df["开盘价"] = pd.to_numeric(big_df["开盘价"])
|
|
162
|
-
big_df["最高价"] = pd.to_numeric(big_df["最高价"])
|
|
163
|
-
big_df["最低价"] = pd.to_numeric(big_df["最低价"])
|
|
164
|
-
big_df["成交均价"] = pd.to_numeric(big_df["成交均价"])
|
|
165
|
-
big_df["收盘价"] = pd.to_numeric(big_df["收盘价"])
|
|
166
|
-
big_df["成交量"] = pd.to_numeric(big_df["成交量"])
|
|
167
|
-
big_df["成交额"] = pd.to_numeric(big_df["成交额"])
|
|
168
|
-
big_df.sort_values("交易日期", inplace=True)
|
|
151
|
+
r = requests.get(url, headers=headers)
|
|
152
|
+
temp_df = pd.read_html(StringIO(r.text), header=0)[0]
|
|
153
|
+
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
|
|
154
|
+
big_df["交易日期"] = pd.to_datetime(big_df["交易日期"], errors="coerce").dt.date
|
|
155
|
+
big_df["开盘价"] = pd.to_numeric(big_df["开盘价"], errors="coerce")
|
|
156
|
+
big_df["最高价"] = pd.to_numeric(big_df["最高价"], errors="coerce")
|
|
157
|
+
big_df["最低价"] = pd.to_numeric(big_df["最低价"], errors="coerce")
|
|
158
|
+
big_df["成交均价"] = pd.to_numeric(big_df["成交均价"], errors="coerce")
|
|
159
|
+
big_df["收盘价"] = pd.to_numeric(big_df["收盘价"], errors="coerce")
|
|
160
|
+
big_df["成交量"] = pd.to_numeric(big_df["成交量"], errors="coerce")
|
|
161
|
+
big_df["成交额"] = pd.to_numeric(big_df["成交额"], errors="coerce")
|
|
162
|
+
big_df.sort_values(by="交易日期", inplace=True)
|
|
169
163
|
big_df.reset_index(inplace=True, drop=True)
|
|
170
164
|
return big_df
|
|
171
165
|
|
|
172
166
|
|
|
173
|
-
@lru_cache()
|
|
174
167
|
def energy_carbon_eu() -> pd.DataFrame:
|
|
175
168
|
"""
|
|
176
169
|
深圳碳排放交易所-国际碳情
|
|
@@ -179,33 +172,30 @@ def energy_carbon_eu() -> pd.DataFrame:
|
|
|
179
172
|
:rtype: pandas.DataFrame
|
|
180
173
|
"""
|
|
181
174
|
url = "http://www.cerx.cn/dailynewsOuter/index.htm"
|
|
182
|
-
r = requests.get(url)
|
|
183
|
-
soup = BeautifulSoup(r.text, "lxml")
|
|
184
|
-
page_num = int(
|
|
185
|
-
|
|
186
|
-
)
|
|
187
|
-
big_df = pd.read_html(r.text, header=0)[0]
|
|
175
|
+
r = requests.get(url, headers=headers)
|
|
176
|
+
soup = BeautifulSoup(r.text, features="lxml")
|
|
177
|
+
page_num = int(soup.find(attrs={"class": "pagebar"}).find_all("option")[-1].text)
|
|
178
|
+
big_df = pd.read_html(StringIO(r.text), header=0)[0]
|
|
188
179
|
for page in tqdm(
|
|
189
180
|
range(2, page_num + 1), desc="Please wait for a moment", leave=False
|
|
190
181
|
):
|
|
191
182
|
url = f"http://www.cerx.cn/dailynewsOuter/index_{page}.htm"
|
|
192
183
|
r = requests.get(url)
|
|
193
|
-
temp_df = pd.read_html(r.text, header=0)[0]
|
|
194
|
-
big_df = pd.concat([big_df, temp_df], ignore_index=True)
|
|
195
|
-
big_df["交易日期"] = pd.to_datetime(big_df["交易日期"]).dt.date
|
|
196
|
-
big_df["开盘价"] = pd.to_numeric(big_df["开盘价"])
|
|
197
|
-
big_df["最高价"] = pd.to_numeric(big_df["最高价"])
|
|
198
|
-
big_df["最低价"] = pd.to_numeric(big_df["最低价"])
|
|
199
|
-
big_df["成交均价"] = pd.to_numeric(big_df["成交均价"])
|
|
200
|
-
big_df["收盘价"] = pd.to_numeric(big_df["收盘价"])
|
|
201
|
-
big_df["成交量"] = pd.to_numeric(big_df["成交量"])
|
|
202
|
-
big_df["成交额"] = pd.to_numeric(big_df["成交额"])
|
|
203
|
-
big_df.sort_values("交易日期", inplace=True)
|
|
184
|
+
temp_df = pd.read_html(StringIO(r.text), header=0)[0]
|
|
185
|
+
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
|
|
186
|
+
big_df["交易日期"] = pd.to_datetime(big_df["交易日期"], errors="coerce").dt.date
|
|
187
|
+
big_df["开盘价"] = pd.to_numeric(big_df["开盘价"], errors="coerce")
|
|
188
|
+
big_df["最高价"] = pd.to_numeric(big_df["最高价"], errors="coerce")
|
|
189
|
+
big_df["最低价"] = pd.to_numeric(big_df["最低价"], errors="coerce")
|
|
190
|
+
big_df["成交均价"] = pd.to_numeric(big_df["成交均价"], errors="coerce")
|
|
191
|
+
big_df["收盘价"] = pd.to_numeric(big_df["收盘价"], errors="coerce")
|
|
192
|
+
big_df["成交量"] = pd.to_numeric(big_df["成交量"], errors="coerce")
|
|
193
|
+
big_df["成交额"] = pd.to_numeric(big_df["成交额"], errors="coerce")
|
|
194
|
+
big_df.sort_values(by="交易日期", inplace=True)
|
|
204
195
|
big_df.reset_index(inplace=True, drop=True)
|
|
205
196
|
return big_df
|
|
206
197
|
|
|
207
198
|
|
|
208
|
-
@lru_cache()
|
|
209
199
|
def energy_carbon_hb() -> pd.DataFrame:
|
|
210
200
|
"""
|
|
211
201
|
湖北碳排放权交易中心-现货交易数据-配额-每日概况
|
|
@@ -213,66 +203,43 @@ def energy_carbon_hb() -> pd.DataFrame:
|
|
|
213
203
|
:return: 现货交易数据-配额-每日概况行情数据
|
|
214
204
|
:rtype: pandas.DataFrame
|
|
215
205
|
"""
|
|
216
|
-
url = "
|
|
217
|
-
r = requests.get(url)
|
|
218
|
-
soup = BeautifulSoup(r.text, "lxml")
|
|
219
|
-
|
|
220
|
-
soup.find("div", attrs={"class": "
|
|
206
|
+
url = "https://www.hbets.cn/"
|
|
207
|
+
r = requests.get(url, headers=headers)
|
|
208
|
+
soup = BeautifulSoup(r.text, features="lxml")
|
|
209
|
+
data_text = (
|
|
210
|
+
soup.find(name="div", attrs={"class": "threeLeft"}).find_all("script")[1].text
|
|
221
211
|
)
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
212
|
+
start_pos = data_text.find("cjj = '[") + 7 # 找到 JSON 数组开始的位置
|
|
213
|
+
end_pos = data_text.rfind("cjj =") - 31 # 找到 JSON 数组结束的位置
|
|
214
|
+
data_json = demjson.decode(data_text[start_pos:end_pos])
|
|
215
|
+
temp_df = pd.DataFrame.from_dict(data_json)
|
|
216
|
+
temp_df.rename(
|
|
217
|
+
columns={
|
|
218
|
+
"riqi": "日期",
|
|
219
|
+
"cjj": "成交价",
|
|
220
|
+
"cjl": "成交量",
|
|
221
|
+
"zx": "最新",
|
|
222
|
+
"zd": "涨跌",
|
|
223
|
+
},
|
|
224
|
+
inplace=True,
|
|
225
|
+
)
|
|
226
|
+
temp_df = temp_df[
|
|
227
|
+
[
|
|
228
|
+
"日期",
|
|
229
|
+
"成交价",
|
|
230
|
+
"成交量",
|
|
231
|
+
"最新",
|
|
232
|
+
"涨跌",
|
|
240
233
|
]
|
|
241
|
-
temp_list = []
|
|
242
|
-
for item in page_node:
|
|
243
|
-
temp_inner_list = []
|
|
244
|
-
for inner_item in item.find_all("li"):
|
|
245
|
-
temp_inner_list.append(inner_item.text)
|
|
246
|
-
temp_list.append(temp_inner_list)
|
|
247
|
-
temp_df = pd.DataFrame(temp_list)
|
|
248
|
-
big_df = pd.concat([big_df, temp_df], ignore_index=True)
|
|
249
|
-
big_df.columns = columns
|
|
250
|
-
big_df["交易品种"] = big_df["交易品种"].str.strip()
|
|
251
|
-
big_df["日期"] = pd.to_datetime(big_df["日期"]).dt.date
|
|
252
|
-
big_df["最新"] = pd.to_numeric(big_df["最新"])
|
|
253
|
-
big_df["涨跌幅"] = big_df["涨跌幅"].str.strip("%").str.strip()
|
|
254
|
-
big_df["涨跌幅"] = big_df["涨跌幅"].str.strip("%")
|
|
255
|
-
big_df["涨跌幅"] = pd.to_numeric(big_df["涨跌幅"])
|
|
256
|
-
big_df["最高"] = big_df["最高"].str.replace("--", "")
|
|
257
|
-
big_df["最高"] = pd.to_numeric(big_df["最高"])
|
|
258
|
-
big_df["最低"] = big_df["最低"].str.replace("--", "")
|
|
259
|
-
big_df["最低"] = pd.to_numeric(big_df["最低"])
|
|
260
|
-
big_df["成交量"] = big_df["成交量"].str.replace("--", "")
|
|
261
|
-
big_df["成交量"] = pd.to_numeric(big_df["成交量"])
|
|
262
|
-
big_df["成交额"] = big_df["成交额"].str.replace("--", "")
|
|
263
|
-
big_df["成交额"] = pd.to_numeric(big_df["成交额"])
|
|
264
|
-
big_df["昨收盘价"] = big_df["昨收盘价"].str.replace("--", "")
|
|
265
|
-
big_df["昨收盘价"] = pd.to_numeric(big_df["昨收盘价"])
|
|
266
|
-
big_df.dropna(subset=["最新"], inplace=True)
|
|
267
|
-
big_df.sort_values("日期", inplace=True)
|
|
268
|
-
big_df = big_df[
|
|
269
|
-
["日期", "交易品种", "最新", "涨跌幅", "最高", "最低", "成交量", "成交额", "昨收盘价"]
|
|
270
234
|
]
|
|
271
|
-
|
|
272
|
-
|
|
235
|
+
temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
|
|
236
|
+
temp_df["成交价"] = pd.to_numeric(temp_df["成交价"], errors="coerce")
|
|
237
|
+
temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
|
|
238
|
+
temp_df["最新"] = pd.to_numeric(temp_df["最新"], errors="coerce")
|
|
239
|
+
temp_df["涨跌"] = pd.to_numeric(temp_df["涨跌"], errors="coerce")
|
|
240
|
+
return temp_df
|
|
273
241
|
|
|
274
242
|
|
|
275
|
-
@lru_cache()
|
|
276
243
|
def energy_carbon_gz() -> pd.DataFrame:
|
|
277
244
|
"""
|
|
278
245
|
广州碳排放权交易中心-行情信息
|
|
@@ -287,7 +254,7 @@ def energy_carbon_gz() -> pd.DataFrame:
|
|
|
287
254
|
"endTime": "2030-09-12",
|
|
288
255
|
}
|
|
289
256
|
r = requests.get(url, params=params)
|
|
290
|
-
temp_df = pd.read_html(r.text, header=0)[1]
|
|
257
|
+
temp_df = pd.read_html(StringIO(r.text), header=0)[1]
|
|
291
258
|
temp_df.columns = [
|
|
292
259
|
"日期",
|
|
293
260
|
"品种",
|
|
@@ -300,17 +267,19 @@ def energy_carbon_gz() -> pd.DataFrame:
|
|
|
300
267
|
"成交数量",
|
|
301
268
|
"成交金额",
|
|
302
269
|
]
|
|
303
|
-
temp_df["日期"] = pd.to_datetime(
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
temp_df["
|
|
307
|
-
temp_df["
|
|
308
|
-
temp_df["
|
|
270
|
+
temp_df["日期"] = pd.to_datetime(
|
|
271
|
+
temp_df["日期"], format="%Y%m%d", errors="coerce"
|
|
272
|
+
).dt.date
|
|
273
|
+
temp_df["开盘价"] = pd.to_numeric(temp_df["开盘价"], errors="coerce")
|
|
274
|
+
temp_df["收盘价"] = pd.to_numeric(temp_df["收盘价"], errors="coerce")
|
|
275
|
+
temp_df["最高价"] = pd.to_numeric(temp_df["最高价"], errors="coerce")
|
|
276
|
+
temp_df["最低价"] = pd.to_numeric(temp_df["最低价"], errors="coerce")
|
|
277
|
+
temp_df["涨跌"] = pd.to_numeric(temp_df["涨跌"], errors="coerce")
|
|
309
278
|
temp_df["涨跌幅"] = temp_df["涨跌幅"].str.strip("%")
|
|
310
|
-
temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"])
|
|
311
|
-
temp_df["成交数量"] = pd.to_numeric(temp_df["成交数量"])
|
|
312
|
-
temp_df["成交金额"] = pd.to_numeric(temp_df["成交金额"])
|
|
313
|
-
temp_df.sort_values("日期", inplace=True)
|
|
279
|
+
temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce")
|
|
280
|
+
temp_df["成交数量"] = pd.to_numeric(temp_df["成交数量"], errors="coerce")
|
|
281
|
+
temp_df["成交金额"] = pd.to_numeric(temp_df["成交金额"], errors="coerce")
|
|
282
|
+
temp_df.sort_values(by="日期", inplace=True)
|
|
314
283
|
temp_df.reset_index(inplace=True, drop=True)
|
|
315
284
|
return temp_df
|
|
316
285
|
|
akshare/event/migration.py
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date:
|
|
4
|
+
Date: 2024/5/12 22:30
|
|
5
5
|
Desc: 百度地图慧眼-百度迁徙数据
|
|
6
6
|
"""
|
|
7
|
+
|
|
7
8
|
import json
|
|
8
9
|
|
|
9
10
|
import pandas as pd
|
|
@@ -92,7 +93,7 @@ def migration_scale_baidu(
|
|
|
92
93
|
|
|
93
94
|
if __name__ == "__main__":
|
|
94
95
|
migration_area_baidu_df = migration_area_baidu(
|
|
95
|
-
area="
|
|
96
|
+
area="杭州市", indicator="move_out", date="20240401"
|
|
96
97
|
)
|
|
97
98
|
print(migration_area_baidu_df)
|
|
98
99
|
|
akshare/exceptions.py
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""
|
|
2
|
+
AKShare 异常处理模块
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class AkshareException(Exception):
|
|
7
|
+
"""Base exception for akshare library"""
|
|
8
|
+
|
|
9
|
+
def __init__(self, message):
|
|
10
|
+
self.message = message
|
|
11
|
+
super().__init__(self.message)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class APIError(AkshareException):
|
|
15
|
+
"""Raised when API request fails"""
|
|
16
|
+
|
|
17
|
+
def __init__(self, message, status_code=None):
|
|
18
|
+
self.status_code = status_code
|
|
19
|
+
super().__init__(f"API Error: {message} (Status code: {status_code})")
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class DataParsingError(AkshareException):
|
|
23
|
+
"""Raised when data parsing fails"""
|
|
24
|
+
|
|
25
|
+
pass
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class InvalidParameterError(AkshareException):
|
|
29
|
+
"""Raised when an invalid parameter is provided"""
|
|
30
|
+
|
|
31
|
+
pass
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class NetworkError(AkshareException):
|
|
35
|
+
"""Raised when network-related issues occur"""
|
|
36
|
+
|
|
37
|
+
pass
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class RateLimitError(AkshareException):
|
|
41
|
+
"""Raised when API rate limit is exceeded"""
|
|
42
|
+
|
|
43
|
+
pass
|