akshare 1.13.46__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 +757 -161
- akshare/air/air_hebei.py +79 -53
- akshare/air/air_zhenqi.py +3 -7
- akshare/air/cons.py +1 -0
- akshare/air/crypto.js +1 -1
- akshare/air/outcrypto.js +1 -1
- akshare/air/sunrise_tad.py +32 -17
- 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 +75 -48
- akshare/bond/bond_convert.py +10 -9
- akshare/bond/bond_em.py +37 -17
- akshare/bond/bond_info_cm.py +28 -8
- akshare/bond/bond_issue_cninfo.py +73 -30
- akshare/bond/bond_summary.py +38 -37
- akshare/bond/bond_zh_cov.py +31 -40
- akshare/bond/bond_zh_sina.py +61 -51
- 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/currency/currency_safe.py +7 -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 +163 -117
- akshare/economic/macro_china_hk.py +0 -1
- akshare/economic/macro_china_nbs.py +24 -7
- akshare/economic/macro_euro.py +103 -56
- akshare/economic/macro_finance_ths.py +135 -0
- akshare/economic/macro_germany.py +1 -1
- akshare/economic/macro_info_ws.py +100 -0
- 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 +94 -126
- akshare/energy/energy_oil_em.py +1 -2
- akshare/event/cons.py +1 -0
- akshare/event/migration.py +3 -2
- 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 +15 -48
- 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_amac.py +38 -15
- 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 +76 -27
- akshare/fund/fund_etf_ths.py +95 -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 +78 -66
- akshare/fund/fund_position_lg.py +19 -8
- akshare/fund/fund_rank_em.py +90 -84
- akshare/fund/fund_rating.py +33 -12
- akshare/fund/fund_report_cninfo.py +63 -48
- 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 +141 -46
- akshare/futures/cot.py +89 -88
- akshare/futures/futures_basis.py +99 -33
- akshare/futures/futures_comex_em.py +1 -0
- akshare/futures/futures_comm_ctp.py +13 -2
- akshare/futures/futures_contract_detail.py +59 -9
- akshare/futures/futures_daily_bar.py +75 -62
- 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 +79 -61
- 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 +1 -2
- akshare/futures/futures_to_spot.py +43 -39
- akshare/futures/futures_warehouse_receipt.py +53 -48
- akshare/futures/futures_zh_sina.py +4 -4
- 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 +7 -8
- akshare/futures_derivative/futures_cot_sina.py +28 -19
- akshare/futures_derivative/futures_index_sina.py +25 -13
- akshare/fx/cons.py +12 -7
- akshare/fx/currency_investing.py +19 -285
- 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_cflp.py +29 -26
- akshare/index/index_cni.py +89 -91
- akshare/index/index_cons.py +26 -10
- akshare/index/index_csindex.py +68 -0
- akshare/index/index_cx.py +263 -62
- 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 +38 -38
- akshare/index/index_spot.py +9 -5
- akshare/index/index_stock_hk.py +6 -10
- akshare/index/index_stock_us_sina.py +1 -1
- akshare/index/index_stock_zh.py +193 -101
- akshare/index/index_stock_zh_csindex.py +15 -369
- akshare/index/index_sugar.py +18 -4
- akshare/index/index_sw.py +62 -34
- akshare/index/index_yw.py +53 -75
- akshare/index/index_zh_em.py +15 -82
- akshare/interest_rate/interbank_rate_em.py +14 -10
- akshare/movie/artist_yien.py +32 -5
- akshare/movie/jm.js +0 -1
- akshare/movie/movie_yien.py +92 -18
- akshare/movie/video_yien.py +28 -5
- akshare/news/__init__.py +1 -1
- akshare/news/news_baidu.py +395 -220
- akshare/news/news_cctv.py +38 -38
- akshare/news/news_stock.py +49 -13
- akshare/nlp/nlp_interface.py +7 -8
- akshare/option/cons.py +12 -12
- akshare/option/option_comm_qihuo.py +86 -0
- akshare/option/option_commodity.py +355 -211
- 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 +145 -0
- akshare/option/option_em.py +4 -8
- akshare/option/option_finance.py +60 -12
- akshare/option/option_finance_sina.py +28 -26
- akshare/option/option_lhb_em.py +62 -57
- 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 +18 -16
- akshare/option/option_value_analysis_em.py +62 -55
- akshare/other/__init__.py +1 -1
- akshare/other/other_car_cpca.py +20 -20
- 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 +232 -0
- akshare/spot/spot_price_qh.py +121 -0
- akshare/spot/spot_sge.py +70 -9
- akshare/stock/cons.py +60 -23
- akshare/stock/stock_allotment_cninfo.py +10 -9
- 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_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 +36 -16
- akshare/stock/stock_dzjy_em.py +347 -260
- akshare/stock/stock_fund_em.py +73 -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 +107 -0
- 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 +91 -42
- akshare/stock/stock_hold_control_cninfo.py +100 -15
- akshare/stock/stock_hold_control_em.py +4 -5
- akshare/stock/stock_hold_num_cninfo.py +18 -12
- 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 +25 -20
- akshare/stock/stock_industry_pe_cninfo.py +45 -31
- akshare/stock/stock_industry_sw.py +5 -9
- akshare/stock/stock_info.py +31 -19
- akshare/stock/stock_info_em.py +17 -11
- akshare/stock/stock_intraday_em.py +9 -80
- akshare/stock/stock_intraday_sina.py +2 -2
- 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_profile_em.py +302 -0
- akshare/stock/stock_rank_forecast.py +8 -6
- akshare/stock/stock_repurchase_em.py +7 -2
- akshare/stock/stock_share_changes_cninfo.py +18 -14
- 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 +19 -11
- akshare/stock/stock_us_js.py +3 -2
- akshare/stock/stock_us_pink.py +38 -27
- akshare/stock/stock_us_sina.py +15 -12
- akshare/stock/stock_weibo_nlp.py +18 -20
- akshare/stock/stock_xq.py +36 -9
- akshare/stock/stock_zh_a_sina.py +58 -80
- 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 +32 -55
- akshare/stock/stock_zh_comparison_em.py +250 -0
- akshare/stock/stock_zh_kcb_report.py +11 -9
- 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_below_net_asset_statistics.py +5 -2
- akshare/stock_feature/stock_a_high_low.py +5 -2
- akshare/stock_feature/stock_a_indicator.py +15 -57
- akshare/stock_feature/stock_a_pe_and_pb.py +39 -9
- 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 +144 -252
- akshare/stock_feature/stock_board_industry_ths.py +137 -401
- 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_concept_futu.py +183 -0
- 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 +20 -10
- 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 +33 -15
- akshare/stock_feature/stock_fhps_em.py +62 -26
- akshare/stock_feature/stock_fhps_ths.py +34 -7
- akshare/stock_feature/stock_fund_flow.py +38 -25
- 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 +158 -237
- 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 +8 -81
- akshare/stock_feature/stock_inner_trade_xq.py +38 -31
- akshare/stock_feature/stock_irm_cninfo.py +32 -9
- akshare/stock_feature/stock_jgdy_em.py +43 -40
- akshare/stock_feature/stock_lh_yybpm.py +36 -37
- akshare/stock_feature/stock_lhb_em.py +165 -35
- akshare/stock_feature/stock_lhb_sina.py +93 -46
- akshare/stock_feature/stock_margin_em.py +101 -0
- akshare/stock_feature/{stock_sse_margin.py → stock_margin_sse.py} +21 -17
- akshare/stock_feature/{stock_szse_margin.py → stock_margin_szse.py} +7 -7
- akshare/stock_feature/stock_market_legu.py +4 -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 +152 -8
- akshare/stock_feature/stock_research_report_em.py +55 -20
- akshare/stock_feature/stock_sns_sseinfo.py +15 -12
- akshare/stock_feature/stock_sy_em.py +20 -15
- akshare/stock_feature/stock_technology_ths.py +152 -120
- akshare/stock_feature/stock_tfp_em.py +37 -14
- akshare/stock_feature/stock_three_report_em.py +120 -78
- 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_valuation_baidu.py +3 -2
- 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} +203 -59
- 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 +41 -18
- 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_register_em.py +448 -0
- akshare/stock_fundamental/stock_zygc.py +5 -62
- akshare/tool/trade_date_hist.py +1 -1
- 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/utils/tqdm.py +13 -3
- {akshare-1.13.46.dist-info → akshare-1.17.99.dist-info}/METADATA +56 -86
- akshare-1.17.99.dist-info/RECORD +409 -0
- {akshare-1.13.46.dist-info → akshare-1.17.99.dist-info}/WHEEL +1 -1
- {akshare-1.13.46.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/fortune/fortune_it_juzi.py +0 -123
- 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 -51
- 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/sport/sport_olympic_winter.py +0 -39
- akshare/stock_feature/stock_wencai.py +0 -104
- akshare/stock_fundamental/stock_mda_ym.py +0 -40
- akshare/stock_fundamental/stock_register.py +0 -292
- akshare-1.13.46.dist-info/RECORD +0 -380
- {akshare-1.13.46.dist-info → akshare-1.17.99.dist-info}/top_level.txt +0 -0
|
@@ -1,15 +1,116 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date:
|
|
4
|
+
Date: 2025/3/10 19:30
|
|
5
5
|
Desc: 东方财富-沪深板块-行业板块
|
|
6
6
|
https://quote.eastmoney.com/center/boardlist.html#industry_board
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
import re
|
|
10
|
+
from functools import lru_cache
|
|
9
11
|
|
|
10
12
|
import pandas as pd
|
|
11
13
|
import requests
|
|
12
14
|
|
|
15
|
+
from akshare.utils.func import fetch_paginated_data
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@lru_cache()
|
|
19
|
+
def __stock_board_industry_name_em() -> pd.DataFrame:
|
|
20
|
+
"""
|
|
21
|
+
东方财富网-沪深板块-行业板块-名称
|
|
22
|
+
https://quote.eastmoney.com/center/boardlist.html#industry_board
|
|
23
|
+
:return: 行业板块-名称
|
|
24
|
+
:rtype: pandas.DataFrame
|
|
25
|
+
"""
|
|
26
|
+
url = "https://17.push2.eastmoney.com/api/qt/clist/get"
|
|
27
|
+
params = {
|
|
28
|
+
"pn": "1",
|
|
29
|
+
"pz": "100",
|
|
30
|
+
"po": "1",
|
|
31
|
+
"np": "1",
|
|
32
|
+
"ut": "bd1d9ddb04089700cf9c27f6f7426281",
|
|
33
|
+
"fltt": "2",
|
|
34
|
+
"invt": "2",
|
|
35
|
+
"fid": "f3",
|
|
36
|
+
"fs": "m:90 t:2 f:!50",
|
|
37
|
+
"fields": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,"
|
|
38
|
+
"f23,f24,f25,f26,f22,f33,f11,f62,f128,f136,f115,f152,f124,f107,f104,f105,"
|
|
39
|
+
"f140,f141,f207,f208,f209,f222",
|
|
40
|
+
}
|
|
41
|
+
temp_df = fetch_paginated_data(url, params)
|
|
42
|
+
temp_df.columns = [
|
|
43
|
+
"排名",
|
|
44
|
+
"-",
|
|
45
|
+
"最新价",
|
|
46
|
+
"涨跌幅",
|
|
47
|
+
"涨跌额",
|
|
48
|
+
"-",
|
|
49
|
+
"_",
|
|
50
|
+
"-",
|
|
51
|
+
"换手率",
|
|
52
|
+
"-",
|
|
53
|
+
"-",
|
|
54
|
+
"-",
|
|
55
|
+
"板块代码",
|
|
56
|
+
"-",
|
|
57
|
+
"板块名称",
|
|
58
|
+
"-",
|
|
59
|
+
"-",
|
|
60
|
+
"-",
|
|
61
|
+
"-",
|
|
62
|
+
"总市值",
|
|
63
|
+
"-",
|
|
64
|
+
"-",
|
|
65
|
+
"-",
|
|
66
|
+
"-",
|
|
67
|
+
"-",
|
|
68
|
+
"-",
|
|
69
|
+
"-",
|
|
70
|
+
"-",
|
|
71
|
+
"上涨家数",
|
|
72
|
+
"下跌家数",
|
|
73
|
+
"-",
|
|
74
|
+
"-",
|
|
75
|
+
"-",
|
|
76
|
+
"领涨股票",
|
|
77
|
+
"-",
|
|
78
|
+
"-",
|
|
79
|
+
"领涨股票-涨跌幅",
|
|
80
|
+
"-",
|
|
81
|
+
"-",
|
|
82
|
+
"-",
|
|
83
|
+
"-",
|
|
84
|
+
"-",
|
|
85
|
+
]
|
|
86
|
+
temp_df = temp_df[
|
|
87
|
+
[
|
|
88
|
+
"排名",
|
|
89
|
+
"板块名称",
|
|
90
|
+
"板块代码",
|
|
91
|
+
"最新价",
|
|
92
|
+
"涨跌额",
|
|
93
|
+
"涨跌幅",
|
|
94
|
+
"总市值",
|
|
95
|
+
"换手率",
|
|
96
|
+
"上涨家数",
|
|
97
|
+
"下跌家数",
|
|
98
|
+
"领涨股票",
|
|
99
|
+
"领涨股票-涨跌幅",
|
|
100
|
+
]
|
|
101
|
+
]
|
|
102
|
+
temp_df["最新价"] = pd.to_numeric(temp_df["最新价"], errors="coerce")
|
|
103
|
+
temp_df["涨跌额"] = pd.to_numeric(temp_df["涨跌额"], errors="coerce")
|
|
104
|
+
temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce")
|
|
105
|
+
temp_df["总市值"] = pd.to_numeric(temp_df["总市值"], errors="coerce")
|
|
106
|
+
temp_df["换手率"] = pd.to_numeric(temp_df["换手率"], errors="coerce")
|
|
107
|
+
temp_df["上涨家数"] = pd.to_numeric(temp_df["上涨家数"], errors="coerce")
|
|
108
|
+
temp_df["下跌家数"] = pd.to_numeric(temp_df["下跌家数"], errors="coerce")
|
|
109
|
+
temp_df["领涨股票-涨跌幅"] = pd.to_numeric(
|
|
110
|
+
temp_df["领涨股票-涨跌幅"], errors="coerce"
|
|
111
|
+
)
|
|
112
|
+
return temp_df
|
|
113
|
+
|
|
13
114
|
|
|
14
115
|
def stock_board_industry_name_em() -> pd.DataFrame:
|
|
15
116
|
"""
|
|
@@ -18,10 +119,10 @@ def stock_board_industry_name_em() -> pd.DataFrame:
|
|
|
18
119
|
:return: 行业板块-名称
|
|
19
120
|
:rtype: pandas.DataFrame
|
|
20
121
|
"""
|
|
21
|
-
url = "
|
|
122
|
+
url = "https://17.push2.eastmoney.com/api/qt/clist/get"
|
|
22
123
|
params = {
|
|
23
124
|
"pn": "1",
|
|
24
|
-
"pz": "
|
|
125
|
+
"pz": "100",
|
|
25
126
|
"po": "1",
|
|
26
127
|
"np": "1",
|
|
27
128
|
"ut": "bd1d9ddb04089700cf9c27f6f7426281",
|
|
@@ -29,14 +130,11 @@ def stock_board_industry_name_em() -> pd.DataFrame:
|
|
|
29
130
|
"invt": "2",
|
|
30
131
|
"fid": "f3",
|
|
31
132
|
"fs": "m:90 t:2 f:!50",
|
|
32
|
-
"fields": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,
|
|
33
|
-
"
|
|
133
|
+
"fields": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,"
|
|
134
|
+
"f23,f24,f25,f26,f22,f33,f11,f62,f128,f136,f115,f152,f124,f107,f104,f105,"
|
|
135
|
+
"f140,f141,f207,f208,f209,f222",
|
|
34
136
|
}
|
|
35
|
-
|
|
36
|
-
data_json = r.json()
|
|
37
|
-
temp_df = pd.DataFrame(data_json["data"]["diff"])
|
|
38
|
-
temp_df.reset_index(inplace=True)
|
|
39
|
-
temp_df["index"] = temp_df.index + 1
|
|
137
|
+
temp_df = fetch_paginated_data(url, params)
|
|
40
138
|
temp_df.columns = [
|
|
41
139
|
"排名",
|
|
42
140
|
"-",
|
|
@@ -104,7 +202,9 @@ def stock_board_industry_name_em() -> pd.DataFrame:
|
|
|
104
202
|
temp_df["换手率"] = pd.to_numeric(temp_df["换手率"], errors="coerce")
|
|
105
203
|
temp_df["上涨家数"] = pd.to_numeric(temp_df["上涨家数"], errors="coerce")
|
|
106
204
|
temp_df["下跌家数"] = pd.to_numeric(temp_df["下跌家数"], errors="coerce")
|
|
107
|
-
temp_df["领涨股票-涨跌幅"] = pd.to_numeric(
|
|
205
|
+
temp_df["领涨股票-涨跌幅"] = pd.to_numeric(
|
|
206
|
+
temp_df["领涨股票-涨跌幅"], errors="coerce"
|
|
207
|
+
)
|
|
108
208
|
return temp_df
|
|
109
209
|
|
|
110
210
|
|
|
@@ -117,7 +217,7 @@ def stock_board_industry_spot_em(symbol: str = "小金属") -> pd.DataFrame:
|
|
|
117
217
|
:return: 实时行情
|
|
118
218
|
:rtype: pandas.DataFrame
|
|
119
219
|
"""
|
|
120
|
-
url = "
|
|
220
|
+
url = "https://91.push2.eastmoney.com/api/qt/stock/get"
|
|
121
221
|
field_map = {
|
|
122
222
|
"f43": "最新",
|
|
123
223
|
"f44": "最高",
|
|
@@ -131,41 +231,39 @@ def stock_board_industry_spot_em(symbol: str = "小金属") -> pd.DataFrame:
|
|
|
131
231
|
"f169": "涨跌额",
|
|
132
232
|
}
|
|
133
233
|
|
|
134
|
-
if re.match(r
|
|
234
|
+
if re.match(pattern=r"^BK\d+", string=symbol):
|
|
135
235
|
em_code = symbol
|
|
136
236
|
else:
|
|
137
|
-
industry_listing =
|
|
138
|
-
em_code = industry_listing.query(
|
|
139
|
-
|
|
237
|
+
industry_listing = __stock_board_industry_name_em()
|
|
238
|
+
em_code = industry_listing.query("板块名称 == @symbol")["板块代码"].values[0]
|
|
140
239
|
params = dict(
|
|
141
|
-
fields=
|
|
240
|
+
fields=",".join(field_map.keys()),
|
|
142
241
|
mpi="1000",
|
|
143
242
|
invt="2",
|
|
144
243
|
fltt="1",
|
|
145
244
|
secid=f"90.{em_code}",
|
|
146
|
-
ut="fa5fd1943c7b386f172d6893dbfba10b",
|
|
147
245
|
)
|
|
148
246
|
r = requests.get(url, params=params)
|
|
149
247
|
data_dict = r.json()
|
|
150
248
|
result = pd.DataFrame.from_dict(data_dict["data"], orient="index")
|
|
151
249
|
result.rename(field_map, inplace=True)
|
|
152
250
|
result.reset_index(inplace=True)
|
|
153
|
-
result.columns = [
|
|
154
|
-
result[
|
|
251
|
+
result.columns = ["item", "value"]
|
|
252
|
+
result["value"] = pd.to_numeric(result["value"], errors="coerce")
|
|
155
253
|
|
|
156
254
|
# 各项转换成正常单位. 除了成交量与成交额, 原始数据中已是正常单位(元)
|
|
157
|
-
result[
|
|
255
|
+
result["value"] = result["value"] * 1e-2
|
|
158
256
|
result.iloc[4, 1] = result.iloc[4, 1] * 1e2
|
|
159
257
|
result.iloc[5, 1] = result.iloc[5, 1] * 1e2
|
|
160
258
|
return result
|
|
161
259
|
|
|
162
260
|
|
|
163
261
|
def stock_board_industry_hist_em(
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
262
|
+
symbol: str = "小金属",
|
|
263
|
+
start_date: str = "20211201",
|
|
264
|
+
end_date: str = "20220401",
|
|
265
|
+
period: str = "日k",
|
|
266
|
+
adjust: str = "",
|
|
169
267
|
) -> pd.DataFrame:
|
|
170
268
|
"""
|
|
171
269
|
东方财富网-沪深板块-行业板块-历史行情
|
|
@@ -183,20 +281,20 @@ def stock_board_industry_hist_em(
|
|
|
183
281
|
:return: 历史行情
|
|
184
282
|
:rtype: pandas.DataFrame
|
|
185
283
|
"""
|
|
284
|
+
if re.match(pattern=r"^BK\d+", string=symbol):
|
|
285
|
+
em_code = symbol
|
|
286
|
+
else:
|
|
287
|
+
industry_listing = __stock_board_industry_name_em()
|
|
288
|
+
em_code = industry_listing.query("板块名称 == @symbol")["板块代码"].values[0]
|
|
186
289
|
period_map = {
|
|
187
|
-
"日k":
|
|
188
|
-
"周k":
|
|
189
|
-
"月k":
|
|
290
|
+
"日k": "101",
|
|
291
|
+
"周k": "102",
|
|
292
|
+
"月k": "103",
|
|
190
293
|
}
|
|
191
|
-
stock_board_concept_em_map = stock_board_industry_name_em()
|
|
192
|
-
stock_board_code = stock_board_concept_em_map[
|
|
193
|
-
stock_board_concept_em_map["板块名称"] == symbol
|
|
194
|
-
]["板块代码"].values[0]
|
|
195
294
|
adjust_map = {"": "0", "qfq": "1", "hfq": "2"}
|
|
196
295
|
url = "http://7.push2his.eastmoney.com/api/qt/stock/kline/get"
|
|
197
296
|
params = {
|
|
198
|
-
"secid": f"90.{
|
|
199
|
-
"ut": "fa5fd1943c7b386f172d6893dbfba10b",
|
|
297
|
+
"secid": f"90.{em_code}",
|
|
200
298
|
"fields1": "f1,f2,f3,f4,f5,f6",
|
|
201
299
|
"fields2": "f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61",
|
|
202
300
|
"klt": period_map[period],
|
|
@@ -205,13 +303,10 @@ def stock_board_industry_hist_em(
|
|
|
205
303
|
"end": end_date,
|
|
206
304
|
"smplmt": "10000",
|
|
207
305
|
"lmt": "1000000",
|
|
208
|
-
"_": "1626079488673",
|
|
209
306
|
}
|
|
210
307
|
r = requests.get(url, params=params)
|
|
211
308
|
data_json = r.json()
|
|
212
|
-
temp_df = pd.DataFrame(
|
|
213
|
-
[item.split(",") for item in data_json["data"]["klines"]]
|
|
214
|
-
)
|
|
309
|
+
temp_df = pd.DataFrame([item.split(",") for item in data_json["data"]["klines"]])
|
|
215
310
|
temp_df.columns = [
|
|
216
311
|
"日期",
|
|
217
312
|
"开盘",
|
|
@@ -254,7 +349,7 @@ def stock_board_industry_hist_em(
|
|
|
254
349
|
|
|
255
350
|
|
|
256
351
|
def stock_board_industry_hist_min_em(
|
|
257
|
-
|
|
352
|
+
symbol: str = "小金属", period: str = "5"
|
|
258
353
|
) -> pd.DataFrame:
|
|
259
354
|
"""
|
|
260
355
|
东方财富网-沪深板块-行业板块-分时历史行情
|
|
@@ -266,20 +361,19 @@ def stock_board_industry_hist_min_em(
|
|
|
266
361
|
:return: 分时历史行情
|
|
267
362
|
:rtype: pandas.DataFrame
|
|
268
363
|
"""
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
364
|
+
if re.match(pattern=r"^BK\d+", string=symbol):
|
|
365
|
+
em_code = symbol
|
|
366
|
+
else:
|
|
367
|
+
industry_listing = __stock_board_industry_name_em()
|
|
368
|
+
em_code = industry_listing.query("板块名称 == @symbol")["板块代码"].values[0]
|
|
273
369
|
if period == "1":
|
|
274
370
|
url = "https://push2his.eastmoney.com/api/qt/stock/trends2/get"
|
|
275
371
|
params = {
|
|
276
372
|
"fields1": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13",
|
|
277
373
|
"fields2": "f51,f52,f53,f54,f55,f56,f57,f58",
|
|
278
|
-
"
|
|
279
|
-
"
|
|
280
|
-
"
|
|
281
|
-
"secid": f"90.{stock_board_code}",
|
|
282
|
-
"_": "1687852931312",
|
|
374
|
+
"iscr": "0",
|
|
375
|
+
"ndays": "1",
|
|
376
|
+
"secid": f"90.{em_code}",
|
|
283
377
|
}
|
|
284
378
|
r = requests.get(url, params=params)
|
|
285
379
|
data_json = r.json()
|
|
@@ -306,10 +400,9 @@ def stock_board_industry_hist_min_em(
|
|
|
306
400
|
temp_df["最新价"] = pd.to_numeric(temp_df["最新价"], errors="coerce")
|
|
307
401
|
return temp_df
|
|
308
402
|
else:
|
|
309
|
-
url = "
|
|
403
|
+
url = "https://7.push2his.eastmoney.com/api/qt/stock/kline/get"
|
|
310
404
|
params = {
|
|
311
|
-
"secid": f"90.{
|
|
312
|
-
"ut": "fa5fd1943c7b386f172d6893dbfba10b",
|
|
405
|
+
"secid": f"90.{em_code}",
|
|
313
406
|
"fields1": "f1,f2,f3,f4,f5,f6",
|
|
314
407
|
"fields2": "f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61",
|
|
315
408
|
"klt": period,
|
|
@@ -318,7 +411,6 @@ def stock_board_industry_hist_min_em(
|
|
|
318
411
|
"end": "20500101",
|
|
319
412
|
"smplmt": "10000",
|
|
320
413
|
"lmt": "1000000",
|
|
321
|
-
"_": "1626079488673",
|
|
322
414
|
}
|
|
323
415
|
r = requests.get(url, params=params)
|
|
324
416
|
data_json = r.json()
|
|
@@ -370,19 +462,22 @@ def stock_board_industry_cons_em(symbol: str = "小金属") -> pd.DataFrame:
|
|
|
370
462
|
"""
|
|
371
463
|
东方财富网-沪深板块-行业板块-板块成份
|
|
372
464
|
https://data.eastmoney.com/bkzj/BK1027.html
|
|
373
|
-
:param symbol:
|
|
465
|
+
:param symbol: 板块名称或者板块代码
|
|
374
466
|
:type symbol: str
|
|
375
467
|
:return: 板块成份
|
|
376
468
|
:rtype: pandas.DataFrame
|
|
377
469
|
"""
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
470
|
+
if re.match(pattern=r"^BK\d+", string=symbol):
|
|
471
|
+
stock_board_code = symbol
|
|
472
|
+
else:
|
|
473
|
+
stock_board_concept_em_map = __stock_board_industry_name_em()
|
|
474
|
+
stock_board_code = stock_board_concept_em_map[
|
|
475
|
+
stock_board_concept_em_map["板块名称"] == symbol
|
|
381
476
|
]["板块代码"].values[0]
|
|
382
|
-
url = "
|
|
477
|
+
url = "https://29.push2.eastmoney.com/api/qt/clist/get"
|
|
383
478
|
params = {
|
|
384
479
|
"pn": "1",
|
|
385
|
-
"pz": "
|
|
480
|
+
"pz": "100",
|
|
386
481
|
"po": "1",
|
|
387
482
|
"np": "1",
|
|
388
483
|
"ut": "bd1d9ddb04089700cf9c27f6f7426281",
|
|
@@ -390,14 +485,10 @@ def stock_board_industry_cons_em(symbol: str = "小金属") -> pd.DataFrame:
|
|
|
390
485
|
"invt": "2",
|
|
391
486
|
"fid": "f3",
|
|
392
487
|
"fs": f"b:{stock_board_code} f:!50",
|
|
393
|
-
"fields": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,
|
|
394
|
-
"
|
|
488
|
+
"fields": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,"
|
|
489
|
+
"f23,f24,f25,f22,f11,f62,f128,f136,f115,f152,f45",
|
|
395
490
|
}
|
|
396
|
-
|
|
397
|
-
data_json = r.json()
|
|
398
|
-
temp_df = pd.DataFrame(data_json["data"]["diff"])
|
|
399
|
-
temp_df.reset_index(inplace=True)
|
|
400
|
-
temp_df["index"] = range(1, len(temp_df) + 1)
|
|
491
|
+
temp_df = fetch_paginated_data(url, params)
|
|
401
492
|
temp_df.columns = [
|
|
402
493
|
"序号",
|
|
403
494
|
"_",
|
|
@@ -477,7 +568,11 @@ if __name__ == "__main__":
|
|
|
477
568
|
print(stock_board_industry_spot_em_df)
|
|
478
569
|
|
|
479
570
|
stock_board_industry_hist_em_df = stock_board_industry_hist_em(
|
|
480
|
-
symbol="小金属",
|
|
571
|
+
symbol="小金属",
|
|
572
|
+
start_date="20211201",
|
|
573
|
+
end_date="20240222",
|
|
574
|
+
period="日k",
|
|
575
|
+
adjust="",
|
|
481
576
|
)
|
|
482
577
|
print(stock_board_industry_hist_em_df)
|
|
483
578
|
|
|
@@ -486,7 +581,5 @@ if __name__ == "__main__":
|
|
|
486
581
|
)
|
|
487
582
|
print(stock_board_industry_hist_min_em_df)
|
|
488
583
|
|
|
489
|
-
stock_board_industry_cons_em_df = stock_board_industry_cons_em(
|
|
490
|
-
symbol="小金属"
|
|
491
|
-
)
|
|
584
|
+
stock_board_industry_cons_em_df = stock_board_industry_cons_em(symbol="互联网服务")
|
|
492
585
|
print(stock_board_industry_cons_em_df)
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date:
|
|
4
|
+
Date: 2024/7/24 23:30
|
|
5
5
|
Desc: 巨潮资讯-数据中心-专题统计-公司治理-股权质押
|
|
6
|
-
|
|
6
|
+
https://webapi.cninfo.com.cn/#/thematicStatistics
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
import pandas as pd
|
|
10
|
+
import py_mini_racer
|
|
9
11
|
import requests
|
|
10
|
-
from py_mini_racer import py_mini_racer
|
|
11
12
|
|
|
12
13
|
from akshare.datasets import get_ths_js
|
|
13
14
|
|
|
@@ -21,7 +22,7 @@ def _get_file_content_ths(file: str = "cninfo.js") -> str:
|
|
|
21
22
|
:rtype: str
|
|
22
23
|
"""
|
|
23
24
|
setting_file_path = get_ths_js(file)
|
|
24
|
-
with open(setting_file_path) as f:
|
|
25
|
+
with open(setting_file_path, encoding="utf-8") as f:
|
|
25
26
|
file_data = f.read()
|
|
26
27
|
return file_data
|
|
27
28
|
|
|
@@ -29,13 +30,13 @@ def _get_file_content_ths(file: str = "cninfo.js") -> str:
|
|
|
29
30
|
def stock_cg_equity_mortgage_cninfo(date: str = "20210930") -> pd.DataFrame:
|
|
30
31
|
"""
|
|
31
32
|
巨潮资讯-数据中心-专题统计-公司治理-股权质押
|
|
32
|
-
|
|
33
|
+
https://webapi.cninfo.com.cn/#/thematicStatistics
|
|
33
34
|
:param date: 开始统计时间
|
|
34
35
|
:type date: str
|
|
35
36
|
:return: 股权质押
|
|
36
37
|
:rtype: pandas.DataFrame
|
|
37
38
|
"""
|
|
38
|
-
url = "
|
|
39
|
+
url = "https://webapi.cninfo.com.cn/api/sysapi/p_sysapi1094"
|
|
39
40
|
js_code = py_mini_racer.MiniRacer()
|
|
40
41
|
js_content = _get_file_content_ths("cninfo.js")
|
|
41
42
|
js_code.eval(js_content)
|
|
@@ -48,11 +49,12 @@ def stock_cg_equity_mortgage_cninfo(date: str = "20210930") -> pd.DataFrame:
|
|
|
48
49
|
"Cache-Control": "no-cache",
|
|
49
50
|
"Content-Length": "0",
|
|
50
51
|
"Host": "webapi.cninfo.com.cn",
|
|
51
|
-
"Origin": "
|
|
52
|
+
"Origin": "https://webapi.cninfo.com.cn",
|
|
52
53
|
"Pragma": "no-cache",
|
|
53
54
|
"Proxy-Connection": "keep-alive",
|
|
54
|
-
"Referer": "
|
|
55
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
|
|
55
|
+
"Referer": "https://webapi.cninfo.com.cn/",
|
|
56
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
57
|
+
"Chrome/93.0.4577.63 Safari/537.36",
|
|
56
58
|
"X-Requested-With": "XMLHttpRequest",
|
|
57
59
|
}
|
|
58
60
|
params = {
|
|
@@ -87,11 +89,13 @@ def stock_cg_equity_mortgage_cninfo(date: str = "20210930") -> pd.DataFrame:
|
|
|
87
89
|
"累计质押占总股本比例",
|
|
88
90
|
]
|
|
89
91
|
]
|
|
90
|
-
temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"]).dt.date
|
|
92
|
+
temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
|
|
91
93
|
temp_df["质押数量"] = pd.to_numeric(temp_df["质押数量"], errors="coerce")
|
|
92
94
|
temp_df["占总股本比例"] = pd.to_numeric(temp_df["占总股本比例"], errors="coerce")
|
|
93
95
|
temp_df["质押解除数量"] = pd.to_numeric(temp_df["质押解除数量"], errors="coerce")
|
|
94
|
-
temp_df["累计质押占总股本比例"] = pd.to_numeric(
|
|
96
|
+
temp_df["累计质押占总股本比例"] = pd.to_numeric(
|
|
97
|
+
temp_df["累计质押占总股本比例"], errors="coerce"
|
|
98
|
+
)
|
|
95
99
|
return temp_df
|
|
96
100
|
|
|
97
101
|
|
|
@@ -1,45 +1,30 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date:
|
|
4
|
+
Date: 2024/5/19 18:34
|
|
5
5
|
Desc: 巨潮资讯-数据中心-专题统计-公司治理-对外担保
|
|
6
|
-
|
|
6
|
+
https://webapi.cninfo.com.cn/#/thematicStatistics
|
|
7
7
|
"""
|
|
8
|
-
import time
|
|
9
8
|
|
|
10
9
|
import pandas as pd
|
|
11
10
|
import requests
|
|
12
|
-
|
|
11
|
+
import py_mini_racer
|
|
12
|
+
|
|
13
|
+
from akshare.datasets import get_ths_js
|
|
13
14
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
|
|
28
|
-
enc4 = chr3 & 63;
|
|
29
|
-
if (isNaN(chr2)) {
|
|
30
|
-
enc3 = enc4 = 64;
|
|
31
|
-
} else if (isNaN(chr3)) {
|
|
32
|
-
enc4 = 64;
|
|
33
|
-
}
|
|
34
|
-
output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2)
|
|
35
|
-
+ keyStr.charAt(enc3) + keyStr.charAt(enc4);
|
|
36
|
-
chr1 = chr2 = chr3 = "";
|
|
37
|
-
enc1 = enc2 = enc3 = enc4 = "";
|
|
38
|
-
} while (i < input.length);
|
|
39
|
-
|
|
40
|
-
return output;
|
|
41
|
-
}
|
|
42
|
-
"""
|
|
15
|
+
|
|
16
|
+
def _get_file_content_ths(file: str = "cninfo.js") -> str:
|
|
17
|
+
"""
|
|
18
|
+
获取 JS 文件的内容
|
|
19
|
+
:param file: JS 文件名
|
|
20
|
+
:type file: str
|
|
21
|
+
:return: 文件内容
|
|
22
|
+
:rtype: str
|
|
23
|
+
"""
|
|
24
|
+
setting_file_path = get_ths_js(file)
|
|
25
|
+
with open(setting_file_path, encoding="utf-8") as f:
|
|
26
|
+
file_data = f.read()
|
|
27
|
+
return file_data
|
|
43
28
|
|
|
44
29
|
|
|
45
30
|
def stock_cg_guarantee_cninfo(
|
|
@@ -47,7 +32,7 @@ def stock_cg_guarantee_cninfo(
|
|
|
47
32
|
) -> pd.DataFrame:
|
|
48
33
|
"""
|
|
49
34
|
巨潮资讯-数据中心-专题统计-公司治理-对外担保
|
|
50
|
-
|
|
35
|
+
https://webapi.cninfo.com.cn/#/thematicStatistics
|
|
51
36
|
:param symbol: choice of {"全部", "深市主板", "沪市", "创业板", "科创板"}
|
|
52
37
|
:type symbol: str
|
|
53
38
|
:param start_date: 开始统计时间
|
|
@@ -58,17 +43,17 @@ def stock_cg_guarantee_cninfo(
|
|
|
58
43
|
:rtype: pandas.DataFrame
|
|
59
44
|
"""
|
|
60
45
|
symbol_map = {
|
|
61
|
-
"全部":
|
|
62
|
-
"深市主板":
|
|
63
|
-
"沪市":
|
|
64
|
-
"创业板":
|
|
65
|
-
"科创板":
|
|
46
|
+
"全部": "",
|
|
47
|
+
"深市主板": "012002",
|
|
48
|
+
"沪市": "012001",
|
|
49
|
+
"创业板": "012015",
|
|
50
|
+
"科创板": "012029",
|
|
66
51
|
}
|
|
67
|
-
url = "
|
|
68
|
-
random_time_str = str(int(time.time()))
|
|
52
|
+
url = "https://webapi.cninfo.com.cn/api/sysapi/p_sysapi1054"
|
|
69
53
|
js_code = py_mini_racer.MiniRacer()
|
|
70
|
-
|
|
71
|
-
|
|
54
|
+
js_content = _get_file_content_ths("cninfo.js")
|
|
55
|
+
js_code.eval(js_content)
|
|
56
|
+
mcode = js_code.call("getResCode1")
|
|
72
57
|
headers = {
|
|
73
58
|
"Accept": "*/*",
|
|
74
59
|
"Accept-Encoding": "gzip, deflate",
|
|
@@ -76,12 +61,13 @@ def stock_cg_guarantee_cninfo(
|
|
|
76
61
|
"Cache-Control": "no-cache",
|
|
77
62
|
"Content-Length": "0",
|
|
78
63
|
"Host": "webapi.cninfo.com.cn",
|
|
79
|
-
"
|
|
80
|
-
"Origin": "
|
|
64
|
+
"Accept-Enckey": mcode,
|
|
65
|
+
"Origin": "https://webapi.cninfo.com.cn",
|
|
81
66
|
"Pragma": "no-cache",
|
|
82
67
|
"Proxy-Connection": "keep-alive",
|
|
83
|
-
"Referer": "
|
|
84
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
|
|
68
|
+
"Referer": "https://webapi.cninfo.com.cn/",
|
|
69
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
70
|
+
"Chrome/93.0.4577.63 Safari/537.36",
|
|
85
71
|
"X-Requested-With": "XMLHttpRequest",
|
|
86
72
|
}
|
|
87
73
|
params = {
|
|
@@ -112,10 +98,14 @@ def stock_cg_guarantee_cninfo(
|
|
|
112
98
|
"担保金融占净资产比例",
|
|
113
99
|
]
|
|
114
100
|
]
|
|
115
|
-
temp_df["担保笔数"] = pd.to_numeric(temp_df["担保笔数"])
|
|
116
|
-
temp_df["担保金额"] = pd.to_numeric(temp_df["担保金额"])
|
|
117
|
-
temp_df["归属于母公司所有者权益"] = pd.to_numeric(
|
|
118
|
-
|
|
101
|
+
temp_df["担保笔数"] = pd.to_numeric(temp_df["担保笔数"], errors="coerce")
|
|
102
|
+
temp_df["担保金额"] = pd.to_numeric(temp_df["担保金额"], errors="coerce")
|
|
103
|
+
temp_df["归属于母公司所有者权益"] = pd.to_numeric(
|
|
104
|
+
temp_df["归属于母公司所有者权益"], errors="coerce"
|
|
105
|
+
)
|
|
106
|
+
temp_df["担保金融占净资产比例"] = pd.to_numeric(
|
|
107
|
+
temp_df["担保金融占净资产比例"], errors="coerce"
|
|
108
|
+
)
|
|
119
109
|
return temp_df
|
|
120
110
|
|
|
121
111
|
|