akshare 1.14.49__py3-none-any.whl → 1.17.99__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.
- akshare/__init__.py +595 -129
- akshare/air/air_hebei.py +77 -54
- akshare/air/air_zhenqi.py +0 -4
- akshare/air/cons.py +1 -0
- akshare/air/crypto.js +1 -1
- akshare/air/outcrypto.js +1 -1
- akshare/article/cons.py +1 -0
- akshare/article/epu_index.py +4 -3
- akshare/article/ff_factor.py +19 -8
- akshare/article/fred_md.py +4 -1
- akshare/article/risk_rv.py +3 -8
- akshare/bank/bank_cbirc_2020.py +11 -11
- akshare/bank/cons.py +7 -6
- akshare/bond/bond_buy_back_em.py +228 -0
- akshare/bond/bond_cb_sina.py +1 -0
- akshare/bond/bond_cb_ths.py +17 -9
- akshare/bond/bond_cbond.py +19 -14
- akshare/bond/bond_china.py +38 -39
- akshare/bond/bond_china_money.py +1 -1
- akshare/bond/bond_convert.py +10 -9
- akshare/bond/bond_em.py +37 -17
- akshare/bond/bond_summary.py +38 -37
- akshare/bond/bond_zh_cov.py +31 -40
- akshare/bond/bond_zh_sina.py +4 -0
- akshare/bond/cons.py +14 -11
- akshare/cal/__init__.py +0 -0
- akshare/cal/rv.py +170 -0
- akshare/cost/cost_living.py +7 -5
- akshare/crypto/__init__.py +1 -1
- akshare/crypto/crypto_bitcoin_cme.py +9 -7
- akshare/crypto/crypto_hold.py +4 -2
- akshare/currency/currency.py +1 -0
- akshare/currency/currency_china_bank_sina.py +11 -6
- akshare/data/__init__.py +1 -1
- akshare/data/cninfo.js +1 -1
- akshare/datasets.py +10 -21
- akshare/economic/cons.py +10 -3
- akshare/economic/macro_australia.py +74 -69
- akshare/economic/macro_bank.py +95 -653
- akshare/economic/macro_canada.py +92 -81
- akshare/economic/macro_china.py +97 -105
- akshare/economic/macro_china_hk.py +0 -1
- akshare/economic/macro_euro.py +103 -56
- akshare/economic/macro_finance_ths.py +7 -5
- akshare/economic/macro_germany.py +1 -1
- akshare/economic/macro_japan.py +0 -1
- akshare/economic/macro_other.py +1 -6
- akshare/economic/macro_swiss.py +2 -3
- akshare/economic/macro_uk.py +1 -1
- akshare/economic/macro_usa.py +7 -9
- akshare/economic/marco_cnbs.py +11 -6
- akshare/energy/energy_carbon.py +0 -1
- akshare/energy/energy_oil_em.py +1 -2
- akshare/event/cons.py +1 -0
- akshare/exceptions.py +43 -0
- akshare/file_fold/calendar.json +245 -2
- akshare/forex/__init__.py +0 -0
- akshare/forex/cons.py +192 -0
- akshare/forex/forex_em.py +149 -0
- akshare/fortune/fortune_500.py +1 -37
- akshare/fortune/fortune_bloomberg.py +6 -3
- akshare/fortune/fortune_forbes_500.py +3 -6
- akshare/fortune/fortune_hurun.py +2 -1
- akshare/fortune/fortune_xincaifu_500.py +17 -14
- akshare/fund/fund_announcement_em.py +145 -0
- akshare/fund/fund_aum_em.py +49 -35
- akshare/fund/fund_em.py +251 -220
- akshare/fund/fund_etf_em.py +44 -35
- akshare/fund/fund_etf_sina.py +75 -27
- akshare/fund/fund_etf_ths.py +2 -0
- akshare/fund/fund_fee_em.py +172 -0
- akshare/fund/fund_fhsp_em.py +42 -32
- akshare/fund/fund_init_em.py +8 -5
- akshare/fund/fund_lof_em.py +12 -19
- akshare/fund/fund_manager.py +25 -11
- akshare/fund/fund_overview_em.py +42 -0
- akshare/fund/fund_portfolio_em.py +23 -21
- akshare/fund/fund_position_lg.py +19 -8
- akshare/fund/fund_rank_em.py +2 -5
- akshare/fund/fund_rating.py +33 -12
- akshare/fund/fund_scale_em.py +24 -13
- akshare/fund/fund_scale_sina.py +20 -10
- akshare/fund/fund_xq.py +3 -2
- akshare/futures/cons.py +135 -39
- akshare/futures/cot.py +55 -56
- akshare/futures/futures_basis.py +49 -11
- akshare/futures/futures_comex_em.py +1 -0
- akshare/futures/futures_comm_ctp.py +1 -1
- akshare/futures/futures_contract_detail.py +59 -9
- akshare/futures/futures_daily_bar.py +66 -59
- akshare/futures/futures_foreign.py +14 -8
- akshare/futures/futures_hf_em.py +215 -61
- akshare/futures/futures_hist_em.py +191 -0
- akshare/futures/futures_hq_sina.py +5 -3
- akshare/futures/futures_index_ccidx.py +24 -82
- akshare/futures/futures_inventory_99.py +70 -272
- akshare/futures/futures_inventory_em.py +14 -11
- akshare/futures/futures_news_shmet.py +2 -2
- akshare/futures/futures_roll_yield.py +11 -24
- akshare/futures/futures_rule.py +7 -3
- akshare/futures/futures_rule_em.py +38 -0
- akshare/futures/futures_settlement_price_sgx.py +21 -6
- akshare/futures/futures_stock_js.py +0 -1
- akshare/futures/futures_to_spot.py +5 -6
- akshare/futures/futures_warehouse_receipt.py +48 -47
- akshare/futures/futures_zh_sina.py +3 -3
- akshare/futures/receipt.py +298 -165
- akshare/futures/requests_fun.py +16 -3
- akshare/futures/symbol_var.py +32 -13
- akshare/futures_derivative/cons.py +100 -103
- akshare/futures_derivative/futures_contract_info_cffex.py +55 -39
- akshare/futures_derivative/futures_contract_info_czce.py +2 -0
- akshare/futures_derivative/futures_contract_info_dce.py +43 -17
- akshare/futures_derivative/futures_contract_info_gfex.py +43 -31
- akshare/futures_derivative/futures_contract_info_ine.py +43 -34
- akshare/futures_derivative/futures_contract_info_shfe.py +3 -4
- akshare/futures_derivative/futures_cot_sina.py +8 -6
- akshare/futures_derivative/futures_index_sina.py +25 -13
- akshare/fx/cons.py +12 -7
- akshare/fx/fx_c_swap_cm.py +62 -0
- akshare/fx/fx_quote.py +3 -2
- akshare/fx/fx_quote_baidu.py +2 -1
- akshare/hf/__init__.py +1 -1
- akshare/hf/hf_sp500.py +8 -7
- akshare/index/cons.py +132 -28
- akshare/index/index_cni.py +7 -7
- akshare/index/index_cons.py +2 -2
- akshare/index/index_csindex.py +68 -0
- akshare/index/index_cx.py +20 -20
- akshare/index/index_drewry.py +17 -16
- akshare/index/index_eri.py +1 -0
- akshare/index/index_global_em.py +167 -0
- akshare/index/index_global_sina.py +82 -0
- akshare/index/index_kq_fz.py +17 -14
- akshare/index/index_kq_ss.py +1 -0
- akshare/index/index_option_qvix.py +351 -16
- akshare/index/index_research_sw.py +21 -21
- akshare/index/index_spot.py +9 -5
- akshare/index/index_stock_hk.py +5 -9
- akshare/index/index_stock_zh.py +111 -24
- akshare/index/index_stock_zh_csindex.py +3 -367
- akshare/index/index_sugar.py +18 -4
- akshare/index/index_sw.py +10 -2
- akshare/index/index_yw.py +53 -75
- akshare/index/index_zh_em.py +15 -82
- akshare/interest_rate/interbank_rate_em.py +0 -1
- akshare/movie/jm.js +0 -1
- akshare/news/__init__.py +1 -1
- akshare/news/news_baidu.py +395 -222
- akshare/news/news_stock.py +49 -16
- akshare/option/cons.py +2 -2
- akshare/option/option_commodity.py +341 -220
- akshare/option/option_commodity_sina.py +22 -26
- akshare/option/option_contract_info_ctp.py +63 -0
- akshare/option/option_current_sse.py +61 -0
- akshare/option/option_current_szse.py +84 -0
- akshare/option/option_czce.py +37 -9
- akshare/option/option_daily_stats_sse_szse.py +0 -1
- akshare/option/option_em.py +4 -8
- akshare/option/option_finance.py +60 -12
- akshare/option/option_finance_sina.py +7 -7
- akshare/option/option_lhb_em.py +0 -1
- akshare/option/option_margin.py +62 -0
- akshare/option/option_premium_analysis_em.py +58 -53
- akshare/option/option_risk_analysis_em.py +11 -8
- akshare/option/option_risk_indicator_sse.py +3 -4
- akshare/option/option_value_analysis_em.py +62 -55
- akshare/other/__init__.py +1 -1
- akshare/pro/__init__.py +0 -1
- akshare/pro/client.py +6 -4
- akshare/pro/cons.py +3 -2
- akshare/pro/data_pro.py +6 -5
- akshare/qdii/__init__.py +0 -0
- akshare/qdii/qdii_jsl.py +233 -0
- akshare/qhkc/__init__.py +1 -6
- akshare/qhkc/qhkc_api.py +64 -22
- akshare/qhkc_web/__init__.py +1 -6
- akshare/qhkc_web/qhkc_fund.py +10 -6
- akshare/qhkc_web/qhkc_index.py +28 -14
- akshare/qhkc_web/qhkc_tool.py +62 -59
- akshare/rate/__init__.py +1 -1
- akshare/rate/repo_rate.py +36 -32
- akshare/reits/__init__.py +1 -1
- akshare/reits/reits_basic.py +149 -13
- akshare/request.py +117 -0
- akshare/spot/__init__.py +1 -1
- akshare/spot/spot_hog_soozhu.py +165 -3
- akshare/spot/spot_sge.py +70 -9
- akshare/stock/cons.py +60 -23
- akshare/stock/stock_allotment_cninfo.py +8 -8
- akshare/stock/stock_ask_bid_em.py +3 -78
- akshare/stock/stock_board_concept_em.py +160 -35
- akshare/stock/stock_board_industry_em.py +163 -70
- akshare/stock/stock_dividend_cninfo.py +31 -17
- akshare/stock/stock_dzjy_em.py +347 -260
- akshare/stock/stock_fund_em.py +72 -64
- akshare/stock/stock_fund_hold.py +1 -2
- akshare/stock/stock_gsrl_em.py +1 -0
- akshare/stock/stock_hk_comparison_em.py +175 -0
- akshare/stock/stock_hk_famous.py +4 -5
- akshare/stock/stock_hk_fhpx_ths.py +2 -1
- akshare/stock/stock_hk_hot_rank_em.py +1 -0
- akshare/stock/stock_hk_sina.py +84 -36
- akshare/stock/stock_hold_control_cninfo.py +82 -0
- akshare/stock/stock_hold_control_em.py +0 -2
- akshare/stock/stock_hot_rank_em.py +4 -1
- akshare/stock/stock_hot_search_baidu.py +32 -19
- akshare/stock/stock_hot_up_em.py +4 -1
- akshare/stock/stock_hsgt_em.py +155 -0
- akshare/stock/stock_industry.py +1 -0
- akshare/stock/stock_industry_cninfo.py +1 -2
- akshare/stock/stock_info.py +6 -4
- akshare/stock/stock_info_em.py +17 -11
- akshare/stock/stock_intraday_em.py +4 -78
- akshare/stock/stock_intraday_sina.py +2 -2
- akshare/stock/stock_news_cx.py +39 -0
- akshare/stock/stock_profile_cninfo.py +7 -7
- akshare/stock/stock_profile_em.py +302 -0
- akshare/stock/stock_rank_forecast.py +6 -5
- akshare/stock/stock_repurchase_em.py +7 -2
- akshare/stock/stock_share_changes_cninfo.py +7 -5
- akshare/stock/stock_share_hold.py +24 -20
- akshare/stock/stock_stop.py +6 -6
- akshare/stock/stock_summary.py +153 -417
- akshare/stock/stock_us_famous.py +5 -6
- akshare/stock/stock_us_js.py +3 -2
- akshare/stock/stock_us_pink.py +38 -27
- akshare/stock/stock_us_sina.py +7 -3
- akshare/stock/stock_weibo_nlp.py +18 -20
- akshare/stock/stock_xq.py +24 -22
- akshare/stock/stock_zh_a_sina.py +8 -5
- akshare/stock/stock_zh_a_special.py +240 -243
- akshare/stock/stock_zh_a_tick_tx.py +11 -3
- akshare/stock/stock_zh_ah_tx.py +23 -26
- akshare/stock/stock_zh_b_sina.py +2 -2
- akshare/stock/stock_zh_comparison_em.py +250 -0
- akshare/stock/stock_zh_kcb_sina.py +67 -64
- akshare/stock_a/__init__.py +0 -0
- akshare/stock_a/stock_board_concept_name_em.py +170 -0
- akshare/stock_a/stock_individual_fund_flow_rank.py +258 -0
- akshare/stock_a/stock_zh_a_spot.py +212 -0
- akshare/stock_feature/cons.py +1 -0
- akshare/stock_feature/stock_a_indicator.py +9 -54
- akshare/stock_feature/stock_a_pe_and_pb.py +23 -5
- akshare/stock_feature/stock_account_em.py +0 -1
- akshare/stock_feature/stock_all_pb.py +2 -1
- akshare/stock_feature/stock_analyst_em.py +36 -30
- akshare/stock_feature/stock_board_concept_ths.py +328 -0
- akshare/stock_feature/stock_board_industry_ths.py +57 -2
- akshare/stock_feature/stock_buffett_index_lg.py +10 -8
- akshare/stock_feature/stock_classify_sina.py +3 -6
- akshare/stock_feature/stock_comment_em.py +81 -144
- akshare/stock_feature/stock_congestion_lg.py +2 -1
- akshare/stock_feature/stock_cyq_em.py +5 -11
- akshare/stock_feature/stock_disclosure_cninfo.py +6 -6
- akshare/stock_feature/stock_dxsyl_em.py +121 -74
- akshare/stock_feature/stock_ebs_lg.py +5 -4
- akshare/stock_feature/stock_esg_sina.py +29 -7
- akshare/stock_feature/stock_fhps_em.py +2 -1
- akshare/stock_feature/stock_fhps_ths.py +15 -7
- akshare/stock_feature/stock_fund_flow.py +30 -22
- akshare/stock_feature/stock_gddh_em.py +19 -11
- akshare/stock_feature/stock_gdfx_em.py +226 -113
- akshare/stock_feature/stock_gdhs.py +75 -50
- akshare/stock_feature/stock_gdzjc_em.py +21 -10
- akshare/stock_feature/stock_gpzy_em.py +78 -46
- akshare/stock_feature/stock_gxl_lg.py +3 -2
- akshare/stock_feature/stock_hist_em.py +137 -234
- akshare/stock_feature/stock_hist_tx.py +13 -10
- akshare/stock_feature/stock_hk_valuation_baidu.py +20 -8
- akshare/stock_feature/stock_hot_xq.py +4 -6
- akshare/stock_feature/stock_hsgt_em.py +269 -97
- akshare/stock_feature/stock_hsgt_exchange_rate.py +115 -87
- akshare/stock_feature/stock_hsgt_min_em.py +13 -16
- akshare/stock_feature/stock_info.py +7 -80
- akshare/stock_feature/stock_inner_trade_xq.py +38 -31
- akshare/stock_feature/stock_jgdy_em.py +43 -40
- akshare/stock_feature/stock_lhb_em.py +119 -3
- akshare/stock_feature/stock_margin_em.py +0 -1
- akshare/stock_feature/stock_margin_sse.py +0 -2
- akshare/stock_feature/stock_pankou_em.py +71 -35
- akshare/stock_feature/stock_qsjy_em.py +13 -4
- akshare/stock_feature/stock_report_em.py +151 -7
- akshare/stock_feature/stock_research_report_em.py +55 -20
- akshare/stock_feature/stock_sy_em.py +20 -15
- akshare/stock_feature/stock_technology_ths.py +122 -77
- akshare/stock_feature/stock_tfp_em.py +2 -1
- akshare/stock_feature/stock_three_report_em.py +21 -5
- akshare/stock_feature/stock_ttm_lyr.py +18 -9
- akshare/stock_feature/stock_value_em.py +83 -0
- akshare/stock_feature/stock_yjbb_em.py +58 -32
- akshare/stock_feature/stock_yjyg_cninfo.py +6 -2
- akshare/stock_feature/stock_yjyg_em.py +1 -1
- akshare/stock_feature/stock_yzxdr_em.py +24 -22
- akshare/stock_feature/stock_zdhtmx_em.py +20 -6
- akshare/stock_feature/stock_zh_vote_baidu.py +4 -1
- akshare/stock_feature/stock_ztb_em.py +39 -24
- akshare/stock_fundamental/__init__.py +1 -1
- akshare/stock_fundamental/stock_basic_info_xq.py +119 -0
- akshare/stock_fundamental/{stock_finance_hk.py → stock_finance_hk_em.py} +23 -16
- akshare/stock_fundamental/{stock_finance.py → stock_finance_sina.py} +60 -7
- akshare/stock_fundamental/stock_finance_ths.py +524 -57
- akshare/stock_fundamental/stock_finance_us_em.py +268 -0
- akshare/stock_fundamental/stock_gbjg_em.py +80 -0
- akshare/stock_fundamental/stock_hold.py +26 -17
- akshare/stock_fundamental/stock_ipo_declare.py +1 -0
- akshare/stock_fundamental/stock_kcb_detail_sse.py +10 -10
- akshare/stock_fundamental/stock_kcb_sse.py +26 -25
- akshare/stock_fundamental/stock_notice.py +12 -3
- akshare/stock_fundamental/stock_profit_forecast_em.py +31 -13
- akshare/stock_fundamental/stock_profit_forecast_hk_etnet.py +64 -41
- akshare/stock_fundamental/stock_profit_forecast_ths.py +86 -35
- akshare/stock_fundamental/stock_recommend.py +20 -4
- akshare/stock_fundamental/stock_zygc.py +5 -62
- akshare/utils/context.py +43 -0
- akshare/utils/demjson.py +2009 -1338
- akshare/utils/func.py +49 -2
- akshare/utils/multi_decrypt.py +53 -0
- akshare/utils/token_process.py +6 -5
- {akshare-1.14.49.dist-info → akshare-1.17.99.dist-info}/METADATA +54 -80
- akshare-1.17.99.dist-info/RECORD +409 -0
- {akshare-1.14.49.dist-info → akshare-1.17.99.dist-info}/WHEEL +1 -1
- {akshare-1.14.49.dist-info → akshare-1.17.99.dist-info/licenses}/LICENSE +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/fund/fund_announcement.py +0 -56
- 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 -53
- akshare/futures_derivative/futures_other_index_nh.py +0 -145
- akshare/index/index_fear_greed_funddb.py +0 -78
- akshare/index/index_investing.py +0 -232
- akshare/sport/__init__.py +0 -6
- akshare/sport/sport_olympic.py +0 -27
- akshare/stock_feature/stock_wencai.py +0 -104
- akshare/stock_fundamental/stock_mda_ym.py +0 -40
- akshare-1.14.49.dist-info/RECORD +0 -387
- {akshare-1.14.49.dist-info → akshare-1.17.99.dist-info}/top_level.txt +0 -0
|
@@ -5,6 +5,7 @@ Date: 2024/1/6 15:00
|
|
|
5
5
|
Desc: 东方财富网-数据中心-研究报告-盈利预测
|
|
6
6
|
https://data.eastmoney.com/report/profitforecast.jshtml
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
import pandas as pd
|
|
9
10
|
import requests
|
|
10
11
|
|
|
@@ -15,7 +16,8 @@ def stock_profit_forecast_em(symbol: str = "") -> pd.DataFrame:
|
|
|
15
16
|
"""
|
|
16
17
|
东方财富网-数据中心-研究报告-盈利预测
|
|
17
18
|
https://data.eastmoney.com/report/profitforecast.jshtml
|
|
18
|
-
:param symbol: "", 默认为获取全部数据; symbol="船舶制造", 则获取具体行业板块的数据;
|
|
19
|
+
:param symbol: "", 默认为获取全部数据; symbol="船舶制造", 则获取具体行业板块的数据;
|
|
20
|
+
行业板块可以通过 ak.stock_board_industry_name_em() 接口获取
|
|
19
21
|
:type symbol: str
|
|
20
22
|
:return: 盈利预测
|
|
21
23
|
:rtype: pandas.DataFrame
|
|
@@ -34,7 +36,6 @@ def stock_profit_forecast_em(symbol: str = "") -> pd.DataFrame:
|
|
|
34
36
|
}
|
|
35
37
|
if symbol:
|
|
36
38
|
params.update({"filter": f'(INDUSTRY_BOARD="{symbol}")'})
|
|
37
|
-
|
|
38
39
|
r = requests.get(url, params=params)
|
|
39
40
|
data_json = r.json()
|
|
40
41
|
page_num = int(data_json["result"]["pages"])
|
|
@@ -52,7 +53,7 @@ def stock_profit_forecast_em(symbol: str = "") -> pd.DataFrame:
|
|
|
52
53
|
r = requests.get(url, params=params)
|
|
53
54
|
data_json = r.json()
|
|
54
55
|
temp_df = pd.DataFrame(data_json["result"]["data"])
|
|
55
|
-
big_df = pd.concat([big_df, temp_df], ignore_index=True)
|
|
56
|
+
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
|
|
56
57
|
|
|
57
58
|
big_df.reset_index(inplace=True)
|
|
58
59
|
big_df["index"] = big_df.index + 1
|
|
@@ -94,7 +95,6 @@ def stock_profit_forecast_em(symbol: str = "") -> pd.DataFrame:
|
|
|
94
95
|
"_",
|
|
95
96
|
"_",
|
|
96
97
|
]
|
|
97
|
-
|
|
98
98
|
big_df = big_df[
|
|
99
99
|
[
|
|
100
100
|
"序号",
|
|
@@ -112,11 +112,12 @@ def stock_profit_forecast_em(symbol: str = "") -> pd.DataFrame:
|
|
|
112
112
|
f"{year4}预测每股收益",
|
|
113
113
|
]
|
|
114
114
|
]
|
|
115
|
-
big_df["机构投资评级(近六个月)-买入"]
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
big_df["机构投资评级(近六个月)
|
|
119
|
-
|
|
115
|
+
big_df["机构投资评级(近六个月)-买入"] = big_df[
|
|
116
|
+
"机构投资评级(近六个月)-买入"
|
|
117
|
+
].fillna(0)
|
|
118
|
+
big_df["机构投资评级(近六个月)-增持"] = big_df[
|
|
119
|
+
"机构投资评级(近六个月)-增持"
|
|
120
|
+
].fillna(0)
|
|
120
121
|
big_df["研报数"] = pd.to_numeric(big_df["研报数"], errors="coerce")
|
|
121
122
|
big_df["机构投资评级(近六个月)-买入"] = pd.to_numeric(
|
|
122
123
|
big_df["机构投资评级(近六个月)-买入"], errors="coerce"
|
|
@@ -133,10 +134,27 @@ def stock_profit_forecast_em(symbol: str = "") -> pd.DataFrame:
|
|
|
133
134
|
big_df["机构投资评级(近六个月)-卖出"] = pd.to_numeric(
|
|
134
135
|
big_df["机构投资评级(近六个月)-卖出"], errors="coerce"
|
|
135
136
|
)
|
|
136
|
-
big_df[
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
big_df[
|
|
137
|
+
big_df["机构投资评级(近六个月)-中性"] = big_df[
|
|
138
|
+
"机构投资评级(近六个月)-中性"
|
|
139
|
+
].fillna(0)
|
|
140
|
+
big_df["机构投资评级(近六个月)-减持"] = big_df[
|
|
141
|
+
"机构投资评级(近六个月)-减持"
|
|
142
|
+
].fillna(0)
|
|
143
|
+
big_df["机构投资评级(近六个月)-卖出"] = big_df[
|
|
144
|
+
"机构投资评级(近六个月)-卖出"
|
|
145
|
+
].fillna(0)
|
|
146
|
+
big_df[f"{year1}预测每股收益"] = pd.to_numeric(
|
|
147
|
+
big_df[f"{year1}预测每股收益"], errors="coerce"
|
|
148
|
+
)
|
|
149
|
+
big_df[f"{year2}预测每股收益"] = pd.to_numeric(
|
|
150
|
+
big_df[f"{year2}预测每股收益"], errors="coerce"
|
|
151
|
+
)
|
|
152
|
+
big_df[f"{year3}预测每股收益"] = pd.to_numeric(
|
|
153
|
+
big_df[f"{year3}预测每股收益"], errors="coerce"
|
|
154
|
+
)
|
|
155
|
+
big_df[f"{year4}预测每股收益"] = pd.to_numeric(
|
|
156
|
+
big_df[f"{year4}预测每股收益"], errors="coerce"
|
|
157
|
+
)
|
|
140
158
|
big_df.sort_values(["研报数"], ascending=False, inplace=True, ignore_index=True)
|
|
141
159
|
big_df["序号"] = range(1, len(big_df) + 1)
|
|
142
160
|
return big_df
|
|
@@ -5,13 +5,16 @@ Date: 2024/1/7 15:00
|
|
|
5
5
|
Desc: 东方财富网-数据中心-研究报告-盈利预测
|
|
6
6
|
https://data.eastmoney.com/report/profitforecast.jshtml
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
from io import StringIO
|
|
9
10
|
|
|
10
11
|
import pandas as pd
|
|
11
12
|
import requests
|
|
12
13
|
|
|
13
14
|
|
|
14
|
-
def stock_hk_profit_forecast_et(
|
|
15
|
+
def stock_hk_profit_forecast_et(
|
|
16
|
+
symbol: str = "09999", indicator: str = "盈利预测概览"
|
|
17
|
+
) -> pd.DataFrame:
|
|
15
18
|
"""
|
|
16
19
|
经济通-公司资料-盈利预测
|
|
17
20
|
https://www.etnet.com.hk/www/sc/stocks/realtime/quote_profit.php?code=9999
|
|
@@ -46,58 +49,78 @@ def stock_hk_profit_forecast_et(symbol: str = "09999", indicator: str = "盈利
|
|
|
46
49
|
return temp_df
|
|
47
50
|
elif indicator == "综合盈利预测":
|
|
48
51
|
temp_df = pd.read_html(StringIO(r.text), header=0)[3]
|
|
49
|
-
temp_df.rename(
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
temp_df[
|
|
67
|
-
temp_df[
|
|
68
|
-
|
|
52
|
+
temp_df.rename(
|
|
53
|
+
columns={
|
|
54
|
+
"纯利/(亏损) (百万元人民币)": "纯利/亏损",
|
|
55
|
+
"纯利/(亏损) (百万港元)": "纯利/亏损",
|
|
56
|
+
"每股盈利/ (亏损)(分)": "每股盈利/每股亏损",
|
|
57
|
+
"每股盈利/ (亏损)(港仙)": "每股盈利/每股亏损",
|
|
58
|
+
"每股派息 (分)": "每股派息",
|
|
59
|
+
"每股派息 (港仙)": "每股派息",
|
|
60
|
+
"每股资产净值 (人民币元)": "每股资产净值",
|
|
61
|
+
"每股资产净值 (港元)": "每股资产净值",
|
|
62
|
+
"最高 (百万元人民币)": "最高",
|
|
63
|
+
"最高 (百万港元)": "最高",
|
|
64
|
+
"最低 (百万元人民币)": "最低",
|
|
65
|
+
"最低 (百万港元)": "最低",
|
|
66
|
+
},
|
|
67
|
+
inplace=True,
|
|
68
|
+
)
|
|
69
|
+
temp_df["纯利/亏损"] = pd.to_numeric(temp_df["纯利/亏损"], errors="coerce")
|
|
70
|
+
temp_df["每股盈利/每股亏损"] = pd.to_numeric(
|
|
71
|
+
temp_df["每股盈利/每股亏损"], errors="coerce"
|
|
72
|
+
)
|
|
73
|
+
temp_df["每股派息"] = pd.to_numeric(temp_df["每股派息"], errors="coerce")
|
|
74
|
+
temp_df["每股资产净值"] = pd.to_numeric(
|
|
75
|
+
temp_df["每股资产净值"], errors="coerce"
|
|
76
|
+
)
|
|
77
|
+
temp_df["最高"] = pd.to_numeric(temp_df["最高"], errors="coerce")
|
|
78
|
+
temp_df["最低"] = pd.to_numeric(temp_df["最低"], errors="coerce")
|
|
69
79
|
return temp_df
|
|
70
80
|
elif indicator == "盈利预测概览":
|
|
71
81
|
temp_df = pd.read_html(StringIO(r.text), header=0)[4]
|
|
72
|
-
del temp_df[
|
|
73
|
-
temp_df.rename(
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
+
del temp_df["目标价* (港元).1"]
|
|
83
|
+
temp_df.rename(
|
|
84
|
+
columns={
|
|
85
|
+
"纯利/(亏损) (百万元人民币)": "纯利/亏损",
|
|
86
|
+
"纯利/(亏损) (百万港元)": "纯利/亏损",
|
|
87
|
+
"每股盈利*/ (亏损) (港仙)": "每股盈利",
|
|
88
|
+
"每股盈利*/ (亏损) (分)": "每股盈利",
|
|
89
|
+
"每股派息* (分)": "每股派息",
|
|
90
|
+
"每股派息* (港仙)": "每股派息",
|
|
91
|
+
"目标价* (港元)": "目标价",
|
|
92
|
+
},
|
|
93
|
+
inplace=True,
|
|
94
|
+
)
|
|
82
95
|
temp_df.dropna(inplace=True)
|
|
83
|
-
temp_df[
|
|
84
|
-
temp_df[
|
|
85
|
-
temp_df[
|
|
86
|
-
temp_df[
|
|
87
|
-
temp_df[
|
|
88
|
-
|
|
96
|
+
temp_df["纯利/亏损"] = pd.to_numeric(temp_df["纯利/亏损"], errors="coerce")
|
|
97
|
+
temp_df["每股盈利"] = pd.to_numeric(temp_df["每股盈利"], errors="coerce")
|
|
98
|
+
temp_df["每股派息"] = pd.to_numeric(temp_df["每股派息"], errors="coerce")
|
|
99
|
+
temp_df["目标价"] = pd.to_numeric(temp_df["目标价"], errors="coerce")
|
|
100
|
+
temp_df["更新日期"] = pd.to_datetime(
|
|
101
|
+
temp_df["更新日期"], errors="coerce", dayfirst=True
|
|
102
|
+
).dt.date
|
|
103
|
+
temp_df["财政年度"] = temp_df["财政年度"].astype(int).astype(str)
|
|
89
104
|
return temp_df
|
|
90
105
|
|
|
91
106
|
|
|
92
107
|
if __name__ == "__main__":
|
|
93
|
-
stock_hk_profit_forecast_et_df = stock_hk_profit_forecast_et(
|
|
108
|
+
stock_hk_profit_forecast_et_df = stock_hk_profit_forecast_et(
|
|
109
|
+
symbol="09999", indicator="评级总览"
|
|
110
|
+
)
|
|
94
111
|
print(stock_hk_profit_forecast_et_df)
|
|
95
112
|
|
|
96
|
-
stock_hk_profit_forecast_et_df = stock_hk_profit_forecast_et(
|
|
113
|
+
stock_hk_profit_forecast_et_df = stock_hk_profit_forecast_et(
|
|
114
|
+
symbol="09999", indicator="去年度业绩表现"
|
|
115
|
+
)
|
|
97
116
|
print(stock_hk_profit_forecast_et_df)
|
|
98
117
|
|
|
99
|
-
stock_hk_profit_forecast_et_df = stock_hk_profit_forecast_et(
|
|
118
|
+
stock_hk_profit_forecast_et_df = stock_hk_profit_forecast_et(
|
|
119
|
+
symbol="09999", indicator="综合盈利预测"
|
|
120
|
+
)
|
|
100
121
|
print(stock_hk_profit_forecast_et_df)
|
|
101
122
|
|
|
102
|
-
stock_hk_profit_forecast_et_df = stock_hk_profit_forecast_et(
|
|
123
|
+
stock_hk_profit_forecast_et_df = stock_hk_profit_forecast_et(
|
|
124
|
+
symbol="09999", indicator="盈利预测概览"
|
|
125
|
+
)
|
|
103
126
|
print(stock_hk_profit_forecast_et_df)
|
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date:
|
|
4
|
+
Date: 2025/3/1 15:00
|
|
5
5
|
Desc: 同花顺-盈利预测
|
|
6
6
|
https://basic.10jqka.com.cn/new/600519/worth.html
|
|
7
7
|
"""
|
|
8
|
+
|
|
9
|
+
from io import StringIO
|
|
10
|
+
|
|
8
11
|
import pandas as pd
|
|
9
12
|
import requests
|
|
10
13
|
|
|
14
|
+
from akshare.utils.cons import headers
|
|
15
|
+
|
|
11
16
|
|
|
12
17
|
def stock_profit_forecast_ths(
|
|
13
18
|
symbol: str = "600519", indicator: str = "预测年报每股收益"
|
|
@@ -23,42 +28,88 @@ def stock_profit_forecast_ths(
|
|
|
23
28
|
:rtype: pandas.DataFrame
|
|
24
29
|
"""
|
|
25
30
|
url = f"https://basic.10jqka.com.cn/new/{symbol}/worth.html"
|
|
26
|
-
headers = {
|
|
27
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
|
|
28
|
-
}
|
|
29
31
|
r = requests.get(url, headers=headers)
|
|
30
32
|
r.encoding = "gbk"
|
|
31
|
-
if
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
columns_list
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
33
|
+
if "本年度暂无机构做出业绩预测" in r.text:
|
|
34
|
+
# 处理 `本年度暂无机构做出业绩预测` 的情况
|
|
35
|
+
if indicator == "预测年报每股收益":
|
|
36
|
+
return pd.DataFrame()
|
|
37
|
+
elif indicator == "预测年报净利润":
|
|
38
|
+
return pd.DataFrame()
|
|
39
|
+
elif indicator == "业绩预测详表-机构":
|
|
40
|
+
temp_df = pd.read_html(StringIO(r.text))[0]
|
|
41
|
+
columns_list = []
|
|
42
|
+
for item in temp_df.columns:
|
|
43
|
+
columns_list.append(item[1])
|
|
44
|
+
columns_list[2] = "预测年报每股收益" + columns_list[2]
|
|
45
|
+
columns_list[3] = "预测年报每股收益" + columns_list[3]
|
|
46
|
+
columns_list[4] = "预测年报每股收益" + columns_list[4]
|
|
47
|
+
columns_list[5] = "预测年报净利润" + columns_list[5]
|
|
48
|
+
columns_list[6] = "预测年报净利润" + columns_list[6]
|
|
49
|
+
columns_list[7] = "预测年报净利润" + columns_list[7]
|
|
50
|
+
temp_df.columns = columns_list
|
|
51
|
+
temp_df["报告日期"] = pd.to_datetime(
|
|
52
|
+
temp_df["报告日期"], errors="coerce"
|
|
53
|
+
).dt.date
|
|
54
|
+
return temp_df
|
|
55
|
+
elif indicator == "业绩预测详表-详细指标预测":
|
|
56
|
+
temp_df = pd.read_html(StringIO(r.text))[1]
|
|
57
|
+
temp_df.columns = [
|
|
58
|
+
item.replace("(", "-").replace(")", "") for item in temp_df.columns
|
|
59
|
+
]
|
|
60
|
+
return temp_df
|
|
61
|
+
else:
|
|
62
|
+
return pd.DataFrame()
|
|
63
|
+
else:
|
|
64
|
+
if indicator == "预测年报每股收益":
|
|
65
|
+
temp_df = pd.read_html(StringIO(r.text))[0]
|
|
66
|
+
temp_df["年度"] = temp_df["年度"].astype(str)
|
|
67
|
+
return temp_df
|
|
68
|
+
elif indicator == "预测年报净利润":
|
|
69
|
+
temp_df = pd.read_html(StringIO(r.text))[1]
|
|
70
|
+
temp_df["年度"] = temp_df["年度"].astype(str)
|
|
71
|
+
return temp_df
|
|
72
|
+
elif indicator == "业绩预测详表-机构":
|
|
73
|
+
temp_df = pd.read_html(StringIO(r.text))[2]
|
|
74
|
+
columns_list = []
|
|
75
|
+
for item in temp_df.columns:
|
|
76
|
+
columns_list.append(item[1])
|
|
77
|
+
columns_list[2] = "预测年报每股收益" + columns_list[2]
|
|
78
|
+
columns_list[3] = "预测年报每股收益" + columns_list[3]
|
|
79
|
+
columns_list[4] = "预测年报每股收益" + columns_list[4]
|
|
80
|
+
columns_list[5] = "预测年报净利润" + columns_list[5]
|
|
81
|
+
columns_list[6] = "预测年报净利润" + columns_list[6]
|
|
82
|
+
columns_list[7] = "预测年报净利润" + columns_list[7]
|
|
83
|
+
temp_df.columns = columns_list
|
|
84
|
+
temp_df["报告日期"] = pd.to_datetime(temp_df["报告日期"]).dt.date
|
|
85
|
+
return temp_df
|
|
86
|
+
elif indicator == "业绩预测详表-详细指标预测":
|
|
87
|
+
temp_df = pd.read_html(StringIO(r.text))[3]
|
|
88
|
+
temp_df.columns = [
|
|
89
|
+
item.replace("(", "-").replace(")", "") for item in temp_df.columns
|
|
90
|
+
]
|
|
91
|
+
return temp_df
|
|
92
|
+
else:
|
|
93
|
+
return pd.DataFrame()
|
|
59
94
|
|
|
60
95
|
|
|
61
96
|
if __name__ == "__main__":
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
97
|
+
stock_profit_forecast_ths_df = stock_profit_forecast_ths(
|
|
98
|
+
symbol="600519", indicator="预测年报每股收益"
|
|
99
|
+
)
|
|
100
|
+
print(stock_profit_forecast_ths_df)
|
|
101
|
+
|
|
102
|
+
stock_profit_forecast_ths_df = stock_profit_forecast_ths(
|
|
103
|
+
symbol="600519", indicator="预测年报净利润"
|
|
104
|
+
)
|
|
105
|
+
print(stock_profit_forecast_ths_df)
|
|
106
|
+
|
|
107
|
+
stock_profit_forecast_ths_df = stock_profit_forecast_ths(
|
|
108
|
+
symbol="600519", indicator="业绩预测详表-机构"
|
|
109
|
+
)
|
|
110
|
+
print(stock_profit_forecast_ths_df)
|
|
111
|
+
|
|
112
|
+
stock_profit_forecast_ths_df = stock_profit_forecast_ths(
|
|
113
|
+
symbol="600519", indicator="业绩预测详表-详细指标预测"
|
|
114
|
+
)
|
|
115
|
+
print(stock_profit_forecast_ths_df)
|
|
@@ -5,6 +5,7 @@ Date: 2022/1/7 13:40
|
|
|
5
5
|
Desc: 新浪财经-机构推荐池
|
|
6
6
|
http://stock.finance.sina.com.cn/stock/go.php/vIR_RatingNewest/index.phtml
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
import pandas as pd
|
|
9
10
|
import requests
|
|
10
11
|
from bs4 import BeautifulSoup
|
|
@@ -26,7 +27,10 @@ def stock_institute_recommend(symbol: str = "投资评级选股") -> pd.DataFram
|
|
|
26
27
|
}
|
|
27
28
|
r = requests.get(url, params=params)
|
|
28
29
|
soup = BeautifulSoup(r.text, "lxml")
|
|
29
|
-
indicator_map = {
|
|
30
|
+
indicator_map = {
|
|
31
|
+
item.find("a").text: item.find("a")["href"]
|
|
32
|
+
for item in soup.find(attrs={"id": "leftMenu"}).find_all("dd")[1].find_all("li")
|
|
33
|
+
}
|
|
30
34
|
url = indicator_map[symbol]
|
|
31
35
|
params = {
|
|
32
36
|
"num": "10000",
|
|
@@ -90,10 +94,22 @@ def stock_institute_recommend_detail(symbol: str = "000001") -> pd.DataFrame:
|
|
|
90
94
|
return temp_df
|
|
91
95
|
|
|
92
96
|
|
|
93
|
-
if __name__ ==
|
|
94
|
-
for item in [
|
|
97
|
+
if __name__ == "__main__":
|
|
98
|
+
for item in [
|
|
99
|
+
"最新投资评级",
|
|
100
|
+
"上调评级股票",
|
|
101
|
+
"下调评级股票",
|
|
102
|
+
"股票综合评级",
|
|
103
|
+
"首次评级股票",
|
|
104
|
+
"目标涨幅排名",
|
|
105
|
+
"机构关注度",
|
|
106
|
+
"行业关注度",
|
|
107
|
+
"投资评级选股",
|
|
108
|
+
]:
|
|
95
109
|
stock_institute_recommend_df = stock_institute_recommend(symbol=item)
|
|
96
110
|
print(stock_institute_recommend_df)
|
|
97
111
|
|
|
98
|
-
stock_institute_recommend_detail_df = stock_institute_recommend_detail(
|
|
112
|
+
stock_institute_recommend_detail_df = stock_institute_recommend_detail(
|
|
113
|
+
symbol="002709"
|
|
114
|
+
)
|
|
99
115
|
print(stock_institute_recommend_detail_df)
|
|
@@ -1,69 +1,13 @@
|
|
|
1
1
|
# -*- coding:utf-8 -*-
|
|
2
2
|
# !/usr/bin/env python
|
|
3
3
|
"""
|
|
4
|
-
Date:
|
|
4
|
+
Date: 2025/5/6 14:30
|
|
5
5
|
Desc: 主营构成
|
|
6
6
|
https://emweb.securities.eastmoney.com/PC_HSF10/BusinessAnalysis/Index?type=web&code=SH688041#
|
|
7
|
-
http://f10.emoney.cn/f10/zbyz/1000001
|
|
8
7
|
"""
|
|
9
|
-
from io import StringIO
|
|
10
8
|
|
|
11
9
|
import pandas as pd
|
|
12
10
|
import requests
|
|
13
|
-
from bs4 import BeautifulSoup
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def stock_zygc_ym(symbol: str = "000001") -> pd.DataFrame:
|
|
17
|
-
"""
|
|
18
|
-
益盟-F10-主营构成
|
|
19
|
-
http://f10.emoney.cn/f10/zbyz/1000001
|
|
20
|
-
:param symbol: 股票代码
|
|
21
|
-
:type symbol: str
|
|
22
|
-
:return: 主营构成
|
|
23
|
-
:rtype: pandas.DataFrame
|
|
24
|
-
"""
|
|
25
|
-
url = f"http://f10.emoney.cn/f10/zygc/{symbol}"
|
|
26
|
-
r = requests.get(url)
|
|
27
|
-
soup = BeautifulSoup(r.text, "lxml")
|
|
28
|
-
year_list = [
|
|
29
|
-
item.text.strip()
|
|
30
|
-
for item in soup.find(attrs={"class": "swlab_t"}).find_all("li")
|
|
31
|
-
]
|
|
32
|
-
|
|
33
|
-
big_df = pd.DataFrame()
|
|
34
|
-
for i, item in enumerate(year_list, 2):
|
|
35
|
-
temp_df = pd.read_html(StringIO(r.text), header=0)[i]
|
|
36
|
-
temp_df.columns = [
|
|
37
|
-
"分类方向",
|
|
38
|
-
"分类",
|
|
39
|
-
"营业收入",
|
|
40
|
-
"营业收入-同比增长",
|
|
41
|
-
"营业收入-占主营收入比",
|
|
42
|
-
"营业成本",
|
|
43
|
-
"营业成本-同比增长",
|
|
44
|
-
"营业成本-占主营成本比",
|
|
45
|
-
"毛利率",
|
|
46
|
-
"毛利率-同比增长",
|
|
47
|
-
]
|
|
48
|
-
temp_df["报告期"] = item
|
|
49
|
-
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
|
|
50
|
-
|
|
51
|
-
big_df = big_df[
|
|
52
|
-
[
|
|
53
|
-
"报告期",
|
|
54
|
-
"分类方向",
|
|
55
|
-
"分类",
|
|
56
|
-
"营业收入",
|
|
57
|
-
"营业收入-同比增长",
|
|
58
|
-
"营业收入-占主营收入比",
|
|
59
|
-
"营业成本",
|
|
60
|
-
"营业成本-同比增长",
|
|
61
|
-
"营业成本-占主营成本比",
|
|
62
|
-
"毛利率",
|
|
63
|
-
"毛利率-同比增长",
|
|
64
|
-
]
|
|
65
|
-
]
|
|
66
|
-
return big_df
|
|
67
11
|
|
|
68
12
|
|
|
69
13
|
def stock_zygc_em(symbol: str = "SH688041") -> pd.DataFrame:
|
|
@@ -113,8 +57,10 @@ def stock_zygc_em(symbol: str = "SH688041") -> pd.DataFrame:
|
|
|
113
57
|
"毛利率",
|
|
114
58
|
]
|
|
115
59
|
]
|
|
116
|
-
temp_df["报告日期"] = pd.to_datetime(temp_df["报告日期"]).dt.date
|
|
117
|
-
temp_df["分类类型"] = temp_df["分类类型"].map(
|
|
60
|
+
temp_df["报告日期"] = pd.to_datetime(temp_df["报告日期"], errors="coerce").dt.date
|
|
61
|
+
temp_df["分类类型"] = temp_df["分类类型"].map(
|
|
62
|
+
{"2": "按产品分类", "3": "按地区分类"}
|
|
63
|
+
)
|
|
118
64
|
temp_df["主营收入"] = pd.to_numeric(temp_df["主营收入"], errors="coerce")
|
|
119
65
|
temp_df["收入比例"] = pd.to_numeric(temp_df["收入比例"], errors="coerce")
|
|
120
66
|
temp_df["主营成本"] = pd.to_numeric(temp_df["主营成本"], errors="coerce")
|
|
@@ -126,8 +72,5 @@ def stock_zygc_em(symbol: str = "SH688041") -> pd.DataFrame:
|
|
|
126
72
|
|
|
127
73
|
|
|
128
74
|
if __name__ == "__main__":
|
|
129
|
-
stock_zygc_ym_df = stock_zygc_ym(symbol="000001")
|
|
130
|
-
print(stock_zygc_ym_df)
|
|
131
|
-
|
|
132
75
|
stock_zygc_em_df = stock_zygc_em(symbol="SH688041")
|
|
133
76
|
print(stock_zygc_em_df)
|
akshare/utils/context.py
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
class AkshareConfig:
|
|
2
|
+
_instance = None
|
|
3
|
+
|
|
4
|
+
def __new__(cls):
|
|
5
|
+
if cls._instance is None:
|
|
6
|
+
cls._instance = super().__new__(cls)
|
|
7
|
+
cls._instance.proxies = None
|
|
8
|
+
return cls._instance
|
|
9
|
+
|
|
10
|
+
@classmethod
|
|
11
|
+
def set_proxies(cls, proxies):
|
|
12
|
+
cls().proxies = proxies
|
|
13
|
+
|
|
14
|
+
@classmethod
|
|
15
|
+
def get_proxies(cls):
|
|
16
|
+
return cls().proxies
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
config = AkshareConfig()
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# 导出 set_proxies 函数
|
|
23
|
+
def set_proxies(proxies):
|
|
24
|
+
config.set_proxies(proxies)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def get_proxies():
|
|
28
|
+
return config.get_proxies()
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class ProxyContext:
|
|
32
|
+
def __init__(self, proxies):
|
|
33
|
+
self.proxies = proxies
|
|
34
|
+
self.old_proxies = None
|
|
35
|
+
|
|
36
|
+
def __enter__(self):
|
|
37
|
+
self.old_proxies = config.get_proxies()
|
|
38
|
+
config.set_proxies(self.proxies)
|
|
39
|
+
return self
|
|
40
|
+
|
|
41
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
42
|
+
config.set_proxies(self.old_proxies)
|
|
43
|
+
return False # 不处理异常
|