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
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding:utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
Date: 2024/5/15 18:20
|
|
5
|
+
Desc: 华尔街见闻-日历-宏观
|
|
6
|
+
https://wallstreetcn.com/calendar
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from datetime import datetime, timedelta
|
|
10
|
+
|
|
11
|
+
import numpy as np
|
|
12
|
+
import pandas as pd
|
|
13
|
+
import requests
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def __convert_date_format(date: str) -> str:
|
|
17
|
+
"""
|
|
18
|
+
将日期字符串从格式'%Y%m%d'转换为格式'%Y-%m-%d %H:%M:%S'。
|
|
19
|
+
|
|
20
|
+
:param date: 日期字符串,格式为'%Y%m%d'
|
|
21
|
+
:return: 转换后的日期字符串,格式为'%Y-%m-%d %H:%M:%S'
|
|
22
|
+
"""
|
|
23
|
+
datetime_obj = datetime.strptime(date, "%Y%m%d")
|
|
24
|
+
return datetime_obj.strftime("%Y-%m-%d %H:%M:%S")
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def __format_date(date: str) -> int:
|
|
28
|
+
"""
|
|
29
|
+
将日期字符串转换为Unix时间戳。
|
|
30
|
+
|
|
31
|
+
:param date: 日期字符串,格式为'%Y-%m-%d %H:%M:%S'
|
|
32
|
+
:return: Unix时间戳
|
|
33
|
+
"""
|
|
34
|
+
datetime_obj = datetime.strptime(date, "%Y-%m-%d %H:%M:%S")
|
|
35
|
+
return int(datetime_obj.timestamp())
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def macro_info_ws(date: str = "20240514") -> pd.DataFrame:
|
|
39
|
+
"""
|
|
40
|
+
华尔街见闻-日历-宏观
|
|
41
|
+
https://wallstreetcn.com/calendar
|
|
42
|
+
:param date: 日期
|
|
43
|
+
:type date: str
|
|
44
|
+
:return: 日历-宏观
|
|
45
|
+
:rtype: pandas.DataFrame
|
|
46
|
+
"""
|
|
47
|
+
date = __convert_date_format(date)
|
|
48
|
+
url = "https://api-one-wscn.awtmt.com/apiv1/finance/macrodatas"
|
|
49
|
+
datetime_obj = datetime.strptime(date, "%Y-%m-%d %H:%M:%S")
|
|
50
|
+
one_day = timedelta(days=1)
|
|
51
|
+
new_datetime = datetime_obj + one_day
|
|
52
|
+
date_str = new_datetime.strftime("%Y-%m-%d %H:%M:%S")
|
|
53
|
+
params = {"start": __format_date(date), "end": __format_date(date_str)}
|
|
54
|
+
r = requests.get(url, params=params)
|
|
55
|
+
data_json = r.json()
|
|
56
|
+
temp_df = pd.DataFrame(data_json["data"]["items"])
|
|
57
|
+
temp_df["public_date"] = pd.to_datetime(
|
|
58
|
+
temp_df["public_date"], errors="coerce", unit="s", utc=True
|
|
59
|
+
).dt.tz_convert("Asia/Shanghai")
|
|
60
|
+
temp_df["public_date"] = temp_df["public_date"].dt.strftime("%Y-%m-%d %H:%M:%S")
|
|
61
|
+
temp_df = temp_df.rename(
|
|
62
|
+
columns={
|
|
63
|
+
"public_date": "时间",
|
|
64
|
+
"country": "地区",
|
|
65
|
+
"title": "事件",
|
|
66
|
+
"importance": "重要性",
|
|
67
|
+
"actual": "今值",
|
|
68
|
+
"forecast": "预期",
|
|
69
|
+
"previous": "前值",
|
|
70
|
+
"revised": "修正",
|
|
71
|
+
"uri": "链接",
|
|
72
|
+
}
|
|
73
|
+
)
|
|
74
|
+
temp_df = temp_df[
|
|
75
|
+
[
|
|
76
|
+
"时间",
|
|
77
|
+
"地区",
|
|
78
|
+
"事件",
|
|
79
|
+
"重要性",
|
|
80
|
+
"今值",
|
|
81
|
+
"预期",
|
|
82
|
+
"前值",
|
|
83
|
+
"修正",
|
|
84
|
+
"链接",
|
|
85
|
+
]
|
|
86
|
+
]
|
|
87
|
+
temp_df["今值"] = pd.to_numeric(temp_df["今值"], errors="coerce")
|
|
88
|
+
temp_df["预期"] = pd.to_numeric(temp_df["预期"], errors="coerce")
|
|
89
|
+
temp_df["前值"] = pd.to_numeric(temp_df["前值"], errors="coerce")
|
|
90
|
+
temp_df["修正"] = pd.to_numeric(temp_df["修正"], errors="coerce")
|
|
91
|
+
temp_df["前值"] = np.where(
|
|
92
|
+
temp_df["修正"].notnull(), temp_df["修正"], temp_df["前值"]
|
|
93
|
+
)
|
|
94
|
+
del temp_df["修正"]
|
|
95
|
+
return temp_df
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
if __name__ == "__main__":
|
|
99
|
+
macro_info_ws_df = macro_info_ws(date="20240514")
|
|
100
|
+
print(macro_info_ws_df)
|
akshare/economic/macro_japan.py
CHANGED
akshare/economic/macro_other.py
CHANGED
|
@@ -5,7 +5,6 @@ Date: 2024/4/3 16:36
|
|
|
5
5
|
Desc: 金十数据-其他-加密货币实时行情
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
-
import time
|
|
9
8
|
from datetime import datetime
|
|
10
9
|
|
|
11
10
|
import pandas as pd
|
|
@@ -19,9 +18,6 @@ def crypto_js_spot() -> pd.DataFrame:
|
|
|
19
18
|
:return: pandas.DataFrame
|
|
20
19
|
"""
|
|
21
20
|
url = "https://datacenter-api.jin10.com/crypto_currency/list"
|
|
22
|
-
params = {
|
|
23
|
-
"_": "1672141224307",
|
|
24
|
-
}
|
|
25
21
|
headers = {
|
|
26
22
|
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
27
23
|
"Chrome/107.0.0.0 Safari/537.36",
|
|
@@ -29,7 +25,7 @@ def crypto_js_spot() -> pd.DataFrame:
|
|
|
29
25
|
"x-csrf-token": "x-csrf-token",
|
|
30
26
|
"x-version": "1.0.0",
|
|
31
27
|
}
|
|
32
|
-
r = requests.get(url,
|
|
28
|
+
r = requests.get(url, headers=headers)
|
|
33
29
|
data_json = r.json()
|
|
34
30
|
data_df = pd.DataFrame(data_json["data"])
|
|
35
31
|
data_df["reported_at"] = pd.to_datetime(data_df["reported_at"])
|
|
@@ -79,7 +75,6 @@ def macro_fx_sentiment(
|
|
|
79
75
|
"start_date": start_date,
|
|
80
76
|
"end_date": end_date,
|
|
81
77
|
"currency_pair": "",
|
|
82
|
-
"_": int(time.time() * 1000),
|
|
83
78
|
}
|
|
84
79
|
headers = {
|
|
85
80
|
"accept": "*/*",
|
akshare/economic/macro_swiss.py
CHANGED
|
@@ -5,9 +5,9 @@ Date: 2022/11/8 10:00
|
|
|
5
5
|
Desc: 东方财富-经济数据-瑞士
|
|
6
6
|
http://data.eastmoney.com/cjsj/foreign_2_0.html
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
import pandas as pd
|
|
9
10
|
import requests
|
|
10
|
-
from akshare.utils import demjson
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
def macro_swiss_core(symbol: str = "EMG00341602") -> pd.DataFrame:
|
|
@@ -33,7 +33,6 @@ def macro_swiss_core(symbol: str = "EMG00341602") -> pd.DataFrame:
|
|
|
33
33
|
"p": "1",
|
|
34
34
|
"pageNo": "1",
|
|
35
35
|
"pageNum": "1",
|
|
36
|
-
"_": "1667639896816",
|
|
37
36
|
}
|
|
38
37
|
r = requests.get(url, params=params)
|
|
39
38
|
data_json = r.json()
|
|
@@ -139,7 +138,7 @@ def macro_swiss_gbd_bank_rate():
|
|
|
139
138
|
return temp_df
|
|
140
139
|
|
|
141
140
|
|
|
142
|
-
if __name__ ==
|
|
141
|
+
if __name__ == "__main__":
|
|
143
142
|
macro_swiss_svme_df = macro_swiss_svme()
|
|
144
143
|
print(macro_swiss_svme_df)
|
|
145
144
|
|
akshare/economic/macro_uk.py
CHANGED
|
@@ -5,6 +5,7 @@ Date: 2022/11/12 17:14
|
|
|
5
5
|
Desc: 东方财富-经济数据-英国
|
|
6
6
|
https://data.eastmoney.com/cjsj/foreign_4_0.html
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
import pandas as pd
|
|
9
10
|
import requests
|
|
10
11
|
|
|
@@ -32,7 +33,6 @@ def macro_uk_core(symbol: str = "EMG00010348") -> pd.DataFrame:
|
|
|
32
33
|
"p": "1",
|
|
33
34
|
"pageNo": "1",
|
|
34
35
|
"pageNum": "1",
|
|
35
|
-
"_": "1667639896816",
|
|
36
36
|
}
|
|
37
37
|
r = requests.get(url, params=params)
|
|
38
38
|
data_json = r.json()
|
akshare/economic/macro_usa.py
CHANGED
|
@@ -97,7 +97,6 @@ def macro_usa_phs() -> pd.DataFrame:
|
|
|
97
97
|
"p": "1",
|
|
98
98
|
"pageNo": "1",
|
|
99
99
|
"pageNum": "1",
|
|
100
|
-
"_": "1669047266881",
|
|
101
100
|
}
|
|
102
101
|
r = requests.get(url, params=params)
|
|
103
102
|
data_json = r.json()
|
|
@@ -143,7 +142,6 @@ def macro_usa_cpi_yoy() -> pd.DataFrame:
|
|
|
143
142
|
"sortTypes": "-1",
|
|
144
143
|
"source": "WEB",
|
|
145
144
|
"client": "WEB",
|
|
146
|
-
"_": "1689320600161",
|
|
147
145
|
}
|
|
148
146
|
r = requests.get(url, params=params)
|
|
149
147
|
data_json = r.json()
|
|
@@ -927,7 +925,7 @@ def macro_usa_eia_crude_rate() -> pd.DataFrame:
|
|
|
927
925
|
美国 EIA 原油库存报告, 数据区间从 19950801-至今
|
|
928
926
|
https://datacenter.jin10.com/reportType/dc_eia_crude_oil
|
|
929
927
|
:return: 美国 EIA 原油库存报告
|
|
930
|
-
:
|
|
928
|
+
:rtype: pandas.DataFrame
|
|
931
929
|
"""
|
|
932
930
|
t = time.time()
|
|
933
931
|
params = {
|
|
@@ -946,7 +944,7 @@ def macro_usa_initial_jobless() -> pd.DataFrame:
|
|
|
946
944
|
美国初请失业金人数报告, 数据区间从 19700101-至今
|
|
947
945
|
https://datacenter.jin10.com/reportType/dc_initial_jobless
|
|
948
946
|
:return: 美国 EIA 原油库存报告
|
|
949
|
-
:
|
|
947
|
+
:rtype: pandas.DataFrame
|
|
950
948
|
"""
|
|
951
949
|
t = time.time()
|
|
952
950
|
params = {
|
|
@@ -965,7 +963,7 @@ def macro_usa_crude_inner() -> pd.DataFrame:
|
|
|
965
963
|
美国原油产量报告, 数据区间从 19830107-至今
|
|
966
964
|
https://datacenter.jin10.com/reportType/dc_eia_crude_oil_produce
|
|
967
965
|
:return: 美国原油产量报告
|
|
968
|
-
:
|
|
966
|
+
:rtype: pandas.DataFrame
|
|
969
967
|
"""
|
|
970
968
|
t = time.time()
|
|
971
969
|
params = {"_": t}
|
|
@@ -1001,7 +999,7 @@ def macro_usa_cftc_nc_holding() -> pd.DataFrame:
|
|
|
1001
999
|
美国商品期货交易委员会CFTC外汇类非商业持仓报告, 数据区间从 19830107-至今
|
|
1002
1000
|
https://datacenter.jin10.com/reportType/dc_cftc_nc_report
|
|
1003
1001
|
:return: 美国商品期货交易委员会CFTC外汇类非商业持仓报告
|
|
1004
|
-
:
|
|
1002
|
+
:rtype: pandas.DataFrame
|
|
1005
1003
|
"""
|
|
1006
1004
|
t = time.time()
|
|
1007
1005
|
params = {"_": str(int(round(t * 1000)))}
|
|
@@ -1030,7 +1028,7 @@ def macro_usa_cftc_c_holding() -> pd.DataFrame:
|
|
|
1030
1028
|
美国商品期货交易委员会CFTC商品类非商业持仓报告, 数据区间从 19830107-至今
|
|
1031
1029
|
https://datacenter.jin10.com/reportType/dc_cftc_c_report
|
|
1032
1030
|
:return: 美国商品期货交易委员会CFTC外汇类非商业持仓报告
|
|
1033
|
-
:
|
|
1031
|
+
:rtype: pandas.DataFrame
|
|
1034
1032
|
"""
|
|
1035
1033
|
t = time.time()
|
|
1036
1034
|
params = {"_": str(int(round(t * 1000)))}
|
|
@@ -1059,7 +1057,7 @@ def macro_usa_cftc_merchant_currency_holding() -> pd.DataFrame:
|
|
|
1059
1057
|
美国商品期货交易委员会CFTC外汇类商业持仓报告, 数据区间从 19860115-至今
|
|
1060
1058
|
https://datacenter.jin10.com/reportType/dc_cftc_merchant_currency
|
|
1061
1059
|
:return: 美国商品期货交易委员会CFTC外汇类商业持仓报告
|
|
1062
|
-
:
|
|
1060
|
+
:rtype: pandas.DataFrame
|
|
1063
1061
|
"""
|
|
1064
1062
|
t = time.time()
|
|
1065
1063
|
params = {"_": str(int(round(t * 1000)))}
|
|
@@ -1117,7 +1115,7 @@ def macro_usa_cme_merchant_goods_holding():
|
|
|
1117
1115
|
CME-贵金属, 数据区间从 20180405-至今
|
|
1118
1116
|
https://datacenter.jin10.com/org
|
|
1119
1117
|
:return: CME-贵金属
|
|
1120
|
-
:
|
|
1118
|
+
:rtype: pandas.DataFrame
|
|
1121
1119
|
"""
|
|
1122
1120
|
t = time.time()
|
|
1123
1121
|
params = {"_": str(int(round(t * 1000)))}
|
akshare/economic/marco_cnbs.py
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date: 2023/
|
|
4
|
+
Date: 2023/8/14 11:10
|
|
5
5
|
Desc: 国家金融与发展实验室-中国宏观杠杆率数据
|
|
6
6
|
http://114.115.232.154:8080/
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
import pandas as pd
|
|
9
10
|
|
|
10
11
|
|
|
@@ -50,16 +51,20 @@ def macro_cnbs() -> pd.DataFrame:
|
|
|
50
51
|
"金融部门负债方",
|
|
51
52
|
]
|
|
52
53
|
temp_df = temp_df.reindex(columns=column_order)
|
|
53
|
-
|
|
54
54
|
temp_df["居民部门"] = pd.to_numeric(temp_df["居民部门"], errors="coerce")
|
|
55
|
-
temp_df["非金融企业部门"] = pd.to_numeric(
|
|
55
|
+
temp_df["非金融企业部门"] = pd.to_numeric(
|
|
56
|
+
temp_df["非金融企业部门"], errors="coerce"
|
|
57
|
+
)
|
|
56
58
|
temp_df["政府部门"] = pd.to_numeric(temp_df["政府部门"], errors="coerce")
|
|
57
59
|
temp_df["中央政府"] = pd.to_numeric(temp_df["中央政府"], errors="coerce")
|
|
58
60
|
temp_df["地方政府"] = pd.to_numeric(temp_df["地方政府"], errors="coerce")
|
|
59
61
|
temp_df["实体经济部门"] = pd.to_numeric(temp_df["实体经济部门"], errors="coerce")
|
|
60
|
-
temp_df["金融部门资产方"] = pd.to_numeric(
|
|
61
|
-
|
|
62
|
-
|
|
62
|
+
temp_df["金融部门资产方"] = pd.to_numeric(
|
|
63
|
+
temp_df["金融部门资产方"], errors="coerce"
|
|
64
|
+
)
|
|
65
|
+
temp_df["金融部门负债方"] = pd.to_numeric(
|
|
66
|
+
temp_df["金融部门负债方"], errors="coerce"
|
|
67
|
+
)
|
|
63
68
|
return temp_df
|
|
64
69
|
|
|
65
70
|
|
akshare/energy/energy_carbon.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding:utf-8 -*-
|
|
3
3
|
"""
|
|
4
|
-
Date:
|
|
4
|
+
Date: 2024/6/25 15:00
|
|
5
5
|
Desc: 碳排放交易
|
|
6
6
|
北京市碳排放权电子交易平台-北京市碳排放权公开交易行情
|
|
7
7
|
https://www.bjets.com.cn/article/jyxx/
|
|
@@ -18,8 +18,8 @@ http://www.cerx.cn/dailynewsOuter/index.htm
|
|
|
18
18
|
广州碳排放权交易中心-行情信息
|
|
19
19
|
http://www.cnemission.com/article/hqxx/
|
|
20
20
|
"""
|
|
21
|
-
|
|
22
|
-
from
|
|
21
|
+
|
|
22
|
+
from io import StringIO
|
|
23
23
|
|
|
24
24
|
import pandas as pd
|
|
25
25
|
import requests
|
|
@@ -27,9 +27,9 @@ from bs4 import BeautifulSoup
|
|
|
27
27
|
from tqdm import tqdm
|
|
28
28
|
|
|
29
29
|
from akshare.utils import demjson
|
|
30
|
+
from akshare.utils.cons import headers
|
|
30
31
|
|
|
31
32
|
|
|
32
|
-
@lru_cache()
|
|
33
33
|
def energy_carbon_domestic(symbol: str = "湖北") -> pd.DataFrame:
|
|
34
34
|
"""
|
|
35
35
|
碳交易网-行情信息
|
|
@@ -39,13 +39,10 @@ def energy_carbon_domestic(symbol: str = "湖北") -> pd.DataFrame:
|
|
|
39
39
|
:return: 行情信息
|
|
40
40
|
:rtype: pandas.DataFrame
|
|
41
41
|
"""
|
|
42
|
-
url =
|
|
43
|
-
"http://k.tanjiaoyi.com:8080/KDataController/getHouseDatasInAverage.do"
|
|
44
|
-
)
|
|
42
|
+
url = "http://k.tanjiaoyi.com:8080/KDataController/getHouseDatasInAverage.do"
|
|
45
43
|
params = {
|
|
46
44
|
"lcnK": "53f75bfcefff58e4046ccfa42171636c",
|
|
47
45
|
"brand": "TAN",
|
|
48
|
-
"_": "1626773022063",
|
|
49
46
|
}
|
|
50
47
|
r = requests.get(url, params=params)
|
|
51
48
|
data_text = r.text
|
|
@@ -69,14 +66,13 @@ def energy_carbon_domestic(symbol: str = "湖北") -> pd.DataFrame:
|
|
|
69
66
|
"地点",
|
|
70
67
|
]
|
|
71
68
|
]
|
|
72
|
-
temp_df["日期"] = pd.to_datetime(temp_df["日期"]).dt.date
|
|
73
|
-
temp_df["成交价"] = pd.to_numeric(temp_df["成交价"])
|
|
74
|
-
temp_df["成交量"] = pd.to_numeric(temp_df["成交量"])
|
|
75
|
-
temp_df["成交额"] = pd.to_numeric(temp_df["成交额"])
|
|
69
|
+
temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
|
|
70
|
+
temp_df["成交价"] = pd.to_numeric(temp_df["成交价"], errors="coerce")
|
|
71
|
+
temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
|
|
72
|
+
temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce")
|
|
76
73
|
return temp_df
|
|
77
74
|
|
|
78
75
|
|
|
79
|
-
@lru_cache()
|
|
80
76
|
def energy_carbon_bj() -> pd.DataFrame:
|
|
81
77
|
"""
|
|
82
78
|
北京市碳排放权电子交易平台-北京市碳排放权公开交易行情
|
|
@@ -85,8 +81,8 @@ def energy_carbon_bj() -> pd.DataFrame:
|
|
|
85
81
|
:rtype: pandas.DataFrame
|
|
86
82
|
"""
|
|
87
83
|
url = "https://www.bjets.com.cn/article/jyxx/"
|
|
88
|
-
r = requests.get(url)
|
|
89
|
-
soup = BeautifulSoup(r.text, "lxml")
|
|
84
|
+
r = requests.get(url, verify=False, headers=headers)
|
|
85
|
+
soup = BeautifulSoup(r.text, features="lxml")
|
|
90
86
|
total_page = (
|
|
91
87
|
soup.find("table")
|
|
92
88
|
.find("script")
|
|
@@ -104,10 +100,10 @@ def energy_carbon_bj() -> pd.DataFrame:
|
|
|
104
100
|
if i == 1:
|
|
105
101
|
i = ""
|
|
106
102
|
url = f"https://www.bjets.com.cn/article/jyxx/?{i}"
|
|
107
|
-
r = requests.get(url)
|
|
103
|
+
r = requests.get(url, verify=False, headers=headers)
|
|
108
104
|
r.encoding = "utf-8"
|
|
109
|
-
df = pd.read_html(r.text)[0]
|
|
110
|
-
temp_df = pd.concat([temp_df, df], ignore_index=True)
|
|
105
|
+
df = pd.read_html(StringIO(r.text))[0]
|
|
106
|
+
temp_df = pd.concat(objs=[temp_df, df], ignore_index=True)
|
|
111
107
|
temp_df.columns = ["日期", "成交量", "成交均价", "成交额"]
|
|
112
108
|
temp_df["成交单位"] = (
|
|
113
109
|
temp_df["成交额"]
|
|
@@ -125,17 +121,16 @@ def energy_carbon_bj() -> pd.DataFrame:
|
|
|
125
121
|
.str.split("(", expand=True)
|
|
126
122
|
.iloc[:, 0]
|
|
127
123
|
)
|
|
128
|
-
temp_df["成交量"] = pd.to_numeric(temp_df["成交量"])
|
|
129
|
-
temp_df["成交均价"] = pd.to_numeric(temp_df["成交均价"])
|
|
124
|
+
temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
|
|
125
|
+
temp_df["成交均价"] = pd.to_numeric(temp_df["成交均价"], errors="coerce")
|
|
130
126
|
temp_df["成交额"] = temp_df["成交额"].str.replace(",", "")
|
|
131
127
|
temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce")
|
|
132
|
-
temp_df["日期"] = pd.to_datetime(temp_df["日期"]).dt.date
|
|
133
|
-
temp_df.sort_values("日期", inplace=True)
|
|
128
|
+
temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
|
|
129
|
+
temp_df.sort_values(by="日期", inplace=True)
|
|
134
130
|
temp_df.reset_index(inplace=True, drop=True)
|
|
135
131
|
return temp_df
|
|
136
132
|
|
|
137
133
|
|
|
138
|
-
@lru_cache()
|
|
139
134
|
def energy_carbon_sz() -> pd.DataFrame:
|
|
140
135
|
"""
|
|
141
136
|
深圳碳排放交易所-国内碳情
|
|
@@ -144,33 +139,30 @@ def energy_carbon_sz() -> pd.DataFrame:
|
|
|
144
139
|
:rtype: pandas.DataFrame
|
|
145
140
|
"""
|
|
146
141
|
url = "http://www.cerx.cn/dailynewsCN/index.htm"
|
|
147
|
-
r = requests.get(url)
|
|
148
|
-
soup = BeautifulSoup(r.text, "lxml")
|
|
149
|
-
page_num = int(
|
|
150
|
-
|
|
151
|
-
)
|
|
152
|
-
big_df = pd.read_html(r.text, header=0)[0]
|
|
142
|
+
r = requests.get(url, headers=headers)
|
|
143
|
+
soup = BeautifulSoup(r.text, features="lxml")
|
|
144
|
+
page_num = int(soup.find(attrs={"class": "pagebar"}).find_all("option")[-1].text)
|
|
145
|
+
big_df = pd.read_html(StringIO(r.text), header=0)[0]
|
|
153
146
|
for page in tqdm(
|
|
154
147
|
range(2, page_num + 1), desc="Please wait for a moment", leave=False
|
|
155
148
|
):
|
|
156
149
|
url = f"http://www.cerx.cn/dailynewsCN/index_{page}.htm"
|
|
157
|
-
r = requests.get(url)
|
|
158
|
-
temp_df = pd.read_html(r.text, header=0)[0]
|
|
159
|
-
big_df = pd.concat([big_df, temp_df], ignore_index=True)
|
|
160
|
-
big_df["交易日期"] = pd.to_datetime(big_df["交易日期"]).dt.date
|
|
161
|
-
big_df["开盘价"] = pd.to_numeric(big_df["开盘价"])
|
|
162
|
-
big_df["最高价"] = pd.to_numeric(big_df["最高价"])
|
|
163
|
-
big_df["最低价"] = pd.to_numeric(big_df["最低价"])
|
|
164
|
-
big_df["成交均价"] = pd.to_numeric(big_df["成交均价"])
|
|
165
|
-
big_df["收盘价"] = pd.to_numeric(big_df["收盘价"])
|
|
166
|
-
big_df["成交量"] = pd.to_numeric(big_df["成交量"])
|
|
167
|
-
big_df["成交额"] = pd.to_numeric(big_df["成交额"])
|
|
168
|
-
big_df.sort_values("交易日期", inplace=True)
|
|
150
|
+
r = requests.get(url, headers=headers)
|
|
151
|
+
temp_df = pd.read_html(StringIO(r.text), header=0)[0]
|
|
152
|
+
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
|
|
153
|
+
big_df["交易日期"] = pd.to_datetime(big_df["交易日期"], errors="coerce").dt.date
|
|
154
|
+
big_df["开盘价"] = pd.to_numeric(big_df["开盘价"], errors="coerce")
|
|
155
|
+
big_df["最高价"] = pd.to_numeric(big_df["最高价"], errors="coerce")
|
|
156
|
+
big_df["最低价"] = pd.to_numeric(big_df["最低价"], errors="coerce")
|
|
157
|
+
big_df["成交均价"] = pd.to_numeric(big_df["成交均价"], errors="coerce")
|
|
158
|
+
big_df["收盘价"] = pd.to_numeric(big_df["收盘价"], errors="coerce")
|
|
159
|
+
big_df["成交量"] = pd.to_numeric(big_df["成交量"], errors="coerce")
|
|
160
|
+
big_df["成交额"] = pd.to_numeric(big_df["成交额"], errors="coerce")
|
|
161
|
+
big_df.sort_values(by="交易日期", inplace=True)
|
|
169
162
|
big_df.reset_index(inplace=True, drop=True)
|
|
170
163
|
return big_df
|
|
171
164
|
|
|
172
165
|
|
|
173
|
-
@lru_cache()
|
|
174
166
|
def energy_carbon_eu() -> pd.DataFrame:
|
|
175
167
|
"""
|
|
176
168
|
深圳碳排放交易所-国际碳情
|
|
@@ -179,33 +171,30 @@ def energy_carbon_eu() -> pd.DataFrame:
|
|
|
179
171
|
:rtype: pandas.DataFrame
|
|
180
172
|
"""
|
|
181
173
|
url = "http://www.cerx.cn/dailynewsOuter/index.htm"
|
|
182
|
-
r = requests.get(url)
|
|
183
|
-
soup = BeautifulSoup(r.text, "lxml")
|
|
184
|
-
page_num = int(
|
|
185
|
-
|
|
186
|
-
)
|
|
187
|
-
big_df = pd.read_html(r.text, header=0)[0]
|
|
174
|
+
r = requests.get(url, headers=headers)
|
|
175
|
+
soup = BeautifulSoup(r.text, features="lxml")
|
|
176
|
+
page_num = int(soup.find(attrs={"class": "pagebar"}).find_all("option")[-1].text)
|
|
177
|
+
big_df = pd.read_html(StringIO(r.text), header=0)[0]
|
|
188
178
|
for page in tqdm(
|
|
189
179
|
range(2, page_num + 1), desc="Please wait for a moment", leave=False
|
|
190
180
|
):
|
|
191
181
|
url = f"http://www.cerx.cn/dailynewsOuter/index_{page}.htm"
|
|
192
182
|
r = requests.get(url)
|
|
193
|
-
temp_df = pd.read_html(r.text, header=0)[0]
|
|
194
|
-
big_df = pd.concat([big_df, temp_df], ignore_index=True)
|
|
195
|
-
big_df["交易日期"] = pd.to_datetime(big_df["交易日期"]).dt.date
|
|
196
|
-
big_df["开盘价"] = pd.to_numeric(big_df["开盘价"])
|
|
197
|
-
big_df["最高价"] = pd.to_numeric(big_df["最高价"])
|
|
198
|
-
big_df["最低价"] = pd.to_numeric(big_df["最低价"])
|
|
199
|
-
big_df["成交均价"] = pd.to_numeric(big_df["成交均价"])
|
|
200
|
-
big_df["收盘价"] = pd.to_numeric(big_df["收盘价"])
|
|
201
|
-
big_df["成交量"] = pd.to_numeric(big_df["成交量"])
|
|
202
|
-
big_df["成交额"] = pd.to_numeric(big_df["成交额"])
|
|
203
|
-
big_df.sort_values("交易日期", inplace=True)
|
|
183
|
+
temp_df = pd.read_html(StringIO(r.text), header=0)[0]
|
|
184
|
+
big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
|
|
185
|
+
big_df["交易日期"] = pd.to_datetime(big_df["交易日期"], errors="coerce").dt.date
|
|
186
|
+
big_df["开盘价"] = pd.to_numeric(big_df["开盘价"], errors="coerce")
|
|
187
|
+
big_df["最高价"] = pd.to_numeric(big_df["最高价"], errors="coerce")
|
|
188
|
+
big_df["最低价"] = pd.to_numeric(big_df["最低价"], errors="coerce")
|
|
189
|
+
big_df["成交均价"] = pd.to_numeric(big_df["成交均价"], errors="coerce")
|
|
190
|
+
big_df["收盘价"] = pd.to_numeric(big_df["收盘价"], errors="coerce")
|
|
191
|
+
big_df["成交量"] = pd.to_numeric(big_df["成交量"], errors="coerce")
|
|
192
|
+
big_df["成交额"] = pd.to_numeric(big_df["成交额"], errors="coerce")
|
|
193
|
+
big_df.sort_values(by="交易日期", inplace=True)
|
|
204
194
|
big_df.reset_index(inplace=True, drop=True)
|
|
205
195
|
return big_df
|
|
206
196
|
|
|
207
197
|
|
|
208
|
-
@lru_cache()
|
|
209
198
|
def energy_carbon_hb() -> pd.DataFrame:
|
|
210
199
|
"""
|
|
211
200
|
湖北碳排放权交易中心-现货交易数据-配额-每日概况
|
|
@@ -213,66 +202,43 @@ def energy_carbon_hb() -> pd.DataFrame:
|
|
|
213
202
|
:return: 现货交易数据-配额-每日概况行情数据
|
|
214
203
|
:rtype: pandas.DataFrame
|
|
215
204
|
"""
|
|
216
|
-
url = "
|
|
217
|
-
r = requests.get(url)
|
|
218
|
-
soup = BeautifulSoup(r.text, "lxml")
|
|
219
|
-
|
|
220
|
-
soup.find("div", attrs={"class": "
|
|
205
|
+
url = "https://www.hbets.cn/"
|
|
206
|
+
r = requests.get(url, headers=headers)
|
|
207
|
+
soup = BeautifulSoup(r.text, features="lxml")
|
|
208
|
+
data_text = (
|
|
209
|
+
soup.find(name="div", attrs={"class": "threeLeft"}).find_all("script")[1].text
|
|
221
210
|
)
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
211
|
+
start_pos = data_text.find("cjj = '[") + 7 # 找到 JSON 数组开始的位置
|
|
212
|
+
end_pos = data_text.rfind("cjj =") - 31 # 找到 JSON 数组结束的位置
|
|
213
|
+
data_json = demjson.decode(data_text[start_pos:end_pos])
|
|
214
|
+
temp_df = pd.DataFrame.from_dict(data_json)
|
|
215
|
+
temp_df.rename(
|
|
216
|
+
columns={
|
|
217
|
+
"riqi": "日期",
|
|
218
|
+
"cjj": "成交价",
|
|
219
|
+
"cjl": "成交量",
|
|
220
|
+
"zx": "最新",
|
|
221
|
+
"zd": "涨跌",
|
|
222
|
+
},
|
|
223
|
+
inplace=True,
|
|
224
|
+
)
|
|
225
|
+
temp_df = temp_df[
|
|
226
|
+
[
|
|
227
|
+
"日期",
|
|
228
|
+
"成交价",
|
|
229
|
+
"成交量",
|
|
230
|
+
"最新",
|
|
231
|
+
"涨跌",
|
|
240
232
|
]
|
|
241
|
-
temp_list = []
|
|
242
|
-
for item in page_node:
|
|
243
|
-
temp_inner_list = []
|
|
244
|
-
for inner_item in item.find_all("li"):
|
|
245
|
-
temp_inner_list.append(inner_item.text)
|
|
246
|
-
temp_list.append(temp_inner_list)
|
|
247
|
-
temp_df = pd.DataFrame(temp_list)
|
|
248
|
-
big_df = pd.concat([big_df, temp_df], ignore_index=True)
|
|
249
|
-
big_df.columns = columns
|
|
250
|
-
big_df["交易品种"] = big_df["交易品种"].str.strip()
|
|
251
|
-
big_df["日期"] = pd.to_datetime(big_df["日期"]).dt.date
|
|
252
|
-
big_df["最新"] = pd.to_numeric(big_df["最新"])
|
|
253
|
-
big_df["涨跌幅"] = big_df["涨跌幅"].str.strip("%").str.strip()
|
|
254
|
-
big_df["涨跌幅"] = big_df["涨跌幅"].str.strip("%")
|
|
255
|
-
big_df["涨跌幅"] = pd.to_numeric(big_df["涨跌幅"])
|
|
256
|
-
big_df["最高"] = big_df["最高"].str.replace("--", "")
|
|
257
|
-
big_df["最高"] = pd.to_numeric(big_df["最高"])
|
|
258
|
-
big_df["最低"] = big_df["最低"].str.replace("--", "")
|
|
259
|
-
big_df["最低"] = pd.to_numeric(big_df["最低"])
|
|
260
|
-
big_df["成交量"] = big_df["成交量"].str.replace("--", "")
|
|
261
|
-
big_df["成交量"] = pd.to_numeric(big_df["成交量"])
|
|
262
|
-
big_df["成交额"] = big_df["成交额"].str.replace("--", "")
|
|
263
|
-
big_df["成交额"] = pd.to_numeric(big_df["成交额"])
|
|
264
|
-
big_df["昨收盘价"] = big_df["昨收盘价"].str.replace("--", "")
|
|
265
|
-
big_df["昨收盘价"] = pd.to_numeric(big_df["昨收盘价"])
|
|
266
|
-
big_df.dropna(subset=["最新"], inplace=True)
|
|
267
|
-
big_df.sort_values("日期", inplace=True)
|
|
268
|
-
big_df = big_df[
|
|
269
|
-
["日期", "交易品种", "最新", "涨跌幅", "最高", "最低", "成交量", "成交额", "昨收盘价"]
|
|
270
233
|
]
|
|
271
|
-
|
|
272
|
-
|
|
234
|
+
temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
|
|
235
|
+
temp_df["成交价"] = pd.to_numeric(temp_df["成交价"], errors="coerce")
|
|
236
|
+
temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
|
|
237
|
+
temp_df["最新"] = pd.to_numeric(temp_df["最新"], errors="coerce")
|
|
238
|
+
temp_df["涨跌"] = pd.to_numeric(temp_df["涨跌"], errors="coerce")
|
|
239
|
+
return temp_df
|
|
273
240
|
|
|
274
241
|
|
|
275
|
-
@lru_cache()
|
|
276
242
|
def energy_carbon_gz() -> pd.DataFrame:
|
|
277
243
|
"""
|
|
278
244
|
广州碳排放权交易中心-行情信息
|
|
@@ -287,7 +253,7 @@ def energy_carbon_gz() -> pd.DataFrame:
|
|
|
287
253
|
"endTime": "2030-09-12",
|
|
288
254
|
}
|
|
289
255
|
r = requests.get(url, params=params)
|
|
290
|
-
temp_df = pd.read_html(r.text, header=0)[1]
|
|
256
|
+
temp_df = pd.read_html(StringIO(r.text), header=0)[1]
|
|
291
257
|
temp_df.columns = [
|
|
292
258
|
"日期",
|
|
293
259
|
"品种",
|
|
@@ -300,17 +266,19 @@ def energy_carbon_gz() -> pd.DataFrame:
|
|
|
300
266
|
"成交数量",
|
|
301
267
|
"成交金额",
|
|
302
268
|
]
|
|
303
|
-
temp_df["日期"] = pd.to_datetime(
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
temp_df["
|
|
307
|
-
temp_df["
|
|
308
|
-
temp_df["
|
|
269
|
+
temp_df["日期"] = pd.to_datetime(
|
|
270
|
+
temp_df["日期"], format="%Y%m%d", errors="coerce"
|
|
271
|
+
).dt.date
|
|
272
|
+
temp_df["开盘价"] = pd.to_numeric(temp_df["开盘价"], errors="coerce")
|
|
273
|
+
temp_df["收盘价"] = pd.to_numeric(temp_df["收盘价"], errors="coerce")
|
|
274
|
+
temp_df["最高价"] = pd.to_numeric(temp_df["最高价"], errors="coerce")
|
|
275
|
+
temp_df["最低价"] = pd.to_numeric(temp_df["最低价"], errors="coerce")
|
|
276
|
+
temp_df["涨跌"] = pd.to_numeric(temp_df["涨跌"], errors="coerce")
|
|
309
277
|
temp_df["涨跌幅"] = temp_df["涨跌幅"].str.strip("%")
|
|
310
|
-
temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"])
|
|
311
|
-
temp_df["成交数量"] = pd.to_numeric(temp_df["成交数量"])
|
|
312
|
-
temp_df["成交金额"] = pd.to_numeric(temp_df["成交金额"])
|
|
313
|
-
temp_df.sort_values("日期", inplace=True)
|
|
278
|
+
temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce")
|
|
279
|
+
temp_df["成交数量"] = pd.to_numeric(temp_df["成交数量"], errors="coerce")
|
|
280
|
+
temp_df["成交金额"] = pd.to_numeric(temp_df["成交金额"], errors="coerce")
|
|
281
|
+
temp_df.sort_values(by="日期", inplace=True)
|
|
314
282
|
temp_df.reset_index(inplace=True, drop=True)
|
|
315
283
|
return temp_df
|
|
316
284
|
|