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: 2024/10/2 9:00
|
|
5
5
|
Desc: 股票基本面数据
|
|
6
6
|
新浪财经-财务报表-财务摘要
|
|
7
7
|
https://vip.stock.finance.sina.com.cn/corp/go.php/vFD_FinanceSummary/stockid/600004.phtml
|
|
@@ -10,13 +10,15 @@ https://money.finance.sina.com.cn/corp/go.php/vFD_FinancialGuideLine/stockid/600
|
|
|
10
10
|
新浪财经-发行与分配
|
|
11
11
|
https://money.finance.sina.com.cn/corp/go.php/vISSUE_ShareBonus/stockid/600004.phtml
|
|
12
12
|
"""
|
|
13
|
+
|
|
13
14
|
from datetime import datetime
|
|
14
15
|
from io import StringIO
|
|
15
16
|
|
|
16
17
|
import pandas as pd
|
|
17
18
|
import requests
|
|
18
19
|
from bs4 import BeautifulSoup
|
|
19
|
-
|
|
20
|
+
|
|
21
|
+
from akshare.utils.tqdm import get_tqdm
|
|
20
22
|
|
|
21
23
|
|
|
22
24
|
def stock_financial_report_sina(
|
|
@@ -39,7 +41,7 @@ def stock_financial_report_sina(
|
|
|
39
41
|
"source": symbol_map[symbol],
|
|
40
42
|
"type": "0",
|
|
41
43
|
"page": "1",
|
|
42
|
-
"num": "
|
|
44
|
+
"num": "1000",
|
|
43
45
|
}
|
|
44
46
|
r = requests.get(url, params=params)
|
|
45
47
|
data_json = r.json()
|
|
@@ -55,7 +57,7 @@ def stock_financial_report_sina(
|
|
|
55
57
|
temp_df = temp_df[["item_title", "item_value"]]
|
|
56
58
|
temp_df["item_value"] = pd.to_numeric(temp_df["item_value"], errors="coerce")
|
|
57
59
|
temp_tail_df = pd.DataFrame.from_dict(
|
|
58
|
-
{
|
|
60
|
+
data={
|
|
59
61
|
"数据源": data_json["result"]["data"]["report_list"][date_str][
|
|
60
62
|
"data_source"
|
|
61
63
|
],
|
|
@@ -65,7 +67,9 @@ def stock_financial_report_sina(
|
|
|
65
67
|
"公告日期": data_json["result"]["data"]["report_list"][date_str][
|
|
66
68
|
"publish_date"
|
|
67
69
|
],
|
|
68
|
-
"币种": data_json["result"]["data"]["report_list"][date_str][
|
|
70
|
+
"币种": data_json["result"]["data"]["report_list"][date_str][
|
|
71
|
+
"rCurrency"
|
|
72
|
+
],
|
|
69
73
|
"类型": data_json["result"]["data"]["report_list"][date_str]["rType"],
|
|
70
74
|
"更新日期": datetime.fromtimestamp(
|
|
71
75
|
data_json["result"]["data"]["report_list"][date_str]["update_time"]
|
|
@@ -75,13 +79,13 @@ def stock_financial_report_sina(
|
|
|
75
79
|
)
|
|
76
80
|
temp_tail_df.reset_index(inplace=True)
|
|
77
81
|
temp_tail_df.columns = ["item_title", "item_value"]
|
|
78
|
-
temp_df = pd.concat([temp_df, temp_tail_df], ignore_index=True)
|
|
82
|
+
temp_df = pd.concat(objs=[temp_df, temp_tail_df], ignore_index=True)
|
|
79
83
|
temp_df.columns = ["项目", date_str]
|
|
80
|
-
big_df = pd.concat([big_df, temp_df[date_str]], axis=1, ignore_index=True)
|
|
84
|
+
big_df = pd.concat(objs=[big_df, temp_df[date_str]], axis=1, ignore_index=True)
|
|
81
85
|
|
|
82
86
|
big_df = big_df.T
|
|
83
87
|
big_df.columns = temp_df["项目"]
|
|
84
|
-
big_df = pd.concat([pd.DataFrame({"报告日": df_columns}), big_df], axis=1)
|
|
88
|
+
big_df = pd.concat(objs=[pd.DataFrame({"报告日": df_columns}), big_df], axis=1)
|
|
85
89
|
# 此处有 '国内票证结算' 和 '内部应收款'字段重复
|
|
86
90
|
big_df = big_df.loc[:, ~big_df.columns.duplicated(keep="first")]
|
|
87
91
|
return big_df
|
|
@@ -102,7 +106,7 @@ def stock_financial_abstract(symbol: str = "600004") -> pd.DataFrame:
|
|
|
102
106
|
"source": "gjzb",
|
|
103
107
|
"type": "0",
|
|
104
108
|
"page": "1",
|
|
105
|
-
"num": "
|
|
109
|
+
"num": "1000",
|
|
106
110
|
}
|
|
107
111
|
r = requests.get(url, params=params)
|
|
108
112
|
data_json = r.json()
|
|
@@ -113,7 +117,9 @@ def stock_financial_abstract(symbol: str = "600004") -> pd.DataFrame:
|
|
|
113
117
|
big_df = temp_df["item_title"]
|
|
114
118
|
for item in key_list:
|
|
115
119
|
temp_df = pd.DataFrame(data_json["result"]["data"]["report_list"][item]["data"])
|
|
116
|
-
big_df = pd.concat(
|
|
120
|
+
big_df = pd.concat(
|
|
121
|
+
objs=[big_df, temp_df["item_value"]], axis=1, ignore_index=True
|
|
122
|
+
)
|
|
117
123
|
big_df.index = big_df.iloc[:, 0]
|
|
118
124
|
big_df = big_df.iloc[:, 1:]
|
|
119
125
|
|
|
@@ -153,7 +159,7 @@ def stock_financial_abstract(symbol: str = "600004") -> pd.DataFrame:
|
|
|
153
159
|
big_seven_df.insert(0, "选项", "营运能力")
|
|
154
160
|
|
|
155
161
|
big_df = pd.concat(
|
|
156
|
-
[
|
|
162
|
+
objs=[
|
|
157
163
|
big_one_df,
|
|
158
164
|
big_two_df,
|
|
159
165
|
big_three_df,
|
|
@@ -172,6 +178,53 @@ def stock_financial_abstract(symbol: str = "600004") -> pd.DataFrame:
|
|
|
172
178
|
return big_df
|
|
173
179
|
|
|
174
180
|
|
|
181
|
+
def stock_financial_analysis_indicator_em(
|
|
182
|
+
symbol: str = "301389.SZ", indicator: str = "按报告期"
|
|
183
|
+
) -> pd.DataFrame:
|
|
184
|
+
"""
|
|
185
|
+
东方财富-A股-财务分析-主要指标
|
|
186
|
+
https://emweb.securities.eastmoney.com/pc_hsf10/pages/index.html?type=web&code=SZ301389&color=b#/cwfx
|
|
187
|
+
:param symbol: 股票代码(带市场标识)
|
|
188
|
+
:type symbol: str
|
|
189
|
+
:param indicator: choice of {"按报告期", "按单季度"}
|
|
190
|
+
:type indicator: str
|
|
191
|
+
:return: 东方财富-A股-财务分析-主要指标
|
|
192
|
+
:rtype: pandas.DataFrame
|
|
193
|
+
"""
|
|
194
|
+
if indicator == "按报告期":
|
|
195
|
+
url = "https://datacenter.eastmoney.com/securities/api/data/get"
|
|
196
|
+
params = {
|
|
197
|
+
"type": "RPT_F10_FINANCE_MAINFINADATA",
|
|
198
|
+
"sty": "APP_F10_MAINFINADATA",
|
|
199
|
+
"quoteColumns": "",
|
|
200
|
+
"filter": f"""(SECUCODE="{symbol}")""",
|
|
201
|
+
"p": "1",
|
|
202
|
+
"ps": "200",
|
|
203
|
+
"sr": "-1",
|
|
204
|
+
"st": "REPORT_DATE",
|
|
205
|
+
"source": "HSF10",
|
|
206
|
+
"client": "PC",
|
|
207
|
+
}
|
|
208
|
+
else:
|
|
209
|
+
url = "https://datacenter.eastmoney.com/securities/api/data/v1/get"
|
|
210
|
+
params = {
|
|
211
|
+
"reportName": "RPT_F10_QTR_MAINFINADATA",
|
|
212
|
+
"columns": "ALL",
|
|
213
|
+
"quoteColumns": "",
|
|
214
|
+
"filter": f"""(SECUCODE="{symbol}")""",
|
|
215
|
+
"pageNumber": "1",
|
|
216
|
+
"pageSize": "200",
|
|
217
|
+
"sortTypes": "-1",
|
|
218
|
+
"sortColumns": "REPORT_DATE",
|
|
219
|
+
"source": "HSF10",
|
|
220
|
+
"client": "PC",
|
|
221
|
+
}
|
|
222
|
+
r = requests.get(url, params=params)
|
|
223
|
+
data_json = r.json()
|
|
224
|
+
temp_df = pd.DataFrame(data_json["result"]["data"])
|
|
225
|
+
return temp_df
|
|
226
|
+
|
|
227
|
+
|
|
175
228
|
def stock_financial_analysis_indicator(
|
|
176
229
|
symbol: str = "600004", start_year: str = "1900"
|
|
177
230
|
) -> pd.DataFrame:
|
|
@@ -185,22 +238,39 @@ def stock_financial_analysis_indicator(
|
|
|
185
238
|
:return: 新浪财经-财务分析-财务指标
|
|
186
239
|
:rtype: pandas.DataFrame
|
|
187
240
|
"""
|
|
188
|
-
url =
|
|
241
|
+
url = (
|
|
242
|
+
f"https://money.finance.sina.com.cn/corp/go.php/vFD_FinancialGuideLine/"
|
|
243
|
+
f"stockid/{symbol}/ctrl/2020/displaytype/4.phtml"
|
|
244
|
+
)
|
|
189
245
|
r = requests.get(url)
|
|
190
|
-
soup = BeautifulSoup(r.text, "lxml")
|
|
246
|
+
soup = BeautifulSoup(r.text, features="lxml")
|
|
191
247
|
year_context = soup.find(attrs={"id": "con02-1"}).find("table").find_all("a")
|
|
192
248
|
year_list = [item.text for item in year_context]
|
|
193
249
|
if start_year in year_list:
|
|
194
250
|
year_list = year_list[: year_list.index(start_year) + 1]
|
|
251
|
+
else:
|
|
252
|
+
return pd.DataFrame()
|
|
195
253
|
out_df = pd.DataFrame()
|
|
254
|
+
tqdm = get_tqdm()
|
|
196
255
|
for year_item in tqdm(year_list, leave=False):
|
|
197
|
-
url =
|
|
256
|
+
url = (
|
|
257
|
+
f"https://money.finance.sina.com.cn/corp/go.php/vFD_FinancialGuideLine/"
|
|
258
|
+
f"stockid/{symbol}/ctrl/{year_item}/displaytype/4.phtml"
|
|
259
|
+
)
|
|
198
260
|
r = requests.get(url)
|
|
199
261
|
temp_df = pd.read_html(StringIO(r.text))[12].iloc[:, :-1]
|
|
200
262
|
temp_df.columns = temp_df.iloc[0, :]
|
|
201
263
|
temp_df = temp_df.iloc[1:, :]
|
|
202
264
|
big_df = pd.DataFrame()
|
|
203
|
-
indicator_list = [
|
|
265
|
+
indicator_list = [
|
|
266
|
+
"每股指标",
|
|
267
|
+
"盈利能力",
|
|
268
|
+
"成长能力",
|
|
269
|
+
"营运能力",
|
|
270
|
+
"偿债及资本结构",
|
|
271
|
+
"现金流量",
|
|
272
|
+
"其他指标",
|
|
273
|
+
]
|
|
204
274
|
for i in range(len(indicator_list)):
|
|
205
275
|
if i == 6:
|
|
206
276
|
inner_df = temp_df[
|
|
@@ -210,39 +280,53 @@ def stock_financial_analysis_indicator(
|
|
|
210
280
|
].T
|
|
211
281
|
else:
|
|
212
282
|
inner_df = temp_df[
|
|
213
|
-
temp_df.loc[
|
|
214
|
-
|
|
283
|
+
temp_df.loc[
|
|
284
|
+
temp_df.iloc[:, 0].str.find(indicator_list[i]) == 0, :
|
|
285
|
+
].index[0] : temp_df.loc[
|
|
215
286
|
temp_df.iloc[:, 0].str.find(indicator_list[i + 1]) == 0, :
|
|
216
|
-
]
|
|
217
|
-
.index[0]
|
|
287
|
+
].index[0]
|
|
218
288
|
- 1
|
|
219
289
|
].T
|
|
220
290
|
inner_df = inner_df.reset_index(drop=True)
|
|
221
|
-
big_df = pd.concat([big_df, inner_df], axis=1)
|
|
291
|
+
big_df = pd.concat(objs=[big_df, inner_df], axis=1)
|
|
222
292
|
big_df.columns = big_df.iloc[0, :].tolist()
|
|
223
293
|
big_df = big_df.iloc[1:, :]
|
|
224
294
|
big_df.index = temp_df.columns.tolist()[1:]
|
|
225
|
-
out_df = pd.concat([out_df, big_df])
|
|
295
|
+
out_df = pd.concat(objs=[out_df, big_df])
|
|
226
296
|
|
|
227
297
|
out_df.dropna(inplace=True)
|
|
228
298
|
out_df.reset_index(inplace=True)
|
|
229
299
|
out_df.rename(columns={"index": "日期"}, inplace=True)
|
|
300
|
+
out_df.sort_values(by=["日期"], ignore_index=True, inplace=True)
|
|
301
|
+
out_df["日期"] = pd.to_datetime(out_df["日期"], errors="coerce").dt.date
|
|
302
|
+
for item in out_df.columns[1:]:
|
|
303
|
+
out_df[item] = pd.to_numeric(out_df[item], errors="coerce")
|
|
230
304
|
return out_df
|
|
231
305
|
|
|
232
306
|
|
|
233
307
|
def stock_history_dividend() -> pd.DataFrame:
|
|
234
308
|
"""
|
|
235
309
|
新浪财经-发行与分配-历史分红
|
|
236
|
-
|
|
310
|
+
https://vip.stock.finance.sina.com.cn/q/go.php/vInvestConsult/kind/lsfh/index.phtml
|
|
237
311
|
:return: 所有股票的历史分红数据
|
|
238
312
|
:rtype: pandas.DataFrame
|
|
239
313
|
"""
|
|
240
|
-
url = "
|
|
241
|
-
params = {"p": "1", "num": "
|
|
314
|
+
url = "https://vip.stock.finance.sina.com.cn/q/go.php/vInvestConsult/kind/lsfh/index.phtml"
|
|
315
|
+
params = {"p": "1", "num": "50000"}
|
|
242
316
|
r = requests.get(url, params=params)
|
|
243
317
|
temp_df = pd.read_html(StringIO(r.text))[0]
|
|
244
318
|
temp_df["代码"] = temp_df["代码"].astype(str).str.zfill(6)
|
|
245
|
-
temp_df.columns = [
|
|
319
|
+
temp_df.columns = [
|
|
320
|
+
"代码",
|
|
321
|
+
"名称",
|
|
322
|
+
"上市日期",
|
|
323
|
+
"累计股息",
|
|
324
|
+
"年均股息",
|
|
325
|
+
"分红次数",
|
|
326
|
+
"融资总额",
|
|
327
|
+
"融资次数",
|
|
328
|
+
"详细",
|
|
329
|
+
]
|
|
246
330
|
temp_df["上市日期"] = pd.to_datetime(temp_df["上市日期"], errors="coerce").dt.date
|
|
247
331
|
temp_df["累计股息"] = pd.to_numeric(temp_df["累计股息"], errors="coerce")
|
|
248
332
|
temp_df["年均股息"] = pd.to_numeric(temp_df["年均股息"], errors="coerce")
|
|
@@ -269,7 +353,7 @@ def stock_history_dividend_detail(
|
|
|
269
353
|
:rtype: pandas.DataFrame
|
|
270
354
|
"""
|
|
271
355
|
if indicator == "分红":
|
|
272
|
-
url = f"
|
|
356
|
+
url = f"https://vip.stock.finance.sina.com.cn/corp/go.php/vISSUE_ShareBonus/stockid/{symbol}.phtml"
|
|
273
357
|
r = requests.get(url)
|
|
274
358
|
temp_df = pd.read_html(StringIO(r.text))[12]
|
|
275
359
|
temp_df.columns = [item[2] for item in temp_df.columns.tolist()]
|
|
@@ -287,7 +371,9 @@ def stock_history_dividend_detail(
|
|
|
287
371
|
del temp_df["查看详细"]
|
|
288
372
|
if temp_df.iloc[0, 0] == "暂时没有数据!":
|
|
289
373
|
return pd.DataFrame()
|
|
290
|
-
temp_df["公告日期"] = pd.to_datetime(
|
|
374
|
+
temp_df["公告日期"] = pd.to_datetime(
|
|
375
|
+
temp_df["公告日期"], errors="coerce"
|
|
376
|
+
).dt.date
|
|
291
377
|
temp_df["送股"] = pd.to_numeric(temp_df["送股"], errors="coerce")
|
|
292
378
|
temp_df["转增"] = pd.to_numeric(temp_df["转增"], errors="coerce")
|
|
293
379
|
temp_df["派息"] = pd.to_numeric(temp_df["派息"], errors="coerce")
|
|
@@ -314,7 +400,7 @@ def stock_history_dividend_detail(
|
|
|
314
400
|
else:
|
|
315
401
|
return temp_df
|
|
316
402
|
else:
|
|
317
|
-
url = f"
|
|
403
|
+
url = f"https://vip.stock.finance.sina.com.cn/corp/go.php/vISSUE_ShareBonus/stockid/{symbol}.phtml"
|
|
318
404
|
r = requests.get(url)
|
|
319
405
|
temp_df = pd.read_html(StringIO(r.text))[13]
|
|
320
406
|
temp_df.columns = [item[1] for item in temp_df.columns.tolist()]
|
|
@@ -334,11 +420,15 @@ def stock_history_dividend_detail(
|
|
|
334
420
|
del temp_df["查看详细"]
|
|
335
421
|
if temp_df.iloc[0, 0] == "暂时没有数据!":
|
|
336
422
|
return pd.DataFrame()
|
|
337
|
-
temp_df["公告日期"] = pd.to_datetime(
|
|
423
|
+
temp_df["公告日期"] = pd.to_datetime(
|
|
424
|
+
temp_df["公告日期"], errors="coerce"
|
|
425
|
+
).dt.date
|
|
338
426
|
temp_df["配股方案"] = pd.to_numeric(temp_df["配股方案"], errors="coerce")
|
|
339
427
|
temp_df["配股价格"] = pd.to_numeric(temp_df["配股价格"], errors="coerce")
|
|
340
428
|
temp_df["基准股本"] = pd.to_numeric(temp_df["基准股本"], errors="coerce")
|
|
341
|
-
temp_df["募集资金合计"] = pd.to_numeric(
|
|
429
|
+
temp_df["募集资金合计"] = pd.to_numeric(
|
|
430
|
+
temp_df["募集资金合计"], errors="coerce"
|
|
431
|
+
)
|
|
342
432
|
temp_df["除权日"] = pd.to_datetime(
|
|
343
433
|
temp_df["除权日"], format="%Y-%m-%d", errors="coerce"
|
|
344
434
|
).dt.date
|
|
@@ -406,8 +496,15 @@ def stock_add_stock(symbol: str = "688166") -> pd.DataFrame:
|
|
|
406
496
|
big_df[temp_df.name.split(" ")[1].split(":")[1][:10]] = temp_df
|
|
407
497
|
big_df = big_df.T
|
|
408
498
|
big_df.reset_index(inplace=True)
|
|
409
|
-
big_df.columns = [
|
|
410
|
-
|
|
499
|
+
big_df.columns = [
|
|
500
|
+
"公告日期",
|
|
501
|
+
"发行方式",
|
|
502
|
+
"发行价格",
|
|
503
|
+
"实际公司募集资金总额",
|
|
504
|
+
"发行费用总额",
|
|
505
|
+
"实际发行数量",
|
|
506
|
+
]
|
|
507
|
+
big_df["公告日期"] = pd.to_datetime(big_df["公告日期"], errors="coerce").dt.date
|
|
411
508
|
return big_df
|
|
412
509
|
|
|
413
510
|
|
|
@@ -423,11 +520,21 @@ def stock_restricted_release_queue_sina(symbol: str = "600000") -> pd.DataFrame:
|
|
|
423
520
|
url = f"https://vip.stock.finance.sina.com.cn/q/go.php/vInvestConsult/kind/xsjj/index.phtml?symbol={symbol}"
|
|
424
521
|
r = requests.get(url)
|
|
425
522
|
temp_df = pd.read_html(StringIO(r.text))[0]
|
|
426
|
-
temp_df.columns = [
|
|
523
|
+
temp_df.columns = [
|
|
524
|
+
"代码",
|
|
525
|
+
"名称",
|
|
526
|
+
"解禁日期",
|
|
527
|
+
"解禁数量",
|
|
528
|
+
"解禁股流通市值",
|
|
529
|
+
"上市批次",
|
|
530
|
+
"公告日期",
|
|
531
|
+
]
|
|
427
532
|
temp_df["解禁日期"] = pd.to_datetime(temp_df["解禁日期"], errors="coerce").dt.date
|
|
428
533
|
temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
|
|
429
534
|
temp_df["解禁数量"] = pd.to_numeric(temp_df["解禁数量"], errors="coerce")
|
|
430
|
-
temp_df["解禁股流通市值"] = pd.to_numeric(
|
|
535
|
+
temp_df["解禁股流通市值"] = pd.to_numeric(
|
|
536
|
+
temp_df["解禁股流通市值"], errors="coerce"
|
|
537
|
+
)
|
|
431
538
|
temp_df["上市批次"] = pd.to_numeric(temp_df["上市批次"], errors="coerce")
|
|
432
539
|
temp_df["上市批次"] = pd.to_numeric(temp_df["上市批次"], errors="coerce")
|
|
433
540
|
return temp_df
|
|
@@ -443,21 +550,24 @@ def stock_circulate_stock_holder(symbol: str = "600000") -> pd.DataFrame:
|
|
|
443
550
|
:return: 新浪财经-股东股本-流通股东
|
|
444
551
|
:rtype: pandas.DataFrame
|
|
445
552
|
"""
|
|
553
|
+
pd.set_option("future.no_silent_downcasting", True)
|
|
446
554
|
url = f"https://vip.stock.finance.sina.com.cn/corp/go.php/vCI_CirculateStockHolder/stockid/{symbol}.phtml"
|
|
447
555
|
r = requests.get(url)
|
|
448
556
|
temp_df = pd.read_html(StringIO(r.text))[13].iloc[:, :5]
|
|
449
557
|
temp_df.columns = [*range(5)]
|
|
450
558
|
big_df = pd.DataFrame()
|
|
451
|
-
need_range = temp_df[
|
|
452
|
-
|
|
453
|
-
]
|
|
559
|
+
need_range = temp_df[
|
|
560
|
+
temp_df.iloc[:, 0].str.find("截止日期") == 0
|
|
561
|
+
].index.tolist() + [len(temp_df)]
|
|
562
|
+
tqdm = get_tqdm()
|
|
454
563
|
for i in tqdm(range(len(need_range) - 1), leave=False):
|
|
455
564
|
truncated_df = temp_df.iloc[need_range[i] : need_range[i + 1], :]
|
|
456
565
|
truncated_df = truncated_df.dropna(how="all")
|
|
457
566
|
temp_truncated = truncated_df.iloc[2:, :]
|
|
458
567
|
temp_truncated.reset_index(inplace=True, drop=True)
|
|
459
568
|
concat_df = pd.concat(
|
|
460
|
-
[temp_truncated, truncated_df.iloc[0, :], truncated_df.iloc[1, :]],
|
|
569
|
+
objs=[temp_truncated, truncated_df.iloc[0, :], truncated_df.iloc[1, :]],
|
|
570
|
+
axis=1,
|
|
461
571
|
)
|
|
462
572
|
concat_df.columns = concat_df.iloc[0, :]
|
|
463
573
|
concat_df = concat_df.iloc[1:, :]
|
|
@@ -465,7 +575,7 @@ def stock_circulate_stock_holder(symbol: str = "600000") -> pd.DataFrame:
|
|
|
465
575
|
# try for pandas >= 2.1.0
|
|
466
576
|
concat_df["截止日期"] = concat_df["截止日期"].ffill()
|
|
467
577
|
concat_df["公告日期"] = concat_df["公告日期"].ffill()
|
|
468
|
-
except
|
|
578
|
+
except: # noqa: E722
|
|
469
579
|
try:
|
|
470
580
|
# try for pandas < 2.1.0
|
|
471
581
|
concat_df["截止日期"] = concat_df["截止日期"].fillna(method="ffill")
|
|
@@ -473,10 +583,28 @@ def stock_circulate_stock_holder(symbol: str = "600000") -> pd.DataFrame:
|
|
|
473
583
|
except Exception as e:
|
|
474
584
|
print("Error:", e)
|
|
475
585
|
|
|
476
|
-
big_df = pd.concat([big_df, concat_df], axis=0, ignore_index=True)
|
|
586
|
+
big_df = pd.concat(objs=[big_df, concat_df], axis=0, ignore_index=True)
|
|
477
587
|
|
|
478
|
-
big_df = big_df[
|
|
479
|
-
|
|
588
|
+
big_df = big_df[
|
|
589
|
+
[
|
|
590
|
+
"截止日期",
|
|
591
|
+
"公告日期",
|
|
592
|
+
"编号",
|
|
593
|
+
"股东名称",
|
|
594
|
+
"持股数量(股)",
|
|
595
|
+
"占流通股比例(%)",
|
|
596
|
+
"股本性质",
|
|
597
|
+
]
|
|
598
|
+
]
|
|
599
|
+
big_df.columns = [
|
|
600
|
+
"截止日期",
|
|
601
|
+
"公告日期",
|
|
602
|
+
"编号",
|
|
603
|
+
"股东名称",
|
|
604
|
+
"持股数量",
|
|
605
|
+
"占流通股比例",
|
|
606
|
+
"股本性质",
|
|
607
|
+
]
|
|
480
608
|
|
|
481
609
|
big_df["截止日期"] = pd.to_datetime(big_df["截止日期"], errors="coerce").dt.date
|
|
482
610
|
big_df["公告日期"] = pd.to_datetime(big_df["公告日期"], errors="coerce").dt.date
|
|
@@ -501,22 +629,23 @@ def stock_fund_stock_holder(symbol: str = "600004") -> pd.DataFrame:
|
|
|
501
629
|
temp_df = pd.read_html(StringIO(r.text))[13].iloc[:, :6]
|
|
502
630
|
temp_df.columns = [*range(6)]
|
|
503
631
|
big_df = pd.DataFrame()
|
|
504
|
-
need_range = temp_df[
|
|
505
|
-
|
|
506
|
-
]
|
|
632
|
+
need_range = temp_df[
|
|
633
|
+
temp_df.iloc[:, 0].str.find("截止日期") == 0
|
|
634
|
+
].index.tolist() + [len(temp_df)]
|
|
635
|
+
tqdm = get_tqdm()
|
|
507
636
|
for i in tqdm(range(len(need_range) - 1), leave=False):
|
|
508
637
|
# pass
|
|
509
638
|
truncated_df = temp_df.iloc[need_range[i] : need_range[i + 1], :]
|
|
510
639
|
truncated_df = truncated_df.dropna(how="all")
|
|
511
640
|
temp_truncated = truncated_df.iloc[2:, :]
|
|
512
641
|
temp_truncated.reset_index(inplace=True, drop=True)
|
|
513
|
-
concat_df = pd.concat([temp_truncated, truncated_df.iloc[0, 1:]], axis=1)
|
|
642
|
+
concat_df = pd.concat(objs=[temp_truncated, truncated_df.iloc[0, 1:]], axis=1)
|
|
514
643
|
concat_df.columns = truncated_df.iloc[1, :].tolist() + ["截止日期"]
|
|
515
644
|
try:
|
|
516
645
|
# try for pandas >= 2.1.0
|
|
517
646
|
concat_df["截止日期"] = concat_df["截止日期"].ffill()
|
|
518
647
|
concat_df["截止日期"] = concat_df["截止日期"].ffill()
|
|
519
|
-
except
|
|
648
|
+
except: # noqa: E722
|
|
520
649
|
try:
|
|
521
650
|
# try for pandas < 2.1.0
|
|
522
651
|
concat_df["截止日期"] = concat_df["截止日期"].fillna(method="ffill")
|
|
@@ -524,10 +653,18 @@ def stock_fund_stock_holder(symbol: str = "600004") -> pd.DataFrame:
|
|
|
524
653
|
except Exception as e:
|
|
525
654
|
print("Error:", e)
|
|
526
655
|
|
|
527
|
-
big_df = pd.concat([big_df, concat_df], axis=0, ignore_index=True)
|
|
656
|
+
big_df = pd.concat(objs=[big_df, concat_df], axis=0, ignore_index=True)
|
|
528
657
|
big_df.dropna(inplace=True)
|
|
529
658
|
big_df.reset_index(inplace=True, drop=True)
|
|
530
|
-
big_df.columns = [
|
|
659
|
+
big_df.columns = [
|
|
660
|
+
"基金名称",
|
|
661
|
+
"基金代码",
|
|
662
|
+
"持仓数量",
|
|
663
|
+
"占流通股比例",
|
|
664
|
+
"持股市值",
|
|
665
|
+
"占净值比例",
|
|
666
|
+
"截止日期",
|
|
667
|
+
]
|
|
531
668
|
big_df["持仓数量"] = pd.to_numeric(big_df["持仓数量"], errors="coerce")
|
|
532
669
|
big_df["占流通股比例"] = pd.to_numeric(big_df["占流通股比例"], errors="coerce")
|
|
533
670
|
big_df["持股市值"] = pd.to_numeric(big_df["持股市值"], errors="coerce")
|
|
@@ -551,16 +688,16 @@ def stock_main_stock_holder(stock: str = "600004") -> pd.DataFrame:
|
|
|
551
688
|
temp_df = pd.read_html(StringIO(r.text))[13].iloc[:, :5]
|
|
552
689
|
temp_df.columns = [*range(5)]
|
|
553
690
|
big_df = pd.DataFrame()
|
|
554
|
-
need_range = temp_df[
|
|
555
|
-
|
|
556
|
-
]
|
|
691
|
+
need_range = temp_df[
|
|
692
|
+
temp_df.iloc[:, 0].str.find("截至日期") == 0
|
|
693
|
+
].index.tolist() + [len(temp_df)]
|
|
557
694
|
for i in range(len(need_range) - 1):
|
|
558
695
|
truncated_df = temp_df.iloc[need_range[i] : need_range[i + 1], :]
|
|
559
696
|
truncated_df = truncated_df.dropna(how="all")
|
|
560
697
|
temp_truncated = truncated_df.iloc[5:, :]
|
|
561
698
|
temp_truncated.reset_index(inplace=True, drop=True)
|
|
562
699
|
concat_df = pd.concat(
|
|
563
|
-
[
|
|
700
|
+
objs=[
|
|
564
701
|
temp_truncated,
|
|
565
702
|
truncated_df.iloc[0, :],
|
|
566
703
|
truncated_df.iloc[1, :],
|
|
@@ -578,7 +715,7 @@ def stock_main_stock_holder(stock: str = "600004") -> pd.DataFrame:
|
|
|
578
715
|
concat_df["公告日期"] = concat_df["公告日期"].ffill()
|
|
579
716
|
concat_df["股东总数"] = concat_df["股东总数"].ffill()
|
|
580
717
|
concat_df["平均持股数"] = concat_df["平均持股数"].ffill()
|
|
581
|
-
except
|
|
718
|
+
except: # noqa: E722
|
|
582
719
|
try:
|
|
583
720
|
# try for pandas < 2.1.0
|
|
584
721
|
concat_df["截至日期"] = concat_df["截至日期"].fillna(method="ffill")
|
|
@@ -589,11 +726,15 @@ def stock_main_stock_holder(stock: str = "600004") -> pd.DataFrame:
|
|
|
589
726
|
print("Error:", e)
|
|
590
727
|
|
|
591
728
|
concat_df["股东总数"] = concat_df["股东总数"].str.strip("查看变化趋势")
|
|
592
|
-
concat_df["平均持股数"] = concat_df["平均持股数"].str.strip(
|
|
593
|
-
|
|
729
|
+
concat_df["平均持股数"] = concat_df["平均持股数"].str.strip(
|
|
730
|
+
"(按总股本计算) 查看变化趋势"
|
|
731
|
+
)
|
|
732
|
+
big_df = pd.concat(objs=[big_df, concat_df], axis=0, ignore_index=True)
|
|
594
733
|
big_df.dropna(inplace=True, how="all")
|
|
595
734
|
big_df.reset_index(inplace=True, drop=True)
|
|
596
|
-
big_df.rename(
|
|
735
|
+
big_df.rename(
|
|
736
|
+
columns={"持股数量(股)": "持股数量", "持股比例(%)": "持股比例"}, inplace=True
|
|
737
|
+
)
|
|
597
738
|
big_df.columns.name = None
|
|
598
739
|
big_df["持股数量"] = pd.to_numeric(big_df["持股数量"], errors="coerce")
|
|
599
740
|
big_df["持股比例"] = big_df["持股比例"].str.strip("↓")
|
|
@@ -621,11 +762,11 @@ if __name__ == "__main__":
|
|
|
621
762
|
)
|
|
622
763
|
print(stock_financial_report_sina_df)
|
|
623
764
|
|
|
624
|
-
stock_financial_abstract_df = stock_financial_abstract(symbol="
|
|
765
|
+
stock_financial_abstract_df = stock_financial_abstract(symbol="600600")
|
|
625
766
|
print(stock_financial_abstract_df)
|
|
626
767
|
|
|
627
768
|
stock_financial_analysis_indicator_df = stock_financial_analysis_indicator(
|
|
628
|
-
symbol="
|
|
769
|
+
symbol="600519", start_year="2019"
|
|
629
770
|
)
|
|
630
771
|
print(stock_financial_analysis_indicator_df)
|
|
631
772
|
|
|
@@ -671,3 +812,6 @@ if __name__ == "__main__":
|
|
|
671
812
|
|
|
672
813
|
stock_main_stock_holder_df = stock_main_stock_holder(stock="600000")
|
|
673
814
|
print(stock_main_stock_holder_df)
|
|
815
|
+
|
|
816
|
+
stock_financial_analysis_indicator_em_df = stock_financial_analysis_indicator_em(symbol="301389.SZ", indicator="按报告期")
|
|
817
|
+
print(stock_financial_analysis_indicator_em_df)
|