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.
Files changed (388) hide show
  1. akshare/__init__.py +757 -161
  2. akshare/air/air_hebei.py +79 -53
  3. akshare/air/air_zhenqi.py +3 -7
  4. akshare/air/cons.py +1 -0
  5. akshare/air/crypto.js +1 -1
  6. akshare/air/outcrypto.js +1 -1
  7. akshare/air/sunrise_tad.py +32 -17
  8. akshare/article/cons.py +1 -0
  9. akshare/article/epu_index.py +4 -3
  10. akshare/article/ff_factor.py +19 -8
  11. akshare/article/fred_md.py +4 -1
  12. akshare/article/risk_rv.py +3 -8
  13. akshare/bank/bank_cbirc_2020.py +11 -11
  14. akshare/bank/cons.py +7 -6
  15. akshare/bond/bond_buy_back_em.py +228 -0
  16. akshare/bond/bond_cb_sina.py +1 -0
  17. akshare/bond/bond_cb_ths.py +17 -9
  18. akshare/bond/bond_cbond.py +19 -14
  19. akshare/bond/bond_china.py +38 -39
  20. akshare/bond/bond_china_money.py +75 -48
  21. akshare/bond/bond_convert.py +10 -9
  22. akshare/bond/bond_em.py +37 -17
  23. akshare/bond/bond_info_cm.py +28 -8
  24. akshare/bond/bond_issue_cninfo.py +73 -30
  25. akshare/bond/bond_summary.py +38 -37
  26. akshare/bond/bond_zh_cov.py +31 -40
  27. akshare/bond/bond_zh_sina.py +61 -51
  28. akshare/bond/cons.py +14 -11
  29. akshare/cal/__init__.py +0 -0
  30. akshare/cal/rv.py +170 -0
  31. akshare/cost/cost_living.py +7 -5
  32. akshare/crypto/__init__.py +1 -1
  33. akshare/crypto/crypto_bitcoin_cme.py +9 -7
  34. akshare/crypto/crypto_hold.py +4 -2
  35. akshare/currency/currency.py +1 -0
  36. akshare/currency/currency_china_bank_sina.py +11 -6
  37. akshare/currency/currency_safe.py +7 -6
  38. akshare/data/__init__.py +1 -1
  39. akshare/data/cninfo.js +1 -1
  40. akshare/datasets.py +10 -21
  41. akshare/economic/cons.py +10 -3
  42. akshare/economic/macro_australia.py +74 -69
  43. akshare/economic/macro_bank.py +95 -653
  44. akshare/economic/macro_canada.py +92 -81
  45. akshare/economic/macro_china.py +163 -117
  46. akshare/economic/macro_china_hk.py +0 -1
  47. akshare/economic/macro_china_nbs.py +24 -7
  48. akshare/economic/macro_euro.py +103 -56
  49. akshare/economic/macro_finance_ths.py +135 -0
  50. akshare/economic/macro_germany.py +1 -1
  51. akshare/economic/macro_info_ws.py +100 -0
  52. akshare/economic/macro_japan.py +0 -1
  53. akshare/economic/macro_other.py +1 -6
  54. akshare/economic/macro_swiss.py +2 -3
  55. akshare/economic/macro_uk.py +1 -1
  56. akshare/economic/macro_usa.py +7 -9
  57. akshare/economic/marco_cnbs.py +11 -6
  58. akshare/energy/energy_carbon.py +94 -126
  59. akshare/energy/energy_oil_em.py +1 -2
  60. akshare/event/cons.py +1 -0
  61. akshare/event/migration.py +3 -2
  62. akshare/exceptions.py +43 -0
  63. akshare/file_fold/calendar.json +245 -2
  64. akshare/forex/__init__.py +0 -0
  65. akshare/forex/cons.py +192 -0
  66. akshare/forex/forex_em.py +149 -0
  67. akshare/fortune/fortune_500.py +15 -48
  68. akshare/fortune/fortune_bloomberg.py +6 -3
  69. akshare/fortune/fortune_forbes_500.py +3 -6
  70. akshare/fortune/fortune_hurun.py +2 -1
  71. akshare/fortune/fortune_xincaifu_500.py +17 -14
  72. akshare/fund/fund_amac.py +38 -15
  73. akshare/fund/fund_announcement_em.py +145 -0
  74. akshare/fund/fund_aum_em.py +49 -35
  75. akshare/fund/fund_em.py +251 -220
  76. akshare/fund/fund_etf_em.py +44 -35
  77. akshare/fund/fund_etf_sina.py +76 -27
  78. akshare/fund/fund_etf_ths.py +95 -0
  79. akshare/fund/fund_fee_em.py +172 -0
  80. akshare/fund/fund_fhsp_em.py +42 -32
  81. akshare/fund/fund_init_em.py +8 -5
  82. akshare/fund/fund_lof_em.py +12 -19
  83. akshare/fund/fund_manager.py +25 -11
  84. akshare/fund/fund_overview_em.py +42 -0
  85. akshare/fund/fund_portfolio_em.py +78 -66
  86. akshare/fund/fund_position_lg.py +19 -8
  87. akshare/fund/fund_rank_em.py +90 -84
  88. akshare/fund/fund_rating.py +33 -12
  89. akshare/fund/fund_report_cninfo.py +63 -48
  90. akshare/fund/fund_scale_em.py +24 -13
  91. akshare/fund/fund_scale_sina.py +20 -10
  92. akshare/fund/fund_xq.py +3 -2
  93. akshare/futures/cons.py +141 -46
  94. akshare/futures/cot.py +89 -88
  95. akshare/futures/futures_basis.py +99 -33
  96. akshare/futures/futures_comex_em.py +1 -0
  97. akshare/futures/futures_comm_ctp.py +13 -2
  98. akshare/futures/futures_contract_detail.py +59 -9
  99. akshare/futures/futures_daily_bar.py +75 -62
  100. akshare/futures/futures_foreign.py +14 -8
  101. akshare/futures/futures_hf_em.py +215 -61
  102. akshare/futures/futures_hist_em.py +191 -0
  103. akshare/futures/futures_hq_sina.py +79 -61
  104. akshare/futures/futures_index_ccidx.py +24 -82
  105. akshare/futures/futures_inventory_99.py +70 -272
  106. akshare/futures/futures_inventory_em.py +14 -11
  107. akshare/futures/futures_news_shmet.py +2 -2
  108. akshare/futures/futures_roll_yield.py +11 -24
  109. akshare/futures/futures_rule.py +7 -3
  110. akshare/futures/futures_rule_em.py +38 -0
  111. akshare/futures/futures_settlement_price_sgx.py +21 -6
  112. akshare/futures/futures_stock_js.py +1 -2
  113. akshare/futures/futures_to_spot.py +43 -39
  114. akshare/futures/futures_warehouse_receipt.py +53 -48
  115. akshare/futures/futures_zh_sina.py +4 -4
  116. akshare/futures/receipt.py +298 -165
  117. akshare/futures/requests_fun.py +16 -3
  118. akshare/futures/symbol_var.py +32 -13
  119. akshare/futures_derivative/cons.py +100 -103
  120. akshare/futures_derivative/futures_contract_info_cffex.py +55 -39
  121. akshare/futures_derivative/futures_contract_info_czce.py +2 -0
  122. akshare/futures_derivative/futures_contract_info_dce.py +43 -17
  123. akshare/futures_derivative/futures_contract_info_gfex.py +43 -31
  124. akshare/futures_derivative/futures_contract_info_ine.py +43 -34
  125. akshare/futures_derivative/futures_contract_info_shfe.py +7 -8
  126. akshare/futures_derivative/futures_cot_sina.py +28 -19
  127. akshare/futures_derivative/futures_index_sina.py +25 -13
  128. akshare/fx/cons.py +12 -7
  129. akshare/fx/currency_investing.py +19 -285
  130. akshare/fx/fx_c_swap_cm.py +62 -0
  131. akshare/fx/fx_quote.py +3 -2
  132. akshare/fx/fx_quote_baidu.py +2 -1
  133. akshare/hf/__init__.py +1 -1
  134. akshare/hf/hf_sp500.py +8 -7
  135. akshare/index/cons.py +132 -28
  136. akshare/index/index_cflp.py +29 -26
  137. akshare/index/index_cni.py +89 -91
  138. akshare/index/index_cons.py +26 -10
  139. akshare/index/index_csindex.py +68 -0
  140. akshare/index/index_cx.py +263 -62
  141. akshare/index/index_drewry.py +17 -16
  142. akshare/index/index_eri.py +1 -0
  143. akshare/index/index_global_em.py +167 -0
  144. akshare/index/index_global_sina.py +82 -0
  145. akshare/index/index_kq_fz.py +17 -14
  146. akshare/index/index_kq_ss.py +1 -0
  147. akshare/index/index_option_qvix.py +351 -16
  148. akshare/index/index_research_sw.py +38 -38
  149. akshare/index/index_spot.py +9 -5
  150. akshare/index/index_stock_hk.py +6 -10
  151. akshare/index/index_stock_us_sina.py +1 -1
  152. akshare/index/index_stock_zh.py +193 -101
  153. akshare/index/index_stock_zh_csindex.py +15 -369
  154. akshare/index/index_sugar.py +18 -4
  155. akshare/index/index_sw.py +62 -34
  156. akshare/index/index_yw.py +53 -75
  157. akshare/index/index_zh_em.py +15 -82
  158. akshare/interest_rate/interbank_rate_em.py +14 -10
  159. akshare/movie/artist_yien.py +32 -5
  160. akshare/movie/jm.js +0 -1
  161. akshare/movie/movie_yien.py +92 -18
  162. akshare/movie/video_yien.py +28 -5
  163. akshare/news/__init__.py +1 -1
  164. akshare/news/news_baidu.py +395 -220
  165. akshare/news/news_cctv.py +38 -38
  166. akshare/news/news_stock.py +49 -13
  167. akshare/nlp/nlp_interface.py +7 -8
  168. akshare/option/cons.py +12 -12
  169. akshare/option/option_comm_qihuo.py +86 -0
  170. akshare/option/option_commodity.py +355 -211
  171. akshare/option/option_commodity_sina.py +22 -26
  172. akshare/option/option_contract_info_ctp.py +63 -0
  173. akshare/option/option_current_sse.py +61 -0
  174. akshare/option/option_current_szse.py +84 -0
  175. akshare/option/option_czce.py +37 -9
  176. akshare/option/option_daily_stats_sse_szse.py +145 -0
  177. akshare/option/option_em.py +4 -8
  178. akshare/option/option_finance.py +60 -12
  179. akshare/option/option_finance_sina.py +28 -26
  180. akshare/option/option_lhb_em.py +62 -57
  181. akshare/option/option_margin.py +62 -0
  182. akshare/option/option_premium_analysis_em.py +58 -53
  183. akshare/option/option_risk_analysis_em.py +11 -8
  184. akshare/option/option_risk_indicator_sse.py +18 -16
  185. akshare/option/option_value_analysis_em.py +62 -55
  186. akshare/other/__init__.py +1 -1
  187. akshare/other/other_car_cpca.py +20 -20
  188. akshare/pro/__init__.py +0 -1
  189. akshare/pro/client.py +6 -4
  190. akshare/pro/cons.py +3 -2
  191. akshare/pro/data_pro.py +6 -5
  192. akshare/qdii/__init__.py +0 -0
  193. akshare/qdii/qdii_jsl.py +233 -0
  194. akshare/qhkc/__init__.py +1 -6
  195. akshare/qhkc/qhkc_api.py +64 -22
  196. akshare/qhkc_web/__init__.py +1 -6
  197. akshare/qhkc_web/qhkc_fund.py +10 -6
  198. akshare/qhkc_web/qhkc_index.py +28 -14
  199. akshare/qhkc_web/qhkc_tool.py +62 -59
  200. akshare/rate/__init__.py +1 -1
  201. akshare/rate/repo_rate.py +36 -32
  202. akshare/reits/__init__.py +1 -1
  203. akshare/reits/reits_basic.py +149 -13
  204. akshare/request.py +117 -0
  205. akshare/spot/__init__.py +1 -1
  206. akshare/spot/spot_hog_soozhu.py +232 -0
  207. akshare/spot/spot_price_qh.py +121 -0
  208. akshare/spot/spot_sge.py +70 -9
  209. akshare/stock/cons.py +60 -23
  210. akshare/stock/stock_allotment_cninfo.py +10 -9
  211. akshare/stock/stock_ask_bid_em.py +3 -78
  212. akshare/stock/stock_board_concept_em.py +160 -35
  213. akshare/stock/stock_board_industry_em.py +163 -70
  214. akshare/stock/stock_cg_equity_mortgage.py +15 -11
  215. akshare/stock/stock_cg_guarantee.py +41 -51
  216. akshare/stock/stock_cg_lawsuit.py +36 -35
  217. akshare/stock/stock_dividend_cninfo.py +36 -16
  218. akshare/stock/stock_dzjy_em.py +347 -260
  219. akshare/stock/stock_fund_em.py +73 -64
  220. akshare/stock/stock_fund_hold.py +1 -2
  221. akshare/stock/stock_gsrl_em.py +1 -0
  222. akshare/stock/stock_hk_comparison_em.py +175 -0
  223. akshare/stock/stock_hk_famous.py +107 -0
  224. akshare/stock/stock_hk_fhpx_ths.py +2 -1
  225. akshare/stock/stock_hk_hot_rank_em.py +1 -0
  226. akshare/stock/stock_hk_sina.py +91 -42
  227. akshare/stock/stock_hold_control_cninfo.py +100 -15
  228. akshare/stock/stock_hold_control_em.py +4 -5
  229. akshare/stock/stock_hold_num_cninfo.py +18 -12
  230. akshare/stock/stock_hot_rank_em.py +4 -1
  231. akshare/stock/stock_hot_search_baidu.py +32 -19
  232. akshare/stock/stock_hot_up_em.py +4 -1
  233. akshare/stock/stock_hsgt_em.py +155 -0
  234. akshare/stock/stock_industry.py +1 -0
  235. akshare/stock/stock_industry_cninfo.py +25 -20
  236. akshare/stock/stock_industry_pe_cninfo.py +45 -31
  237. akshare/stock/stock_industry_sw.py +5 -9
  238. akshare/stock/stock_info.py +31 -19
  239. akshare/stock/stock_info_em.py +17 -11
  240. akshare/stock/stock_intraday_em.py +9 -80
  241. akshare/stock/stock_intraday_sina.py +2 -2
  242. akshare/stock/stock_ipo_summary_cninfo.py +25 -10
  243. akshare/stock/stock_new_cninfo.py +32 -19
  244. akshare/stock/stock_news_cx.py +39 -0
  245. akshare/stock/stock_profile_cninfo.py +9 -8
  246. akshare/stock/stock_profile_em.py +302 -0
  247. akshare/stock/stock_rank_forecast.py +8 -6
  248. akshare/stock/stock_repurchase_em.py +7 -2
  249. akshare/stock/stock_share_changes_cninfo.py +18 -14
  250. akshare/stock/stock_share_hold.py +24 -20
  251. akshare/stock/stock_stop.py +6 -6
  252. akshare/stock/stock_summary.py +153 -417
  253. akshare/stock/stock_us_famous.py +19 -11
  254. akshare/stock/stock_us_js.py +3 -2
  255. akshare/stock/stock_us_pink.py +38 -27
  256. akshare/stock/stock_us_sina.py +15 -12
  257. akshare/stock/stock_weibo_nlp.py +18 -20
  258. akshare/stock/stock_xq.py +36 -9
  259. akshare/stock/stock_zh_a_sina.py +58 -80
  260. akshare/stock/stock_zh_a_special.py +240 -243
  261. akshare/stock/stock_zh_a_tick_tx.py +11 -3
  262. akshare/stock/stock_zh_ah_tx.py +23 -26
  263. akshare/stock/stock_zh_b_sina.py +32 -55
  264. akshare/stock/stock_zh_comparison_em.py +250 -0
  265. akshare/stock/stock_zh_kcb_report.py +11 -9
  266. akshare/stock/stock_zh_kcb_sina.py +67 -64
  267. akshare/stock_a/__init__.py +0 -0
  268. akshare/stock_a/stock_board_concept_name_em.py +170 -0
  269. akshare/stock_a/stock_individual_fund_flow_rank.py +258 -0
  270. akshare/stock_a/stock_zh_a_spot.py +212 -0
  271. akshare/stock_feature/cons.py +1 -0
  272. akshare/stock_feature/stock_a_below_net_asset_statistics.py +5 -2
  273. akshare/stock_feature/stock_a_high_low.py +5 -2
  274. akshare/stock_feature/stock_a_indicator.py +15 -57
  275. akshare/stock_feature/stock_a_pe_and_pb.py +39 -9
  276. akshare/stock_feature/stock_account_em.py +0 -1
  277. akshare/stock_feature/stock_all_pb.py +2 -1
  278. akshare/stock_feature/stock_analyst_em.py +36 -30
  279. akshare/stock_feature/stock_board_concept_ths.py +144 -252
  280. akshare/stock_feature/stock_board_industry_ths.py +137 -401
  281. akshare/stock_feature/stock_buffett_index_lg.py +10 -8
  282. akshare/stock_feature/stock_classify_sina.py +3 -6
  283. akshare/stock_feature/stock_comment_em.py +81 -144
  284. akshare/stock_feature/stock_concept_futu.py +183 -0
  285. akshare/stock_feature/stock_congestion_lg.py +2 -1
  286. akshare/stock_feature/stock_cyq_em.py +5 -11
  287. akshare/stock_feature/stock_disclosure_cninfo.py +20 -10
  288. akshare/stock_feature/stock_dxsyl_em.py +121 -74
  289. akshare/stock_feature/stock_ebs_lg.py +5 -4
  290. akshare/stock_feature/stock_esg_sina.py +33 -15
  291. akshare/stock_feature/stock_fhps_em.py +62 -26
  292. akshare/stock_feature/stock_fhps_ths.py +34 -7
  293. akshare/stock_feature/stock_fund_flow.py +38 -25
  294. akshare/stock_feature/stock_gddh_em.py +19 -11
  295. akshare/stock_feature/stock_gdfx_em.py +226 -113
  296. akshare/stock_feature/stock_gdhs.py +75 -50
  297. akshare/stock_feature/stock_gdzjc_em.py +21 -10
  298. akshare/stock_feature/stock_gpzy_em.py +78 -46
  299. akshare/stock_feature/stock_gxl_lg.py +3 -2
  300. akshare/stock_feature/stock_hist_em.py +158 -237
  301. akshare/stock_feature/stock_hist_tx.py +13 -10
  302. akshare/stock_feature/stock_hk_valuation_baidu.py +20 -8
  303. akshare/stock_feature/stock_hot_xq.py +4 -6
  304. akshare/stock_feature/stock_hsgt_em.py +269 -97
  305. akshare/stock_feature/stock_hsgt_exchange_rate.py +115 -87
  306. akshare/stock_feature/stock_hsgt_min_em.py +13 -16
  307. akshare/stock_feature/stock_info.py +8 -81
  308. akshare/stock_feature/stock_inner_trade_xq.py +38 -31
  309. akshare/stock_feature/stock_irm_cninfo.py +32 -9
  310. akshare/stock_feature/stock_jgdy_em.py +43 -40
  311. akshare/stock_feature/stock_lh_yybpm.py +36 -37
  312. akshare/stock_feature/stock_lhb_em.py +165 -35
  313. akshare/stock_feature/stock_lhb_sina.py +93 -46
  314. akshare/stock_feature/stock_margin_em.py +101 -0
  315. akshare/stock_feature/{stock_sse_margin.py → stock_margin_sse.py} +21 -17
  316. akshare/stock_feature/{stock_szse_margin.py → stock_margin_szse.py} +7 -7
  317. akshare/stock_feature/stock_market_legu.py +4 -2
  318. akshare/stock_feature/stock_pankou_em.py +71 -35
  319. akshare/stock_feature/stock_qsjy_em.py +13 -4
  320. akshare/stock_feature/stock_report_em.py +152 -8
  321. akshare/stock_feature/stock_research_report_em.py +55 -20
  322. akshare/stock_feature/stock_sns_sseinfo.py +15 -12
  323. akshare/stock_feature/stock_sy_em.py +20 -15
  324. akshare/stock_feature/stock_technology_ths.py +152 -120
  325. akshare/stock_feature/stock_tfp_em.py +37 -14
  326. akshare/stock_feature/stock_three_report_em.py +120 -78
  327. akshare/stock_feature/stock_ttm_lyr.py +18 -9
  328. akshare/stock_feature/stock_value_em.py +83 -0
  329. akshare/stock_feature/stock_yjbb_em.py +58 -32
  330. akshare/stock_feature/stock_yjyg_cninfo.py +6 -2
  331. akshare/stock_feature/stock_yjyg_em.py +1 -1
  332. akshare/stock_feature/stock_yzxdr_em.py +24 -22
  333. akshare/stock_feature/stock_zdhtmx_em.py +20 -6
  334. akshare/stock_feature/stock_zh_valuation_baidu.py +3 -2
  335. akshare/stock_feature/stock_zh_vote_baidu.py +4 -1
  336. akshare/stock_feature/stock_ztb_em.py +39 -24
  337. akshare/stock_fundamental/__init__.py +1 -1
  338. akshare/stock_fundamental/stock_basic_info_xq.py +119 -0
  339. akshare/stock_fundamental/{stock_finance_hk.py → stock_finance_hk_em.py} +23 -16
  340. akshare/stock_fundamental/{stock_finance.py → stock_finance_sina.py} +203 -59
  341. akshare/stock_fundamental/stock_finance_ths.py +524 -57
  342. akshare/stock_fundamental/stock_finance_us_em.py +268 -0
  343. akshare/stock_fundamental/stock_gbjg_em.py +80 -0
  344. akshare/stock_fundamental/stock_hold.py +26 -17
  345. akshare/stock_fundamental/stock_ipo_declare.py +1 -0
  346. akshare/stock_fundamental/stock_kcb_detail_sse.py +10 -10
  347. akshare/stock_fundamental/stock_kcb_sse.py +26 -25
  348. akshare/stock_fundamental/stock_notice.py +41 -18
  349. akshare/stock_fundamental/stock_profit_forecast_em.py +31 -13
  350. akshare/stock_fundamental/stock_profit_forecast_hk_etnet.py +64 -41
  351. akshare/stock_fundamental/stock_profit_forecast_ths.py +86 -35
  352. akshare/stock_fundamental/stock_recommend.py +20 -4
  353. akshare/stock_fundamental/stock_register_em.py +448 -0
  354. akshare/stock_fundamental/stock_zygc.py +5 -62
  355. akshare/tool/trade_date_hist.py +1 -1
  356. akshare/utils/context.py +43 -0
  357. akshare/utils/demjson.py +2009 -1338
  358. akshare/utils/func.py +49 -2
  359. akshare/utils/multi_decrypt.py +53 -0
  360. akshare/utils/token_process.py +6 -5
  361. akshare/utils/tqdm.py +13 -3
  362. {akshare-1.13.46.dist-info → akshare-1.17.99.dist-info}/METADATA +56 -86
  363. akshare-1.17.99.dist-info/RECORD +409 -0
  364. {akshare-1.13.46.dist-info → akshare-1.17.99.dist-info}/WHEEL +1 -1
  365. {akshare-1.13.46.dist-info → akshare-1.17.99.dist-info/licenses}/LICENSE +1 -1
  366. tests/test_func.py +3 -5
  367. akshare/bond/bond_futures.py +0 -50
  368. akshare/bond/bond_investing.py +0 -139
  369. akshare/crypto/crypto_hist_investing.py +0 -249
  370. akshare/fortune/fortune_it_juzi.py +0 -123
  371. akshare/fund/fund_announcement.py +0 -56
  372. akshare/futures/futures_international.py +0 -170
  373. akshare/futures/futures_news_baidu.py +0 -54
  374. akshare/futures/inventory_data.py +0 -100
  375. akshare/futures_derivative/futures_index_price_nh.py +0 -61
  376. akshare/futures_derivative/futures_index_return_nh.py +0 -47
  377. akshare/futures_derivative/futures_index_volatility_nh.py +0 -51
  378. akshare/futures_derivative/futures_other_index_nh.py +0 -145
  379. akshare/index/index_fear_greed_funddb.py +0 -78
  380. akshare/index/index_investing.py +0 -232
  381. akshare/sport/__init__.py +0 -6
  382. akshare/sport/sport_olympic.py +0 -27
  383. akshare/sport/sport_olympic_winter.py +0 -39
  384. akshare/stock_feature/stock_wencai.py +0 -104
  385. akshare/stock_fundamental/stock_mda_ym.py +0 -40
  386. akshare/stock_fundamental/stock_register.py +0 -292
  387. akshare-1.13.46.dist-info/RECORD +0 -380
  388. {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)
