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,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date:
|
|
4
|
+
Date: 2025/12/18 16:00
|
|
5
5
|
Desc: 同花顺-财务指标-主要指标
|
|
6
6
|
https://basic.10jqka.com.cn/new/000063/finance.html
|
|
7
7
|
"""
|
|
@@ -11,9 +11,11 @@ import pandas as pd
|
|
|
11
11
|
import requests
|
|
12
12
|
from bs4 import BeautifulSoup
|
|
13
13
|
|
|
14
|
+
from akshare.utils.cons import headers
|
|
15
|
+
|
|
14
16
|
|
|
15
17
|
def stock_financial_abstract_ths(
|
|
16
|
-
|
|
18
|
+
symbol: str = "000063", indicator: str = "按报告期"
|
|
17
19
|
) -> pd.DataFrame:
|
|
18
20
|
"""
|
|
19
21
|
同花顺-财务指标-主要指标
|
|
@@ -26,14 +28,9 @@ def stock_financial_abstract_ths(
|
|
|
26
28
|
:rtype: pandas.DataFrame
|
|
27
29
|
"""
|
|
28
30
|
url = f"https://basic.10jqka.com.cn/new/{symbol}/finance.html"
|
|
29
|
-
headers = {
|
|
30
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
|
|
31
|
-
"AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
32
|
-
"Chrome/89.0.4389.90 Safari/537.36",
|
|
33
|
-
}
|
|
34
31
|
r = requests.get(url, headers=headers)
|
|
35
|
-
soup = BeautifulSoup(r.text, "lxml")
|
|
36
|
-
data_text = soup.find("p", attrs={"id": "main"}).string
|
|
32
|
+
soup = BeautifulSoup(r.text, features="lxml")
|
|
33
|
+
data_text = soup.find(name="p", attrs={"id": "main"}).string
|
|
37
34
|
data_json = json.loads(data_text)
|
|
38
35
|
df_index = [
|
|
39
36
|
item[0] if isinstance(item, list) else item for item in data_json["title"]
|
|
@@ -53,11 +50,12 @@ def stock_financial_abstract_ths(
|
|
|
53
50
|
temp_df = temp_df.T
|
|
54
51
|
temp_df.reset_index(inplace=True)
|
|
55
52
|
temp_df.rename(columns={"index": "报告期"}, inplace=True)
|
|
53
|
+
temp_df.sort_values(by="报告期", ignore_index=True, inplace=True)
|
|
56
54
|
return temp_df
|
|
57
55
|
|
|
58
56
|
|
|
59
57
|
def stock_financial_debt_ths(
|
|
60
|
-
|
|
58
|
+
symbol: str = "000063", indicator: str = "按报告期"
|
|
61
59
|
) -> pd.DataFrame:
|
|
62
60
|
"""
|
|
63
61
|
同花顺-财务指标-资产负债表
|
|
@@ -71,13 +69,8 @@ def stock_financial_debt_ths(
|
|
|
71
69
|
:rtype: pandas.DataFrame
|
|
72
70
|
"""
|
|
73
71
|
url = f"https://basic.10jqka.com.cn/api/stock/finance/{symbol}_debt.json"
|
|
74
|
-
headers = {
|
|
75
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
|
|
76
|
-
"AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
77
|
-
"Chrome/89.0.4389.90 Safari/537.36",
|
|
78
|
-
}
|
|
79
72
|
r = requests.get(url, headers=headers)
|
|
80
|
-
data_json = json.loads(json.loads(r.text)[
|
|
73
|
+
data_json = json.loads(json.loads(r.text)["flashData"])
|
|
81
74
|
df_index = [
|
|
82
75
|
item[0] if isinstance(item, list) else item for item in data_json["title"]
|
|
83
76
|
]
|
|
@@ -96,7 +89,7 @@ def stock_financial_debt_ths(
|
|
|
96
89
|
|
|
97
90
|
|
|
98
91
|
def stock_financial_benefit_ths(
|
|
99
|
-
|
|
92
|
+
symbol: str = "000063", indicator: str = "按报告期"
|
|
100
93
|
) -> pd.DataFrame:
|
|
101
94
|
"""
|
|
102
95
|
同花顺-财务指标-利润表
|
|
@@ -110,13 +103,8 @@ def stock_financial_benefit_ths(
|
|
|
110
103
|
:rtype: pandas.DataFrame
|
|
111
104
|
"""
|
|
112
105
|
url = f"https://basic.10jqka.com.cn/api/stock/finance/{symbol}_benefit.json"
|
|
113
|
-
headers = {
|
|
114
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
|
|
115
|
-
"AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
116
|
-
"Chrome/89.0.4389.90 Safari/537.36",
|
|
117
|
-
}
|
|
118
106
|
r = requests.get(url, headers=headers)
|
|
119
|
-
data_json = json.loads(json.loads(r.text)[
|
|
107
|
+
data_json = json.loads(json.loads(r.text)["flashData"])
|
|
120
108
|
df_index = [
|
|
121
109
|
item[0] if isinstance(item, list) else item for item in data_json["title"]
|
|
122
110
|
]
|
|
@@ -139,7 +127,7 @@ def stock_financial_benefit_ths(
|
|
|
139
127
|
|
|
140
128
|
|
|
141
129
|
def stock_financial_cash_ths(
|
|
142
|
-
|
|
130
|
+
symbol: str = "000063", indicator: str = "按报告期"
|
|
143
131
|
) -> pd.DataFrame:
|
|
144
132
|
"""
|
|
145
133
|
同花顺-财务指标-现金流量表
|
|
@@ -153,13 +141,8 @@ def stock_financial_cash_ths(
|
|
|
153
141
|
:rtype: pandas.DataFrame
|
|
154
142
|
"""
|
|
155
143
|
url = f"https://basic.10jqka.com.cn/api/stock/finance/{symbol}_cash.json"
|
|
156
|
-
headers = {
|
|
157
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
|
|
158
|
-
"AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
159
|
-
"Chrome/89.0.4389.90 Safari/537.36",
|
|
160
|
-
}
|
|
161
144
|
r = requests.get(url, headers=headers)
|
|
162
|
-
data_json = json.loads(json.loads(r.text)[
|
|
145
|
+
data_json = json.loads(json.loads(r.text)["flashData"])
|
|
163
146
|
df_index = [
|
|
164
147
|
item[0] if isinstance(item, list) else item for item in data_json["title"]
|
|
165
148
|
]
|
|
@@ -181,58 +164,542 @@ def stock_financial_cash_ths(
|
|
|
181
164
|
return temp_df
|
|
182
165
|
|
|
183
166
|
|
|
167
|
+
def __get_market_code(stock_code: str = "000063") -> int:
|
|
168
|
+
"""
|
|
169
|
+
同花顺-财务指标-主要指标-股票所属市场判断
|
|
170
|
+
:param stock_code: 股票代码
|
|
171
|
+
:type stock_code: str
|
|
172
|
+
:return: 同花顺-财务指标-主要指标
|
|
173
|
+
:rtype: pandas.DataFrame
|
|
174
|
+
"""
|
|
175
|
+
# 确保股票代码是字符串并去掉空格
|
|
176
|
+
stock_code = str(stock_code).strip()
|
|
177
|
+
# 检查代码长度
|
|
178
|
+
if len(stock_code) < 6:
|
|
179
|
+
raise "请输入正确的股票代码"
|
|
180
|
+
# 深交所股票: 000, 001, 002, 003, 300开头 (market代码33)
|
|
181
|
+
if stock_code.startswith(('000', '001', '002', '003', '300')):
|
|
182
|
+
return 33
|
|
183
|
+
# 上交所股票: 600, 601, 603, 605, 688开头 (market代码17)
|
|
184
|
+
if stock_code.startswith(('600', '601', '603', '605', '688')):
|
|
185
|
+
return 17
|
|
186
|
+
# 北交所股票: 920开头 (market代码151)
|
|
187
|
+
if stock_code.startswith('920'):
|
|
188
|
+
return 151
|
|
189
|
+
# 其他情况无法识别
|
|
190
|
+
return 0
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def stock_financial_abstract_new_ths(
|
|
194
|
+
symbol: str = "000063", indicator: str = "按报告期"
|
|
195
|
+
) -> pd.DataFrame:
|
|
196
|
+
"""
|
|
197
|
+
同花顺-财务指标-重要指标
|
|
198
|
+
https://basic.10jqka.com.cn/new/000063/finance.html
|
|
199
|
+
:param symbol: 股票代码
|
|
200
|
+
:type symbol: str
|
|
201
|
+
:param indicator: 指标; choice of {"按报告期", "一季度", "二季度", "三季度", "四季度", "按年度"}
|
|
202
|
+
:type indicator: str
|
|
203
|
+
:return: 同花顺-财务指标-主要指标
|
|
204
|
+
:rtype: pandas.DataFrame
|
|
205
|
+
"""
|
|
206
|
+
url = "https://basic.10jqka.com.cn/basicapi/finance/index/v1/app_data/"
|
|
207
|
+
if indicator == "按报告期":
|
|
208
|
+
period = "0"
|
|
209
|
+
elif indicator == "一季度":
|
|
210
|
+
period = "1"
|
|
211
|
+
elif indicator == "二季度":
|
|
212
|
+
period = "2"
|
|
213
|
+
elif indicator == "三季度":
|
|
214
|
+
period = "3"
|
|
215
|
+
elif indicator == "四季度":
|
|
216
|
+
period = "4"
|
|
217
|
+
else:
|
|
218
|
+
period = "4"
|
|
219
|
+
params = {
|
|
220
|
+
'code': symbol,
|
|
221
|
+
'id': 'client_stock_importance',
|
|
222
|
+
'market': __get_market_code(symbol),
|
|
223
|
+
'type': 'stock',
|
|
224
|
+
'page': '1',
|
|
225
|
+
'size': '50',
|
|
226
|
+
'period': period,
|
|
227
|
+
}
|
|
228
|
+
r = requests.get(url, headers=headers, params=params)
|
|
229
|
+
data_json = r.json()
|
|
230
|
+
# 提取财务数据
|
|
231
|
+
financial_data = data_json['data']['data']
|
|
232
|
+
# 创建空列表用于存储处理后的数据
|
|
233
|
+
records = []
|
|
234
|
+
# 收集所有可能的指标字段
|
|
235
|
+
all_metric_fields = set()
|
|
236
|
+
# 首先遍历一次,找出所有的字段名
|
|
237
|
+
for report in financial_data:
|
|
238
|
+
for metric_name, metric_values in report['index_list'].items():
|
|
239
|
+
if isinstance(metric_values, dict):
|
|
240
|
+
all_metric_fields.update(metric_values.keys())
|
|
241
|
+
# 遍历每个报告期的数据
|
|
242
|
+
for report in financial_data:
|
|
243
|
+
report_date = report['date']
|
|
244
|
+
report_name = report['report_name']
|
|
245
|
+
report_period = report['report']
|
|
246
|
+
quarter_name = report['quarter_name']
|
|
247
|
+
# 遍历该报告期的所有财务指标
|
|
248
|
+
for metric_name, metric_values in report['index_list'].items():
|
|
249
|
+
# 基本信息
|
|
250
|
+
record = {
|
|
251
|
+
'report_date': report_date,
|
|
252
|
+
'report_name': report_name,
|
|
253
|
+
'report_period': report_period,
|
|
254
|
+
'quarter_name': quarter_name,
|
|
255
|
+
'metric_name': metric_name,
|
|
256
|
+
}
|
|
257
|
+
# 动态添加所有指标字段
|
|
258
|
+
if isinstance(metric_values, dict):
|
|
259
|
+
for field, value in metric_values.items():
|
|
260
|
+
record[field] = value
|
|
261
|
+
else:
|
|
262
|
+
# 如果不是字典,将其作为'value'字段
|
|
263
|
+
record['value'] = metric_values
|
|
264
|
+
records.append(record)
|
|
265
|
+
# 创建DataFrame
|
|
266
|
+
df = pd.DataFrame(records)
|
|
267
|
+
# 自动识别并转换数值列
|
|
268
|
+
numeric_columns = []
|
|
269
|
+
for col in df.columns:
|
|
270
|
+
if col not in ['report_date', 'report_name', 'report_period', 'quarter_name', 'metric_name']:
|
|
271
|
+
# 尝试将列转换为数值类型
|
|
272
|
+
if df[col].dtype == 'object':
|
|
273
|
+
# 替换空字符串为NaN
|
|
274
|
+
df[col] = df[col].replace(to_replace='', value=pd.NA)
|
|
275
|
+
# 尝试转换为数值
|
|
276
|
+
numeric_series = pd.to_numeric(df[col], errors='coerce')
|
|
277
|
+
# 如果大部分能转换为数值,则保留转换结果
|
|
278
|
+
if numeric_series.notna().sum() > len(numeric_series) * 0.5:
|
|
279
|
+
df[col] = numeric_series
|
|
280
|
+
numeric_columns.append(col)
|
|
281
|
+
return df
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
def stock_financial_debt_new_ths(
|
|
285
|
+
symbol: str = "000063", indicator: str = "按报告期"
|
|
286
|
+
) -> pd.DataFrame:
|
|
287
|
+
"""
|
|
288
|
+
同花顺-财务指标-资产负债表
|
|
289
|
+
https://basic.10jqka.com.cn/astockpc/astockmain/index.html#/financen?code=000063
|
|
290
|
+
:param symbol: 股票代码
|
|
291
|
+
:type symbol: str
|
|
292
|
+
:param indicator: 指标; choice of {"按报告期", "按年度"}
|
|
293
|
+
:type indicator: str
|
|
294
|
+
:return: 同花顺-财务指标-资产负债表
|
|
295
|
+
:rtype: pandas.DataFrame
|
|
296
|
+
"""
|
|
297
|
+
url = "https://basic.10jqka.com.cn/basicapi/finance/index/v1/app_data/"
|
|
298
|
+
if indicator == "按报告期":
|
|
299
|
+
period = "0"
|
|
300
|
+
else:
|
|
301
|
+
period = "4"
|
|
302
|
+
params = {
|
|
303
|
+
'code': symbol,
|
|
304
|
+
'id': 'client_stock_debt',
|
|
305
|
+
'market': __get_market_code(symbol),
|
|
306
|
+
'type': 'stock',
|
|
307
|
+
'page': '1',
|
|
308
|
+
'size': '50',
|
|
309
|
+
'period': period,
|
|
310
|
+
}
|
|
311
|
+
r = requests.get(url, headers=headers, params=params)
|
|
312
|
+
data_json = r.json()
|
|
313
|
+
# 提取财务数据
|
|
314
|
+
financial_data = data_json['data']['data']
|
|
315
|
+
# 创建空列表用于存储处理后的数据
|
|
316
|
+
records = []
|
|
317
|
+
# 收集所有可能的指标字段
|
|
318
|
+
all_metric_fields = set()
|
|
319
|
+
# 首先遍历一次,找出所有的字段名
|
|
320
|
+
for report in financial_data:
|
|
321
|
+
for metric_name, metric_values in report['index_list'].items():
|
|
322
|
+
if isinstance(metric_values, dict):
|
|
323
|
+
all_metric_fields.update(metric_values.keys())
|
|
324
|
+
# 遍历每个报告期的数据
|
|
325
|
+
for report in financial_data:
|
|
326
|
+
report_date = report['date']
|
|
327
|
+
report_name = report['report_name']
|
|
328
|
+
report_period = report['report']
|
|
329
|
+
quarter_name = report['quarter_name']
|
|
330
|
+
# 遍历该报告期的所有财务指标
|
|
331
|
+
for metric_name, metric_values in report['index_list'].items():
|
|
332
|
+
# 基本信息
|
|
333
|
+
record = {
|
|
334
|
+
'report_date': report_date,
|
|
335
|
+
'report_name': report_name,
|
|
336
|
+
'report_period': report_period,
|
|
337
|
+
'quarter_name': quarter_name,
|
|
338
|
+
'metric_name': metric_name,
|
|
339
|
+
}
|
|
340
|
+
# 动态添加所有指标字段
|
|
341
|
+
if isinstance(metric_values, dict):
|
|
342
|
+
for field, value in metric_values.items():
|
|
343
|
+
record[field] = value
|
|
344
|
+
else:
|
|
345
|
+
# 如果不是字典,将其作为'value'字段
|
|
346
|
+
record['value'] = metric_values
|
|
347
|
+
records.append(record)
|
|
348
|
+
# 创建DataFrame
|
|
349
|
+
df = pd.DataFrame(records)
|
|
350
|
+
# 自动识别并转换数值列
|
|
351
|
+
numeric_columns = []
|
|
352
|
+
for col in df.columns:
|
|
353
|
+
if col not in ['report_date', 'report_name', 'report_period', 'quarter_name', 'metric_name']:
|
|
354
|
+
# 尝试将列转换为数值类型
|
|
355
|
+
if df[col].dtype == 'object':
|
|
356
|
+
# 替换空字符串为NaN
|
|
357
|
+
df[col] = df[col].replace(to_replace='', value=pd.NA)
|
|
358
|
+
# 尝试转换为数值
|
|
359
|
+
numeric_series = pd.to_numeric(df[col], errors='coerce')
|
|
360
|
+
# 如果大部分能转换为数值,则保留转换结果
|
|
361
|
+
if numeric_series.notna().sum() > len(numeric_series) * 0.5:
|
|
362
|
+
df[col] = numeric_series
|
|
363
|
+
numeric_columns.append(col)
|
|
364
|
+
return df
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
def stock_financial_benefit_new_ths(
|
|
368
|
+
symbol: str = "000063", indicator: str = "按报告期"
|
|
369
|
+
) -> pd.DataFrame:
|
|
370
|
+
"""
|
|
371
|
+
同花顺-财务指标-利润表
|
|
372
|
+
https://basic.10jqka.com.cn/astockpc/astockmain/index.html#/financen?code=000063
|
|
373
|
+
:param symbol: 股票代码
|
|
374
|
+
:type symbol: str
|
|
375
|
+
:param indicator: 指标; choice of {"按报告期", "一季度", "二季度", "三季度", "四季度", "按年度"}
|
|
376
|
+
:type indicator: str
|
|
377
|
+
:return: 同花顺-财务指标-利润表
|
|
378
|
+
:rtype: pandas.DataFrame
|
|
379
|
+
"""
|
|
380
|
+
url = "https://basic.10jqka.com.cn/basicapi/finance/index/v1/app_data/"
|
|
381
|
+
if indicator == "按报告期":
|
|
382
|
+
period = "0"
|
|
383
|
+
elif indicator == "一季度":
|
|
384
|
+
period = "1"
|
|
385
|
+
elif indicator == "二季度":
|
|
386
|
+
period = "2"
|
|
387
|
+
elif indicator == "三季度":
|
|
388
|
+
period = "3"
|
|
389
|
+
elif indicator == "四季度":
|
|
390
|
+
period = "4"
|
|
391
|
+
else:
|
|
392
|
+
period = "4"
|
|
393
|
+
params = {
|
|
394
|
+
'code': symbol,
|
|
395
|
+
'id': 'client_stock_benefit',
|
|
396
|
+
'market': __get_market_code(symbol),
|
|
397
|
+
'type': 'stock',
|
|
398
|
+
'page': '1',
|
|
399
|
+
'size': '50',
|
|
400
|
+
'period': period,
|
|
401
|
+
}
|
|
402
|
+
r = requests.get(url, headers=headers, params=params)
|
|
403
|
+
data_json = r.json()
|
|
404
|
+
# 提取财务数据
|
|
405
|
+
financial_data = data_json['data']['data']
|
|
406
|
+
# 创建空列表用于存储处理后的数据
|
|
407
|
+
records = []
|
|
408
|
+
# 收集所有可能的指标字段
|
|
409
|
+
all_metric_fields = set()
|
|
410
|
+
# 首先遍历一次,找出所有的字段名
|
|
411
|
+
for report in financial_data:
|
|
412
|
+
for metric_name, metric_values in report['index_list'].items():
|
|
413
|
+
if isinstance(metric_values, dict):
|
|
414
|
+
all_metric_fields.update(metric_values.keys())
|
|
415
|
+
# 遍历每个报告期的数据
|
|
416
|
+
for report in financial_data:
|
|
417
|
+
report_date = report['date']
|
|
418
|
+
report_name = report['report_name']
|
|
419
|
+
report_period = report['report']
|
|
420
|
+
quarter_name = report['quarter_name']
|
|
421
|
+
# 遍历该报告期的所有财务指标
|
|
422
|
+
for metric_name, metric_values in report['index_list'].items():
|
|
423
|
+
# 基本信息
|
|
424
|
+
record = {
|
|
425
|
+
'report_date': report_date,
|
|
426
|
+
'report_name': report_name,
|
|
427
|
+
'report_period': report_period,
|
|
428
|
+
'quarter_name': quarter_name,
|
|
429
|
+
'metric_name': metric_name,
|
|
430
|
+
}
|
|
431
|
+
# 动态添加所有指标字段
|
|
432
|
+
if isinstance(metric_values, dict):
|
|
433
|
+
for field, value in metric_values.items():
|
|
434
|
+
record[field] = value
|
|
435
|
+
else:
|
|
436
|
+
# 如果不是字典,将其作为'value'字段
|
|
437
|
+
record['value'] = metric_values
|
|
438
|
+
records.append(record)
|
|
439
|
+
# 创建DataFrame
|
|
440
|
+
df = pd.DataFrame(records)
|
|
441
|
+
# 自动识别并转换数值列
|
|
442
|
+
numeric_columns = []
|
|
443
|
+
for col in df.columns:
|
|
444
|
+
if col not in ['report_date', 'report_name', 'report_period', 'quarter_name', 'metric_name']:
|
|
445
|
+
# 尝试将列转换为数值类型
|
|
446
|
+
if df[col].dtype == 'object':
|
|
447
|
+
# 替换空字符串为NaN
|
|
448
|
+
df[col] = df[col].replace(to_replace='', value=pd.NA)
|
|
449
|
+
# 尝试转换为数值
|
|
450
|
+
numeric_series = pd.to_numeric(df[col], errors='coerce')
|
|
451
|
+
# 如果大部分能转换为数值,则保留转换结果
|
|
452
|
+
if numeric_series.notna().sum() > len(numeric_series) * 0.5:
|
|
453
|
+
df[col] = numeric_series
|
|
454
|
+
numeric_columns.append(col)
|
|
455
|
+
return df
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
def stock_financial_cash_new_ths(
|
|
459
|
+
symbol: str = "000063", indicator: str = "按报告期"
|
|
460
|
+
) -> pd.DataFrame:
|
|
461
|
+
"""
|
|
462
|
+
同花顺-财务指标-现金流量表
|
|
463
|
+
https://basic.10jqka.com.cn/astockpc/astockmain/index.html#/financen?code=000063
|
|
464
|
+
:param symbol: 股票代码
|
|
465
|
+
:type symbol: str
|
|
466
|
+
:param indicator: 指标; choice of {"按报告期", "一季度", "二季度", "三季度", "四季度", "按年度"}
|
|
467
|
+
:type indicator: str
|
|
468
|
+
:return: 同花顺-财务指标-现金流量表
|
|
469
|
+
:rtype: pandas.DataFrame
|
|
470
|
+
"""
|
|
471
|
+
url = "https://basic.10jqka.com.cn/basicapi/finance/index/v1/app_data/"
|
|
472
|
+
if indicator == "按报告期":
|
|
473
|
+
period = "0"
|
|
474
|
+
elif indicator == "一季度":
|
|
475
|
+
period = "1"
|
|
476
|
+
elif indicator == "二季度":
|
|
477
|
+
period = "2"
|
|
478
|
+
elif indicator == "三季度":
|
|
479
|
+
period = "3"
|
|
480
|
+
elif indicator == "四季度":
|
|
481
|
+
period = "4"
|
|
482
|
+
else:
|
|
483
|
+
period = "4"
|
|
484
|
+
params = {
|
|
485
|
+
'code': symbol,
|
|
486
|
+
'id': 'client_stock_cash',
|
|
487
|
+
'market': __get_market_code(symbol),
|
|
488
|
+
'type': 'stock',
|
|
489
|
+
'page': '1',
|
|
490
|
+
'size': '50',
|
|
491
|
+
'period': period,
|
|
492
|
+
}
|
|
493
|
+
r = requests.get(url, headers=headers, params=params)
|
|
494
|
+
data_json = r.json()
|
|
495
|
+
# 提取财务数据
|
|
496
|
+
financial_data = data_json['data']['data']
|
|
497
|
+
# 创建空列表用于存储处理后的数据
|
|
498
|
+
records = []
|
|
499
|
+
# 收集所有可能的指标字段
|
|
500
|
+
all_metric_fields = set()
|
|
501
|
+
# 首先遍历一次,找出所有的字段名
|
|
502
|
+
for report in financial_data:
|
|
503
|
+
for metric_name, metric_values in report['index_list'].items():
|
|
504
|
+
if isinstance(metric_values, dict):
|
|
505
|
+
all_metric_fields.update(metric_values.keys())
|
|
506
|
+
# 遍历每个报告期的数据
|
|
507
|
+
for report in financial_data:
|
|
508
|
+
report_date = report['date']
|
|
509
|
+
report_name = report['report_name']
|
|
510
|
+
report_period = report['report']
|
|
511
|
+
quarter_name = report['quarter_name']
|
|
512
|
+
# 遍历该报告期的所有财务指标
|
|
513
|
+
for metric_name, metric_values in report['index_list'].items():
|
|
514
|
+
# 基本信息
|
|
515
|
+
record = {
|
|
516
|
+
'report_date': report_date,
|
|
517
|
+
'report_name': report_name,
|
|
518
|
+
'report_period': report_period,
|
|
519
|
+
'quarter_name': quarter_name,
|
|
520
|
+
'metric_name': metric_name,
|
|
521
|
+
}
|
|
522
|
+
# 动态添加所有指标字段
|
|
523
|
+
if isinstance(metric_values, dict):
|
|
524
|
+
for field, value in metric_values.items():
|
|
525
|
+
record[field] = value
|
|
526
|
+
else:
|
|
527
|
+
# 如果不是字典,将其作为'value'字段
|
|
528
|
+
record['value'] = metric_values
|
|
529
|
+
records.append(record)
|
|
530
|
+
# 创建DataFrame
|
|
531
|
+
df = pd.DataFrame(records)
|
|
532
|
+
# 自动识别并转换数值列
|
|
533
|
+
numeric_columns = []
|
|
534
|
+
for col in df.columns:
|
|
535
|
+
if col not in ['report_date', 'report_name', 'report_period', 'quarter_name', 'metric_name']:
|
|
536
|
+
# 尝试将列转换为数值类型
|
|
537
|
+
if df[col].dtype == 'object':
|
|
538
|
+
# 替换空字符串为NaN
|
|
539
|
+
df[col] = df[col].replace(to_replace='', value=pd.NA)
|
|
540
|
+
# 尝试转换为数值
|
|
541
|
+
numeric_series = pd.to_numeric(df[col], errors='coerce')
|
|
542
|
+
# 如果大部分能转换为数值,则保留转换结果
|
|
543
|
+
if numeric_series.notna().sum() > len(numeric_series) * 0.5:
|
|
544
|
+
df[col] = numeric_series
|
|
545
|
+
numeric_columns.append(col)
|
|
546
|
+
return df
|
|
547
|
+
|
|
548
|
+
|
|
549
|
+
def stock_management_change_ths(symbol: str = "688981") -> pd.DataFrame:
|
|
550
|
+
"""
|
|
551
|
+
同花顺-公司大事-高管持股变动
|
|
552
|
+
https://basic.10jqka.com.cn/new/688981/event.html
|
|
553
|
+
:param symbol: 股票代码
|
|
554
|
+
:type symbol: str
|
|
555
|
+
:return: 同花顺-公司大事-高管持股变动
|
|
556
|
+
:rtype: pandas.DataFrame
|
|
557
|
+
"""
|
|
558
|
+
url = f"https://basic.10jqka.com.cn/new/{symbol}/event.html"
|
|
559
|
+
r = requests.get(url, headers=headers)
|
|
560
|
+
r.encoding = "gb2312"
|
|
561
|
+
soup = BeautifulSoup(r.text, features="lxml")
|
|
562
|
+
soup_find = soup.find(name="table", attrs={"class": "data_table_1 m_table m_hl"})
|
|
563
|
+
if soup_find is not None:
|
|
564
|
+
content_list = [item.text.strip() for item in soup_find]
|
|
565
|
+
column_names = content_list[1].split("\n")
|
|
566
|
+
row = (
|
|
567
|
+
content_list[3]
|
|
568
|
+
.replace(" ", "")
|
|
569
|
+
.replace("\t", "")
|
|
570
|
+
.replace("\n\n", "")
|
|
571
|
+
.replace(" ", "\n")
|
|
572
|
+
.replace("\n\n", "\n")
|
|
573
|
+
.split("\n")
|
|
574
|
+
)
|
|
575
|
+
row = [item for item in row if item != ""]
|
|
576
|
+
new_rows = []
|
|
577
|
+
step = len(column_names)
|
|
578
|
+
for i in range(0, len(row), step):
|
|
579
|
+
new_rows.append(row[i: i + step])
|
|
580
|
+
temp_df = pd.DataFrame(new_rows, columns=column_names)
|
|
581
|
+
temp_df.sort_values(by="变动日期", ignore_index=True, inplace=True)
|
|
582
|
+
temp_df["变动日期"] = pd.to_datetime(
|
|
583
|
+
temp_df["变动日期"], errors="coerce"
|
|
584
|
+
).dt.date
|
|
585
|
+
temp_df.rename(
|
|
586
|
+
columns={
|
|
587
|
+
"变动数量(股)": "变动数量",
|
|
588
|
+
"交易均价(元)": "交易均价",
|
|
589
|
+
"剩余股数(股)": "剩余股数",
|
|
590
|
+
},
|
|
591
|
+
inplace=True,
|
|
592
|
+
)
|
|
593
|
+
return temp_df
|
|
594
|
+
return pd.DataFrame()
|
|
595
|
+
|
|
596
|
+
|
|
597
|
+
def stock_shareholder_change_ths(symbol: str = "688981") -> pd.DataFrame:
|
|
598
|
+
"""
|
|
599
|
+
同花顺-公司大事-股东持股变动
|
|
600
|
+
https://basic.10jqka.com.cn/new/688981/event.html
|
|
601
|
+
:param symbol: 股票代码
|
|
602
|
+
:type symbol: str
|
|
603
|
+
:return: 同花顺-公司大事-股东持股变动
|
|
604
|
+
:rtype: pandas.DataFrame
|
|
605
|
+
"""
|
|
606
|
+
url = f"https://basic.10jqka.com.cn/new/{symbol}/event.html"
|
|
607
|
+
r = requests.get(url, headers=headers)
|
|
608
|
+
r.encoding = "gb2312"
|
|
609
|
+
soup = BeautifulSoup(r.text, features="lxml")
|
|
610
|
+
soup_find = soup.find(name="table", attrs={"class": "m_table data_table_1 m_hl"})
|
|
611
|
+
if soup_find is not None:
|
|
612
|
+
content_list = [item.text.strip() for item in soup_find]
|
|
613
|
+
column_names = content_list[1].split("\n")
|
|
614
|
+
row = (
|
|
615
|
+
content_list[3]
|
|
616
|
+
.replace("\t", "")
|
|
617
|
+
.replace("\n\n", "")
|
|
618
|
+
.replace(" ", "\n")
|
|
619
|
+
.replace(" ", "")
|
|
620
|
+
.replace("\n\n", "\n")
|
|
621
|
+
.split("\n")
|
|
622
|
+
)
|
|
623
|
+
row = [item for item in row if item != ""]
|
|
624
|
+
new_rows = []
|
|
625
|
+
step = len(column_names)
|
|
626
|
+
for i in range(0, len(row), step):
|
|
627
|
+
new_rows.append(row[i: i + step])
|
|
628
|
+
temp_df = pd.DataFrame(new_rows, columns=column_names)
|
|
629
|
+
temp_df.sort_values(by="公告日期", ignore_index=True, inplace=True)
|
|
630
|
+
temp_df["公告日期"] = pd.to_datetime(
|
|
631
|
+
temp_df["公告日期"], errors="coerce"
|
|
632
|
+
).dt.date
|
|
633
|
+
temp_df.rename(
|
|
634
|
+
columns={
|
|
635
|
+
"变动数量(股)": "变动数量",
|
|
636
|
+
"交易均价(元)": "交易均价",
|
|
637
|
+
"剩余股份总数(股)": "剩余股份总数",
|
|
638
|
+
},
|
|
639
|
+
inplace=True,
|
|
640
|
+
)
|
|
641
|
+
return temp_df
|
|
642
|
+
return pd.DataFrame()
|
|
643
|
+
|
|
644
|
+
|
|
184
645
|
if __name__ == "__main__":
|
|
185
|
-
|
|
646
|
+
stock_financial_abstract_new_ths_df = stock_financial_abstract_new_ths(
|
|
186
647
|
symbol="000063", indicator="按报告期"
|
|
187
648
|
)
|
|
188
|
-
print(
|
|
649
|
+
print(stock_financial_abstract_new_ths_df)
|
|
189
650
|
|
|
190
|
-
|
|
651
|
+
stock_financial_abstract_new_ths_df = stock_financial_abstract_new_ths(
|
|
191
652
|
symbol="000063", indicator="按年度"
|
|
192
653
|
)
|
|
193
|
-
print(
|
|
654
|
+
print(stock_financial_abstract_new_ths_df)
|
|
194
655
|
|
|
195
|
-
|
|
196
|
-
symbol="000063", indicator="
|
|
656
|
+
stock_financial_abstract_new_ths_df = stock_financial_abstract_new_ths(
|
|
657
|
+
symbol="000063", indicator="一季度"
|
|
197
658
|
)
|
|
198
|
-
print(
|
|
659
|
+
print(stock_financial_abstract_new_ths_df)
|
|
199
660
|
|
|
200
|
-
|
|
201
|
-
symbol="
|
|
661
|
+
stock_financial_debt_new_ths_df = stock_financial_debt_new_ths(
|
|
662
|
+
symbol="002004", indicator="按报告期"
|
|
202
663
|
)
|
|
203
|
-
print(
|
|
664
|
+
print(stock_financial_debt_new_ths_df)
|
|
204
665
|
|
|
205
|
-
|
|
666
|
+
stock_financial_debt_new_ths_df = stock_financial_debt_new_ths(
|
|
206
667
|
symbol="000063", indicator="按年度"
|
|
207
668
|
)
|
|
208
|
-
print(
|
|
669
|
+
print(stock_financial_debt_new_ths_df)
|
|
209
670
|
|
|
210
|
-
|
|
671
|
+
stock_financial_benefit_new_ths_df = stock_financial_benefit_new_ths(
|
|
211
672
|
symbol="000063", indicator="按报告期"
|
|
212
673
|
)
|
|
213
|
-
print(
|
|
674
|
+
print(stock_financial_benefit_new_ths_df)
|
|
214
675
|
|
|
215
|
-
|
|
676
|
+
stock_financial_benefit_new_ths_df = stock_financial_benefit_new_ths(
|
|
216
677
|
symbol="000063", indicator="按年度"
|
|
217
678
|
)
|
|
218
|
-
print(
|
|
679
|
+
print(stock_financial_benefit_new_ths_df)
|
|
219
680
|
|
|
220
|
-
|
|
221
|
-
symbol="000063", indicator="
|
|
681
|
+
stock_financial_benefit_new_ths_df = stock_financial_benefit_new_ths(
|
|
682
|
+
symbol="000063", indicator="一季度"
|
|
222
683
|
)
|
|
223
|
-
print(
|
|
684
|
+
print(stock_financial_benefit_new_ths_df)
|
|
224
685
|
|
|
225
|
-
|
|
226
|
-
symbol="000063", indicator="
|
|
686
|
+
stock_financial_cash_new_ths_df = stock_financial_cash_new_ths(
|
|
687
|
+
symbol="000063", indicator="按报告期"
|
|
227
688
|
)
|
|
228
|
-
print(
|
|
689
|
+
print(stock_financial_cash_new_ths_df)
|
|
229
690
|
|
|
230
|
-
|
|
691
|
+
stock_financial_cash_new_ths_df = stock_financial_cash_new_ths(
|
|
231
692
|
symbol="000063", indicator="按年度"
|
|
232
693
|
)
|
|
233
|
-
print(
|
|
694
|
+
print(stock_financial_cash_new_ths_df)
|
|
234
695
|
|
|
235
|
-
|
|
236
|
-
symbol="000063", indicator="
|
|
696
|
+
stock_financial_cash_new_ths_df = stock_financial_cash_new_ths(
|
|
697
|
+
symbol="000063", indicator="一季度"
|
|
237
698
|
)
|
|
238
|
-
print(
|
|
699
|
+
print(stock_financial_cash_new_ths_df)
|
|
700
|
+
|
|
701
|
+
stock_management_change_ths_df = stock_management_change_ths(symbol="688981")
|
|
702
|
+
print(stock_management_change_ths_df)
|
|
703
|
+
|
|
704
|
+
stock_shareholder_change_ths_df = stock_shareholder_change_ths(symbol="688981")
|
|
705
|
+
print(stock_shareholder_change_ths_df)
|