@@ -33,7 +33,6 @@ def macro_japan_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()
@@ -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, params=params, headers=headers)
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": "*/*",
@@ -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__ == '__main__':
141
+ if __name__ == "__main__":
143
142
  macro_swiss_svme_df = macro_swiss_svme()
144
143
  print(macro_swiss_svme_df)
145
144
 
@@ -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()
@@ -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
- :return: pandas.DataFrame
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
- :return: pandas.DataFrame
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
- :return: pandas.DataFrame
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
- :return: pandas.DataFrame
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
- :return: pandas.DataFrame
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
- :return: pandas.DataFrame
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
- :return: pandas.DataFrame
1118
+ :rtype: pandas.DataFrame
1121
1119
  """
1122
1120
  t = time.time()
1123
1121
  params = {"_": str(int(round(t * 1000)))}
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2023/7/19 18:20
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(temp_df["非金融企业部门"], errors="coerce")
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(temp_df["金融部门资产方"], errors="coerce")
61
- temp_df["金融部门负债方"] = pd.to_numeric(temp_df["金融部门负债方"], errors="coerce")
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
 
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2022/5/25 16:05
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
- import re
22
- from functools import lru_cache
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
- soup.find(attrs={"class": "pagebar"}).find_all("option")[-1].text
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
- soup.find(attrs={"class": "pagebar"}).find_all("option")[-1].text
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 = "http://www.hbets.cn/list/13.html"
217
- r = requests.get(url)
218
- soup = BeautifulSoup(r.text, "lxml")
219
- page_string = (
220
- soup.find("div", attrs={"class": "page"}).find_all("span")[-1].text
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
- page_num = int(re.findall(r"\d+", page_string)[-1])
223
- columns = [
224
- item.text
225
- for item in soup.find("ul", attrs={"class": "title"}).find_all("li")
226
- ]
227
- big_df = pd.DataFrame()
228
- for page in tqdm(
229
- range(1, page_num + 1), desc="Please wait for a moment", leave=False
230
- ):
231
- url = f"http://www.hbets.cn/list/13.html"
232
- params = {"page": page}
233
- r = requests.get(url, params=params)
234
- soup = BeautifulSoup(r.text, "lxml")
235
- page_node = [
236
- item
237
- for item in soup.find(attrs={"class": "future_table"}).find_all(
238
- attrs={"class": "cont"}
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
- big_df.reset_index(inplace=True, drop=True)
272
- return big_df
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(temp_df["日期"], format="%Y%m%d").dt.date
304
- temp_df["开盘价"] = pd.to_numeric(temp_df["开盘价"])
305
- temp_df["收盘价"] = pd.to_numeric(temp_df["收盘价"])
306
- temp_df["最高价"] = pd.to_numeric(temp_df["最高价"])
307
- temp_df["最低价"] = pd.to_numeric(temp_df["最低价"])
308
- temp_df["涨跌"] = pd.to_numeric(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