akshare 1.14.49__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 (343) hide show
  1. akshare/__init__.py +595 -129
  2. akshare/air/air_hebei.py +77 -54
  3. akshare/air/air_zhenqi.py +0 -4
  4. akshare/air/cons.py +1 -0
  5. akshare/air/crypto.js +1 -1
  6. akshare/air/outcrypto.js +1 -1
  7. akshare/article/cons.py +1 -0
  8. akshare/article/epu_index.py +4 -3
  9. akshare/article/ff_factor.py +19 -8
  10. akshare/article/fred_md.py +4 -1
  11. akshare/article/risk_rv.py +3 -8
  12. akshare/bank/bank_cbirc_2020.py +11 -11
  13. akshare/bank/cons.py +7 -6
  14. akshare/bond/bond_buy_back_em.py +228 -0
  15. akshare/bond/bond_cb_sina.py +1 -0
  16. akshare/bond/bond_cb_ths.py +17 -9
  17. akshare/bond/bond_cbond.py +19 -14
  18. akshare/bond/bond_china.py +38 -39
  19. akshare/bond/bond_china_money.py +1 -1
  20. akshare/bond/bond_convert.py +10 -9
  21. akshare/bond/bond_em.py +37 -17
  22. akshare/bond/bond_summary.py +38 -37
  23. akshare/bond/bond_zh_cov.py +31 -40
  24. akshare/bond/bond_zh_sina.py +4 -0
  25. akshare/bond/cons.py +14 -11
  26. akshare/cal/__init__.py +0 -0
  27. akshare/cal/rv.py +170 -0
  28. akshare/cost/cost_living.py +7 -5
  29. akshare/crypto/__init__.py +1 -1
  30. akshare/crypto/crypto_bitcoin_cme.py +9 -7
  31. akshare/crypto/crypto_hold.py +4 -2
  32. akshare/currency/currency.py +1 -0
  33. akshare/currency/currency_china_bank_sina.py +11 -6
  34. akshare/data/__init__.py +1 -1
  35. akshare/data/cninfo.js +1 -1
  36. akshare/datasets.py +10 -21
  37. akshare/economic/cons.py +10 -3
  38. akshare/economic/macro_australia.py +74 -69
  39. akshare/economic/macro_bank.py +95 -653
  40. akshare/economic/macro_canada.py +92 -81
  41. akshare/economic/macro_china.py +97 -105
  42. akshare/economic/macro_china_hk.py +0 -1
  43. akshare/economic/macro_euro.py +103 -56
  44. akshare/economic/macro_finance_ths.py +7 -5
  45. akshare/economic/macro_germany.py +1 -1
  46. akshare/economic/macro_japan.py +0 -1
  47. akshare/economic/macro_other.py +1 -6
  48. akshare/economic/macro_swiss.py +2 -3
  49. akshare/economic/macro_uk.py +1 -1
  50. akshare/economic/macro_usa.py +7 -9
  51. akshare/economic/marco_cnbs.py +11 -6
  52. akshare/energy/energy_carbon.py +0 -1
  53. akshare/energy/energy_oil_em.py +1 -2
  54. akshare/event/cons.py +1 -0
  55. akshare/exceptions.py +43 -0
  56. akshare/file_fold/calendar.json +245 -2
  57. akshare/forex/__init__.py +0 -0
  58. akshare/forex/cons.py +192 -0
  59. akshare/forex/forex_em.py +149 -0
  60. akshare/fortune/fortune_500.py +1 -37
  61. akshare/fortune/fortune_bloomberg.py +6 -3
  62. akshare/fortune/fortune_forbes_500.py +3 -6
  63. akshare/fortune/fortune_hurun.py +2 -1
  64. akshare/fortune/fortune_xincaifu_500.py +17 -14
  65. akshare/fund/fund_announcement_em.py +145 -0
  66. akshare/fund/fund_aum_em.py +49 -35
  67. akshare/fund/fund_em.py +251 -220
  68. akshare/fund/fund_etf_em.py +44 -35
  69. akshare/fund/fund_etf_sina.py +75 -27
  70. akshare/fund/fund_etf_ths.py +2 -0
  71. akshare/fund/fund_fee_em.py +172 -0
  72. akshare/fund/fund_fhsp_em.py +42 -32
  73. akshare/fund/fund_init_em.py +8 -5
  74. akshare/fund/fund_lof_em.py +12 -19
  75. akshare/fund/fund_manager.py +25 -11
  76. akshare/fund/fund_overview_em.py +42 -0
  77. akshare/fund/fund_portfolio_em.py +23 -21
  78. akshare/fund/fund_position_lg.py +19 -8
  79. akshare/fund/fund_rank_em.py +2 -5
  80. akshare/fund/fund_rating.py +33 -12
  81. akshare/fund/fund_scale_em.py +24 -13
  82. akshare/fund/fund_scale_sina.py +20 -10
  83. akshare/fund/fund_xq.py +3 -2
  84. akshare/futures/cons.py +135 -39
  85. akshare/futures/cot.py +55 -56
  86. akshare/futures/futures_basis.py +49 -11
  87. akshare/futures/futures_comex_em.py +1 -0
  88. akshare/futures/futures_comm_ctp.py +1 -1
  89. akshare/futures/futures_contract_detail.py +59 -9
  90. akshare/futures/futures_daily_bar.py +66 -59
  91. akshare/futures/futures_foreign.py +14 -8
  92. akshare/futures/futures_hf_em.py +215 -61
  93. akshare/futures/futures_hist_em.py +191 -0
  94. akshare/futures/futures_hq_sina.py +5 -3
  95. akshare/futures/futures_index_ccidx.py +24 -82
  96. akshare/futures/futures_inventory_99.py +70 -272
  97. akshare/futures/futures_inventory_em.py +14 -11
  98. akshare/futures/futures_news_shmet.py +2 -2
  99. akshare/futures/futures_roll_yield.py +11 -24
  100. akshare/futures/futures_rule.py +7 -3
  101. akshare/futures/futures_rule_em.py +38 -0
  102. akshare/futures/futures_settlement_price_sgx.py +21 -6
  103. akshare/futures/futures_stock_js.py +0 -1
  104. akshare/futures/futures_to_spot.py +5 -6
  105. akshare/futures/futures_warehouse_receipt.py +48 -47
  106. akshare/futures/futures_zh_sina.py +3 -3
  107. akshare/futures/receipt.py +298 -165
  108. akshare/futures/requests_fun.py +16 -3
  109. akshare/futures/symbol_var.py +32 -13
  110. akshare/futures_derivative/cons.py +100 -103
  111. akshare/futures_derivative/futures_contract_info_cffex.py +55 -39
  112. akshare/futures_derivative/futures_contract_info_czce.py +2 -0
  113. akshare/futures_derivative/futures_contract_info_dce.py +43 -17
  114. akshare/futures_derivative/futures_contract_info_gfex.py +43 -31
  115. akshare/futures_derivative/futures_contract_info_ine.py +43 -34
  116. akshare/futures_derivative/futures_contract_info_shfe.py +3 -4
  117. akshare/futures_derivative/futures_cot_sina.py +8 -6
  118. akshare/futures_derivative/futures_index_sina.py +25 -13
  119. akshare/fx/cons.py +12 -7
  120. akshare/fx/fx_c_swap_cm.py +62 -0
  121. akshare/fx/fx_quote.py +3 -2
  122. akshare/fx/fx_quote_baidu.py +2 -1
  123. akshare/hf/__init__.py +1 -1
  124. akshare/hf/hf_sp500.py +8 -7
  125. akshare/index/cons.py +132 -28
  126. akshare/index/index_cni.py +7 -7
  127. akshare/index/index_cons.py +2 -2
  128. akshare/index/index_csindex.py +68 -0
  129. akshare/index/index_cx.py +20 -20
  130. akshare/index/index_drewry.py +17 -16
  131. akshare/index/index_eri.py +1 -0
  132. akshare/index/index_global_em.py +167 -0
  133. akshare/index/index_global_sina.py +82 -0
  134. akshare/index/index_kq_fz.py +17 -14
  135. akshare/index/index_kq_ss.py +1 -0
  136. akshare/index/index_option_qvix.py +351 -16
  137. akshare/index/index_research_sw.py +21 -21
  138. akshare/index/index_spot.py +9 -5
  139. akshare/index/index_stock_hk.py +5 -9
  140. akshare/index/index_stock_zh.py +111 -24
  141. akshare/index/index_stock_zh_csindex.py +3 -367
  142. akshare/index/index_sugar.py +18 -4
  143. akshare/index/index_sw.py +10 -2
  144. akshare/index/index_yw.py +53 -75
  145. akshare/index/index_zh_em.py +15 -82
  146. akshare/interest_rate/interbank_rate_em.py +0 -1
  147. akshare/movie/jm.js +0 -1
  148. akshare/news/__init__.py +1 -1
  149. akshare/news/news_baidu.py +395 -222
  150. akshare/news/news_stock.py +49 -16
  151. akshare/option/cons.py +2 -2
  152. akshare/option/option_commodity.py +341 -220
  153. akshare/option/option_commodity_sina.py +22 -26
  154. akshare/option/option_contract_info_ctp.py +63 -0
  155. akshare/option/option_current_sse.py +61 -0
  156. akshare/option/option_current_szse.py +84 -0
  157. akshare/option/option_czce.py +37 -9
  158. akshare/option/option_daily_stats_sse_szse.py +0 -1
  159. akshare/option/option_em.py +4 -8
  160. akshare/option/option_finance.py +60 -12
  161. akshare/option/option_finance_sina.py +7 -7
  162. akshare/option/option_lhb_em.py +0 -1
  163. akshare/option/option_margin.py +62 -0
  164. akshare/option/option_premium_analysis_em.py +58 -53
  165. akshare/option/option_risk_analysis_em.py +11 -8
  166. akshare/option/option_risk_indicator_sse.py +3 -4
  167. akshare/option/option_value_analysis_em.py +62 -55
  168. akshare/other/__init__.py +1 -1
  169. akshare/pro/__init__.py +0 -1
  170. akshare/pro/client.py +6 -4
  171. akshare/pro/cons.py +3 -2
  172. akshare/pro/data_pro.py +6 -5
  173. akshare/qdii/__init__.py +0 -0
  174. akshare/qdii/qdii_jsl.py +233 -0
  175. akshare/qhkc/__init__.py +1 -6
  176. akshare/qhkc/qhkc_api.py +64 -22
  177. akshare/qhkc_web/__init__.py +1 -6
  178. akshare/qhkc_web/qhkc_fund.py +10 -6
  179. akshare/qhkc_web/qhkc_index.py +28 -14
  180. akshare/qhkc_web/qhkc_tool.py +62 -59
  181. akshare/rate/__init__.py +1 -1
  182. akshare/rate/repo_rate.py +36 -32
  183. akshare/reits/__init__.py +1 -1
  184. akshare/reits/reits_basic.py +149 -13
  185. akshare/request.py +117 -0
  186. akshare/spot/__init__.py +1 -1
  187. akshare/spot/spot_hog_soozhu.py +165 -3
  188. akshare/spot/spot_sge.py +70 -9
  189. akshare/stock/cons.py +60 -23
  190. akshare/stock/stock_allotment_cninfo.py +8 -8
  191. akshare/stock/stock_ask_bid_em.py +3 -78
  192. akshare/stock/stock_board_concept_em.py +160 -35
  193. akshare/stock/stock_board_industry_em.py +163 -70
  194. akshare/stock/stock_dividend_cninfo.py +31 -17
  195. akshare/stock/stock_dzjy_em.py +347 -260
  196. akshare/stock/stock_fund_em.py +72 -64
  197. akshare/stock/stock_fund_hold.py +1 -2
  198. akshare/stock/stock_gsrl_em.py +1 -0
  199. akshare/stock/stock_hk_comparison_em.py +175 -0
  200. akshare/stock/stock_hk_famous.py +4 -5
  201. akshare/stock/stock_hk_fhpx_ths.py +2 -1
  202. akshare/stock/stock_hk_hot_rank_em.py +1 -0
  203. akshare/stock/stock_hk_sina.py +84 -36
  204. akshare/stock/stock_hold_control_cninfo.py +82 -0
  205. akshare/stock/stock_hold_control_em.py +0 -2
  206. akshare/stock/stock_hot_rank_em.py +4 -1
  207. akshare/stock/stock_hot_search_baidu.py +32 -19
  208. akshare/stock/stock_hot_up_em.py +4 -1
  209. akshare/stock/stock_hsgt_em.py +155 -0
  210. akshare/stock/stock_industry.py +1 -0
  211. akshare/stock/stock_industry_cninfo.py +1 -2
  212. akshare/stock/stock_info.py +6 -4
  213. akshare/stock/stock_info_em.py +17 -11
  214. akshare/stock/stock_intraday_em.py +4 -78
  215. akshare/stock/stock_intraday_sina.py +2 -2
  216. akshare/stock/stock_news_cx.py +39 -0
  217. akshare/stock/stock_profile_cninfo.py +7 -7
  218. akshare/stock/stock_profile_em.py +302 -0
  219. akshare/stock/stock_rank_forecast.py +6 -5
  220. akshare/stock/stock_repurchase_em.py +7 -2
  221. akshare/stock/stock_share_changes_cninfo.py +7 -5
  222. akshare/stock/stock_share_hold.py +24 -20
  223. akshare/stock/stock_stop.py +6 -6
  224. akshare/stock/stock_summary.py +153 -417
  225. akshare/stock/stock_us_famous.py +5 -6
  226. akshare/stock/stock_us_js.py +3 -2
  227. akshare/stock/stock_us_pink.py +38 -27
  228. akshare/stock/stock_us_sina.py +7 -3
  229. akshare/stock/stock_weibo_nlp.py +18 -20
  230. akshare/stock/stock_xq.py +24 -22
  231. akshare/stock/stock_zh_a_sina.py +8 -5
  232. akshare/stock/stock_zh_a_special.py +240 -243
  233. akshare/stock/stock_zh_a_tick_tx.py +11 -3
  234. akshare/stock/stock_zh_ah_tx.py +23 -26
  235. akshare/stock/stock_zh_b_sina.py +2 -2
  236. akshare/stock/stock_zh_comparison_em.py +250 -0
  237. akshare/stock/stock_zh_kcb_sina.py +67 -64
  238. akshare/stock_a/__init__.py +0 -0
  239. akshare/stock_a/stock_board_concept_name_em.py +170 -0
  240. akshare/stock_a/stock_individual_fund_flow_rank.py +258 -0
  241. akshare/stock_a/stock_zh_a_spot.py +212 -0
  242. akshare/stock_feature/cons.py +1 -0
  243. akshare/stock_feature/stock_a_indicator.py +9 -54
  244. akshare/stock_feature/stock_a_pe_and_pb.py +23 -5
  245. akshare/stock_feature/stock_account_em.py +0 -1
  246. akshare/stock_feature/stock_all_pb.py +2 -1
  247. akshare/stock_feature/stock_analyst_em.py +36 -30
  248. akshare/stock_feature/stock_board_concept_ths.py +328 -0
  249. akshare/stock_feature/stock_board_industry_ths.py +57 -2
  250. akshare/stock_feature/stock_buffett_index_lg.py +10 -8
  251. akshare/stock_feature/stock_classify_sina.py +3 -6
  252. akshare/stock_feature/stock_comment_em.py +81 -144
  253. akshare/stock_feature/stock_congestion_lg.py +2 -1
  254. akshare/stock_feature/stock_cyq_em.py +5 -11
  255. akshare/stock_feature/stock_disclosure_cninfo.py +6 -6
  256. akshare/stock_feature/stock_dxsyl_em.py +121 -74
  257. akshare/stock_feature/stock_ebs_lg.py +5 -4
  258. akshare/stock_feature/stock_esg_sina.py +29 -7
  259. akshare/stock_feature/stock_fhps_em.py +2 -1
  260. akshare/stock_feature/stock_fhps_ths.py +15 -7
  261. akshare/stock_feature/stock_fund_flow.py +30 -22
  262. akshare/stock_feature/stock_gddh_em.py +19 -11
  263. akshare/stock_feature/stock_gdfx_em.py +226 -113
  264. akshare/stock_feature/stock_gdhs.py +75 -50
  265. akshare/stock_feature/stock_gdzjc_em.py +21 -10
  266. akshare/stock_feature/stock_gpzy_em.py +78 -46
  267. akshare/stock_feature/stock_gxl_lg.py +3 -2
  268. akshare/stock_feature/stock_hist_em.py +137 -234
  269. akshare/stock_feature/stock_hist_tx.py +13 -10
  270. akshare/stock_feature/stock_hk_valuation_baidu.py +20 -8
  271. akshare/stock_feature/stock_hot_xq.py +4 -6
  272. akshare/stock_feature/stock_hsgt_em.py +269 -97
  273. akshare/stock_feature/stock_hsgt_exchange_rate.py +115 -87
  274. akshare/stock_feature/stock_hsgt_min_em.py +13 -16
  275. akshare/stock_feature/stock_info.py +7 -80
  276. akshare/stock_feature/stock_inner_trade_xq.py +38 -31
  277. akshare/stock_feature/stock_jgdy_em.py +43 -40
  278. akshare/stock_feature/stock_lhb_em.py +119 -3
  279. akshare/stock_feature/stock_margin_em.py +0 -1
  280. akshare/stock_feature/stock_margin_sse.py +0 -2
  281. akshare/stock_feature/stock_pankou_em.py +71 -35
  282. akshare/stock_feature/stock_qsjy_em.py +13 -4
  283. akshare/stock_feature/stock_report_em.py +151 -7
  284. akshare/stock_feature/stock_research_report_em.py +55 -20
  285. akshare/stock_feature/stock_sy_em.py +20 -15
  286. akshare/stock_feature/stock_technology_ths.py +122 -77
  287. akshare/stock_feature/stock_tfp_em.py +2 -1
  288. akshare/stock_feature/stock_three_report_em.py +21 -5
  289. akshare/stock_feature/stock_ttm_lyr.py +18 -9
  290. akshare/stock_feature/stock_value_em.py +83 -0
  291. akshare/stock_feature/stock_yjbb_em.py +58 -32
  292. akshare/stock_feature/stock_yjyg_cninfo.py +6 -2
  293. akshare/stock_feature/stock_yjyg_em.py +1 -1
  294. akshare/stock_feature/stock_yzxdr_em.py +24 -22
  295. akshare/stock_feature/stock_zdhtmx_em.py +20 -6
  296. akshare/stock_feature/stock_zh_vote_baidu.py +4 -1
  297. akshare/stock_feature/stock_ztb_em.py +39 -24
  298. akshare/stock_fundamental/__init__.py +1 -1
  299. akshare/stock_fundamental/stock_basic_info_xq.py +119 -0
  300. akshare/stock_fundamental/{stock_finance_hk.py → stock_finance_hk_em.py} +23 -16
  301. akshare/stock_fundamental/{stock_finance.py → stock_finance_sina.py} +60 -7
  302. akshare/stock_fundamental/stock_finance_ths.py +524 -57
  303. akshare/stock_fundamental/stock_finance_us_em.py +268 -0
  304. akshare/stock_fundamental/stock_gbjg_em.py +80 -0
  305. akshare/stock_fundamental/stock_hold.py +26 -17
  306. akshare/stock_fundamental/stock_ipo_declare.py +1 -0
  307. akshare/stock_fundamental/stock_kcb_detail_sse.py +10 -10
  308. akshare/stock_fundamental/stock_kcb_sse.py +26 -25
  309. akshare/stock_fundamental/stock_notice.py +12 -3
  310. akshare/stock_fundamental/stock_profit_forecast_em.py +31 -13
  311. akshare/stock_fundamental/stock_profit_forecast_hk_etnet.py +64 -41
  312. akshare/stock_fundamental/stock_profit_forecast_ths.py +86 -35
  313. akshare/stock_fundamental/stock_recommend.py +20 -4
  314. akshare/stock_fundamental/stock_zygc.py +5 -62
  315. akshare/utils/context.py +43 -0
  316. akshare/utils/demjson.py +2009 -1338
  317. akshare/utils/func.py +49 -2
  318. akshare/utils/multi_decrypt.py +53 -0
  319. akshare/utils/token_process.py +6 -5
  320. {akshare-1.14.49.dist-info → akshare-1.17.99.dist-info}/METADATA +54 -80
  321. akshare-1.17.99.dist-info/RECORD +409 -0
  322. {akshare-1.14.49.dist-info → akshare-1.17.99.dist-info}/WHEEL +1 -1
  323. {akshare-1.14.49.dist-info → akshare-1.17.99.dist-info/licenses}/LICENSE +1 -1
  324. tests/test_func.py +3 -5
  325. akshare/bond/bond_futures.py +0 -50
  326. akshare/bond/bond_investing.py +0 -139
  327. akshare/crypto/crypto_hist_investing.py +0 -249
  328. akshare/fund/fund_announcement.py +0 -56
  329. akshare/futures/futures_international.py +0 -170
  330. akshare/futures/futures_news_baidu.py +0 -54
  331. akshare/futures/inventory_data.py +0 -100
  332. akshare/futures_derivative/futures_index_price_nh.py +0 -61
  333. akshare/futures_derivative/futures_index_return_nh.py +0 -47
  334. akshare/futures_derivative/futures_index_volatility_nh.py +0 -53
  335. akshare/futures_derivative/futures_other_index_nh.py +0 -145
  336. akshare/index/index_fear_greed_funddb.py +0 -78
  337. akshare/index/index_investing.py +0 -232
  338. akshare/sport/__init__.py +0 -6
  339. akshare/sport/sport_olympic.py +0 -27
  340. akshare/stock_feature/stock_wencai.py +0 -104
  341. akshare/stock_fundamental/stock_mda_ym.py +0 -40
  342. akshare-1.14.49.dist-info/RECORD +0 -387
  343. {akshare-1.14.49.dist-info → akshare-1.17.99.dist-info}/top_level.txt +0 -0
@@ -5,6 +5,7 @@ Date: 2024/1/6 15:00
5
5
  Desc: 东方财富网-数据中心-研究报告-盈利预测
6
6
  https://data.eastmoney.com/report/profitforecast.jshtml
7
7
  """
8
+
8
9
  import pandas as pd
9
10
  import requests
10
11
 
@@ -15,7 +16,8 @@ def stock_profit_forecast_em(symbol: str = "") -> pd.DataFrame:
15
16
  """
16
17
  东方财富网-数据中心-研究报告-盈利预测
17
18
  https://data.eastmoney.com/report/profitforecast.jshtml
18
- :param symbol: "", 默认为获取全部数据; symbol="船舶制造", 则获取具体行业板块的数据; 行业板块可以通过 ak.stock_board_industry_name_em() 接口获取
19
+ :param symbol: "", 默认为获取全部数据; symbol="船舶制造", 则获取具体行业板块的数据;
20
+ 行业板块可以通过 ak.stock_board_industry_name_em() 接口获取
19
21
  :type symbol: str
20
22
  :return: 盈利预测
21
23
  :rtype: pandas.DataFrame
@@ -34,7 +36,6 @@ def stock_profit_forecast_em(symbol: str = "") -> pd.DataFrame:
34
36
  }
35
37
  if symbol:
36
38
  params.update({"filter": f'(INDUSTRY_BOARD="{symbol}")'})
37
-
38
39
  r = requests.get(url, params=params)
39
40
  data_json = r.json()
40
41
  page_num = int(data_json["result"]["pages"])
@@ -52,7 +53,7 @@ def stock_profit_forecast_em(symbol: str = "") -> pd.DataFrame:
52
53
  r = requests.get(url, params=params)
53
54
  data_json = r.json()
54
55
  temp_df = pd.DataFrame(data_json["result"]["data"])
55
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
56
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
56
57
 
57
58
  big_df.reset_index(inplace=True)
58
59
  big_df["index"] = big_df.index + 1
@@ -94,7 +95,6 @@ def stock_profit_forecast_em(symbol: str = "") -> pd.DataFrame:
94
95
  "_",
95
96
  "_",
96
97
  ]
97
-
98
98
  big_df = big_df[
99
99
  [
100
100
  "序号",
@@ -112,11 +112,12 @@ def stock_profit_forecast_em(symbol: str = "") -> pd.DataFrame:
112
112
  f"{year4}预测每股收益",
113
113
  ]
114
114
  ]
115
- big_df["机构投资评级(近六个月)-买入"].fillna(0, inplace=True)
116
- big_df["机构投资评级(近六个月)-增持"].fillna(0, inplace=True)
117
- big_df["机构投资评级(近六个月)-中性"].fillna(0, inplace=True)
118
- big_df["机构投资评级(近六个月)-减持"].fillna(0, inplace=True)
119
- big_df["机构投资评级(近六个月)-卖出"].fillna(0, inplace=True)
115
+ big_df["机构投资评级(近六个月)-买入"] = big_df[
116
+ "机构投资评级(近六个月)-买入"
117
+ ].fillna(0)
118
+ big_df["机构投资评级(近六个月)-增持"] = big_df[
119
+ "机构投资评级(近六个月)-增持"
120
+ ].fillna(0)
120
121
  big_df["研报数"] = pd.to_numeric(big_df["研报数"], errors="coerce")
121
122
  big_df["机构投资评级(近六个月)-买入"] = pd.to_numeric(
122
123
  big_df["机构投资评级(近六个月)-买入"], errors="coerce"
@@ -133,10 +134,27 @@ def stock_profit_forecast_em(symbol: str = "") -> pd.DataFrame:
133
134
  big_df["机构投资评级(近六个月)-卖出"] = pd.to_numeric(
134
135
  big_df["机构投资评级(近六个月)-卖出"], errors="coerce"
135
136
  )
136
- big_df[f"{year1}预测每股收益"] = pd.to_numeric(big_df[f"{year1}预测每股收益"], errors="coerce")
137
- big_df[f"{year2}预测每股收益"] = pd.to_numeric(big_df[f"{year2}预测每股收益"], errors="coerce")
138
- big_df[f"{year3}预测每股收益"] = pd.to_numeric(big_df[f"{year3}预测每股收益"], errors="coerce")
139
- big_df[f"{year4}预测每股收益"] = pd.to_numeric(big_df[f"{year4}预测每股收益"], errors="coerce")
137
+ big_df["机构投资评级(近六个月)-中性"] = big_df[
138
+ "机构投资评级(近六个月)-中性"
139
+ ].fillna(0)
140
+ big_df["机构投资评级(近六个月)-减持"] = big_df[
141
+ "机构投资评级(近六个月)-减持"
142
+ ].fillna(0)
143
+ big_df["机构投资评级(近六个月)-卖出"] = big_df[
144
+ "机构投资评级(近六个月)-卖出"
145
+ ].fillna(0)
146
+ big_df[f"{year1}预测每股收益"] = pd.to_numeric(
147
+ big_df[f"{year1}预测每股收益"], errors="coerce"
148
+ )
149
+ big_df[f"{year2}预测每股收益"] = pd.to_numeric(
150
+ big_df[f"{year2}预测每股收益"], errors="coerce"
151
+ )
152
+ big_df[f"{year3}预测每股收益"] = pd.to_numeric(
153
+ big_df[f"{year3}预测每股收益"], errors="coerce"
154
+ )
155
+ big_df[f"{year4}预测每股收益"] = pd.to_numeric(
156
+ big_df[f"{year4}预测每股收益"], errors="coerce"
157
+ )
140
158
  big_df.sort_values(["研报数"], ascending=False, inplace=True, ignore_index=True)
141
159
  big_df["序号"] = range(1, len(big_df) + 1)
142
160
  return big_df
@@ -5,13 +5,16 @@ Date: 2024/1/7 15:00
5
5
  Desc: 东方财富网-数据中心-研究报告-盈利预测
6
6
  https://data.eastmoney.com/report/profitforecast.jshtml
7
7
  """
8
+
8
9
  from io import StringIO
9
10
 
10
11
  import pandas as pd
11
12
  import requests
12
13
 
13
14
 
14
- def stock_hk_profit_forecast_et(symbol: str = "09999", indicator: str = "盈利预测概览") -> pd.DataFrame:
15
+ def stock_hk_profit_forecast_et(
16
+ symbol: str = "09999", indicator: str = "盈利预测概览"
17
+ ) -> pd.DataFrame:
15
18
  """
16
19
  经济通-公司资料-盈利预测
17
20
  https://www.etnet.com.hk/www/sc/stocks/realtime/quote_profit.php?code=9999
@@ -46,58 +49,78 @@ def stock_hk_profit_forecast_et(symbol: str = "09999", indicator: str = "盈利
46
49
  return temp_df
47
50
  elif indicator == "综合盈利预测":
48
51
  temp_df = pd.read_html(StringIO(r.text), header=0)[3]
49
- temp_df.rename(columns={
50
- "纯利/(亏损) (百万元人民币)": "纯利/亏损",
51
- "纯利/(亏损) (百万港元)": "纯利/亏损",
52
- "每股盈利/ (亏损)()": "每股盈利/每股亏损",
53
- "每股盈利/ (亏损)(港仙)": "每股盈利/每股亏损",
54
- "每股派息 ()": "每股派息",
55
- "每股派息 (港仙)": "每股派息",
56
- "每股资产净值 (人民币元)": "每股资产净值",
57
- "每股资产净值 (港元)": "每股资产净值",
58
- "最高 (百万元人民币)": "最高",
59
- "最高 (百万港元)": "最高",
60
- "最低 (百万元人民币)": "最低",
61
- "最低 (百万港元)": "最低",
62
- }, inplace=True)
63
- temp_df['纯利/亏损'] = pd.to_numeric(temp_df['纯利/亏损'], errors='coerce')
64
- temp_df['每股盈利/每股亏损'] = pd.to_numeric(temp_df['每股盈利/每股亏损'], errors='coerce')
65
- temp_df['每股派息'] = pd.to_numeric(temp_df['每股派息'], errors='coerce')
66
- temp_df['每股资产净值'] = pd.to_numeric(temp_df['每股资产净值'], errors='coerce')
67
- temp_df['最高'] = pd.to_numeric(temp_df['最高'], errors='coerce')
68
- temp_df['最低'] = pd.to_numeric(temp_df['最低'], errors='coerce')
52
+ temp_df.rename(
53
+ columns={
54
+ "纯利/(亏损) (百万元人民币)": "纯利/亏损",
55
+ "纯利/(亏损) (百万港元)": "纯利/亏损",
56
+ "每股盈利/ (亏损)()": "每股盈利/每股亏损",
57
+ "每股盈利/ (亏损)(港仙)": "每股盈利/每股亏损",
58
+ "每股派息 ()": "每股派息",
59
+ "每股派息 (港仙)": "每股派息",
60
+ "每股资产净值 (人民币元)": "每股资产净值",
61
+ "每股资产净值 (港元)": "每股资产净值",
62
+ "最高 (百万元人民币)": "最高",
63
+ "最高 (百万港元)": "最高",
64
+ "最低 (百万元人民币)": "最低",
65
+ "最低 (百万港元)": "最低",
66
+ },
67
+ inplace=True,
68
+ )
69
+ temp_df["纯利/亏损"] = pd.to_numeric(temp_df["纯利/亏损"], errors="coerce")
70
+ temp_df["每股盈利/每股亏损"] = pd.to_numeric(
71
+ temp_df["每股盈利/每股亏损"], errors="coerce"
72
+ )
73
+ temp_df["每股派息"] = pd.to_numeric(temp_df["每股派息"], errors="coerce")
74
+ temp_df["每股资产净值"] = pd.to_numeric(
75
+ temp_df["每股资产净值"], errors="coerce"
76
+ )
77
+ temp_df["最高"] = pd.to_numeric(temp_df["最高"], errors="coerce")
78
+ temp_df["最低"] = pd.to_numeric(temp_df["最低"], errors="coerce")
69
79
  return temp_df
70
80
  elif indicator == "盈利预测概览":
71
81
  temp_df = pd.read_html(StringIO(r.text), header=0)[4]
72
- del temp_df['目标价* (港元).1']
73
- temp_df.rename(columns={
74
- "纯利/(亏损) (百万元人民币)": "纯利/亏损",
75
- "纯利/(亏损) (百万港元)": "纯利/亏损",
76
- "每股盈利*/ (亏损) (港仙)": "每股盈利",
77
- "每股盈利*/ (亏损) ()": "每股盈利",
78
- "每股派息* (分)": "每股派息",
79
- "每股派息* (港仙)": "每股派息",
80
- "目标价* (港元)": "目标价",
81
- }, inplace=True)
82
+ del temp_df["目标价* (港元).1"]
83
+ temp_df.rename(
84
+ columns={
85
+ "纯利/(亏损) (百万元人民币)": "纯利/亏损",
86
+ "纯利/(亏损) (百万港元)": "纯利/亏损",
87
+ "每股盈利*/ (亏损) (港仙)": "每股盈利",
88
+ "每股盈利*/ (亏损) (分)": "每股盈利",
89
+ "每股派息* ()": "每股派息",
90
+ "每股派息* (港仙)": "每股派息",
91
+ "目标价* (港元)": "目标价",
92
+ },
93
+ inplace=True,
94
+ )
82
95
  temp_df.dropna(inplace=True)
83
- temp_df['纯利/亏损'] = pd.to_numeric(temp_df['纯利/亏损'], errors='coerce')
84
- temp_df['每股盈利'] = pd.to_numeric(temp_df['每股盈利'], errors='coerce')
85
- temp_df['每股派息'] = pd.to_numeric(temp_df['每股派息'], errors='coerce')
86
- temp_df['目标价'] = pd.to_numeric(temp_df['目标价'], errors='coerce')
87
- temp_df['更新日期'] = pd.to_datetime(temp_df['更新日期'], errors='coerce', dayfirst=True).dt.date
88
- temp_df['财政年度'] = temp_df['财政年度'].astype(int).astype(str)
96
+ temp_df["纯利/亏损"] = pd.to_numeric(temp_df["纯利/亏损"], errors="coerce")
97
+ temp_df["每股盈利"] = pd.to_numeric(temp_df["每股盈利"], errors="coerce")
98
+ temp_df["每股派息"] = pd.to_numeric(temp_df["每股派息"], errors="coerce")
99
+ temp_df["目标价"] = pd.to_numeric(temp_df["目标价"], errors="coerce")
100
+ temp_df["更新日期"] = pd.to_datetime(
101
+ temp_df["更新日期"], errors="coerce", dayfirst=True
102
+ ).dt.date
103
+ temp_df["财政年度"] = temp_df["财政年度"].astype(int).astype(str)
89
104
  return temp_df
90
105
 
91
106
 
92
107
  if __name__ == "__main__":
93
- stock_hk_profit_forecast_et_df = stock_hk_profit_forecast_et(symbol="09999", indicator="评级总览")
108
+ stock_hk_profit_forecast_et_df = stock_hk_profit_forecast_et(
109
+ symbol="09999", indicator="评级总览"
110
+ )
94
111
  print(stock_hk_profit_forecast_et_df)
95
112
 
96
- stock_hk_profit_forecast_et_df = stock_hk_profit_forecast_et(symbol="09999", indicator="去年度业绩表现")
113
+ stock_hk_profit_forecast_et_df = stock_hk_profit_forecast_et(
114
+ symbol="09999", indicator="去年度业绩表现"
115
+ )
97
116
  print(stock_hk_profit_forecast_et_df)
98
117
 
99
- stock_hk_profit_forecast_et_df = stock_hk_profit_forecast_et(symbol="09999", indicator="综合盈利预测")
118
+ stock_hk_profit_forecast_et_df = stock_hk_profit_forecast_et(
119
+ symbol="09999", indicator="综合盈利预测"
120
+ )
100
121
  print(stock_hk_profit_forecast_et_df)
101
122
 
102
- stock_hk_profit_forecast_et_df = stock_hk_profit_forecast_et(symbol="09999", indicator="盈利预测概览")
123
+ stock_hk_profit_forecast_et_df = stock_hk_profit_forecast_et(
124
+ symbol="09999", indicator="盈利预测概览"
125
+ )
103
126
  print(stock_hk_profit_forecast_et_df)
@@ -1,13 +1,18 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2023/4/9 21:44
4
+ Date: 2025/3/1 15:00
5
5
  Desc: 同花顺-盈利预测
6
6
  https://basic.10jqka.com.cn/new/600519/worth.html
7
7
  """
8
+
9
+ from io import StringIO
10
+
8
11
  import pandas as pd
9
12
  import requests
10
13
 
14
+ from akshare.utils.cons import headers
15
+
11
16
 
12
17
  def stock_profit_forecast_ths(
13
18
  symbol: str = "600519", indicator: str = "预测年报每股收益"
@@ -23,42 +28,88 @@ def stock_profit_forecast_ths(
23
28
  :rtype: pandas.DataFrame
24
29
  """
25
30
  url = f"https://basic.10jqka.com.cn/new/{symbol}/worth.html"
26
- headers = {
27
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
28
- }
29
31
  r = requests.get(url, headers=headers)
30
32
  r.encoding = "gbk"
31
- if indicator == "预测年报每股收益":
32
- temp_df = pd.read_html(r.text)[0]
33
- temp_df["年度"] = temp_df["年度"].astype(str)
34
- return temp_df
35
- if indicator == "预测年报净利润":
36
- temp_df = pd.read_html(r.text)[1]
37
- temp_df["年度"] = temp_df["年度"].astype(str)
38
- return temp_df
39
- if indicator == "业绩预测详表-机构":
40
- temp_df = pd.read_html(r.text)[2]
41
- columns_list = []
42
- for item in temp_df.columns:
43
- columns_list.append(item[1])
44
- columns_list[2] = "预测年报每股收益" + columns_list[2]
45
- columns_list[3] = "预测年报每股收益" + columns_list[3]
46
- columns_list[4] = "预测年报每股收益" + columns_list[4]
47
- columns_list[5] = "预测年报净利润" + columns_list[5]
48
- columns_list[6] = "预测年报净利润" + columns_list[6]
49
- columns_list[7] = "预测年报净利润" + columns_list[7]
50
- temp_df.columns = columns_list
51
- temp_df["报告日期"] = pd.to_datetime(temp_df["报告日期"]).dt.date
52
- return temp_df
53
- if indicator == "业绩预测详表-详细指标预测":
54
- temp_df = pd.read_html(r.text)[3]
55
- temp_df.columns = [
56
- item.replace("(", "-").replace(")", "") for item in temp_df.columns
57
- ]
58
- return temp_df
33
+ if "本年度暂无机构做出业绩预测" in r.text:
34
+ # 处理 `本年度暂无机构做出业绩预测` 的情况
35
+ if indicator == "预测年报每股收益":
36
+ return pd.DataFrame()
37
+ elif indicator == "预测年报净利润":
38
+ return pd.DataFrame()
39
+ elif indicator == "业绩预测详表-机构":
40
+ temp_df = pd.read_html(StringIO(r.text))[0]
41
+ columns_list = []
42
+ for item in temp_df.columns:
43
+ columns_list.append(item[1])
44
+ columns_list[2] = "预测年报每股收益" + columns_list[2]
45
+ columns_list[3] = "预测年报每股收益" + columns_list[3]
46
+ columns_list[4] = "预测年报每股收益" + columns_list[4]
47
+ columns_list[5] = "预测年报净利润" + columns_list[5]
48
+ columns_list[6] = "预测年报净利润" + columns_list[6]
49
+ columns_list[7] = "预测年报净利润" + columns_list[7]
50
+ temp_df.columns = columns_list
51
+ temp_df["报告日期"] = pd.to_datetime(
52
+ temp_df["报告日期"], errors="coerce"
53
+ ).dt.date
54
+ return temp_df
55
+ elif indicator == "业绩预测详表-详细指标预测":
56
+ temp_df = pd.read_html(StringIO(r.text))[1]
57
+ temp_df.columns = [
58
+ item.replace("(", "-").replace(")", "") for item in temp_df.columns
59
+ ]
60
+ return temp_df
61
+ else:
62
+ return pd.DataFrame()
63
+ else:
64
+ if indicator == "预测年报每股收益":
65
+ temp_df = pd.read_html(StringIO(r.text))[0]
66
+ temp_df["年度"] = temp_df["年度"].astype(str)
67
+ return temp_df
68
+ elif indicator == "预测年报净利润":
69
+ temp_df = pd.read_html(StringIO(r.text))[1]
70
+ temp_df["年度"] = temp_df["年度"].astype(str)
71
+ return temp_df
72
+ elif indicator == "业绩预测详表-机构":
73
+ temp_df = pd.read_html(StringIO(r.text))[2]
74
+ columns_list = []
75
+ for item in temp_df.columns:
76
+ columns_list.append(item[1])
77
+ columns_list[2] = "预测年报每股收益" + columns_list[2]
78
+ columns_list[3] = "预测年报每股收益" + columns_list[3]
79
+ columns_list[4] = "预测年报每股收益" + columns_list[4]
80
+ columns_list[5] = "预测年报净利润" + columns_list[5]
81
+ columns_list[6] = "预测年报净利润" + columns_list[6]
82
+ columns_list[7] = "预测年报净利润" + columns_list[7]
83
+ temp_df.columns = columns_list
84
+ temp_df["报告日期"] = pd.to_datetime(temp_df["报告日期"]).dt.date
85
+ return temp_df
86
+ elif indicator == "业绩预测详表-详细指标预测":
87
+ temp_df = pd.read_html(StringIO(r.text))[3]
88
+ temp_df.columns = [
89
+ item.replace("(", "-").replace(")", "") for item in temp_df.columns
90
+ ]
91
+ return temp_df
92
+ else:
93
+ return pd.DataFrame()
59
94
 
60
95
 
61
96
  if __name__ == "__main__":
62
- for item in ["预测年报每股收益", "预测年报净利润", "业绩预测详表-机构", "业绩预测详表-详细指标预测"]:
63
- stock_profit_forecast_ths_df = stock_profit_forecast_ths(symbol="600519", indicator=item)
64
- print(stock_profit_forecast_ths_df)
97
+ stock_profit_forecast_ths_df = stock_profit_forecast_ths(
98
+ symbol="600519", indicator="预测年报每股收益"
99
+ )
100
+ print(stock_profit_forecast_ths_df)
101
+
102
+ stock_profit_forecast_ths_df = stock_profit_forecast_ths(
103
+ symbol="600519", indicator="预测年报净利润"
104
+ )
105
+ print(stock_profit_forecast_ths_df)
106
+
107
+ stock_profit_forecast_ths_df = stock_profit_forecast_ths(
108
+ symbol="600519", indicator="业绩预测详表-机构"
109
+ )
110
+ print(stock_profit_forecast_ths_df)
111
+
112
+ stock_profit_forecast_ths_df = stock_profit_forecast_ths(
113
+ symbol="600519", indicator="业绩预测详表-详细指标预测"
114
+ )
115
+ print(stock_profit_forecast_ths_df)
@@ -5,6 +5,7 @@ Date: 2022/1/7 13:40
5
5
  Desc: 新浪财经-机构推荐池
6
6
  http://stock.finance.sina.com.cn/stock/go.php/vIR_RatingNewest/index.phtml
7
7
  """
8
+
8
9
  import pandas as pd
9
10
  import requests
10
11
  from bs4 import BeautifulSoup
@@ -26,7 +27,10 @@ def stock_institute_recommend(symbol: str = "投资评级选股") -> pd.DataFram
26
27
  }
27
28
  r = requests.get(url, params=params)
28
29
  soup = BeautifulSoup(r.text, "lxml")
29
- indicator_map = {item.find("a").text: item.find("a")["href"] for item in soup.find(attrs={"id": "leftMenu"}).find_all("dd")[1].find_all("li")}
30
+ indicator_map = {
31
+ item.find("a").text: item.find("a")["href"]
32
+ for item in soup.find(attrs={"id": "leftMenu"}).find_all("dd")[1].find_all("li")
33
+ }
30
34
  url = indicator_map[symbol]
31
35
  params = {
32
36
  "num": "10000",
@@ -90,10 +94,22 @@ def stock_institute_recommend_detail(symbol: str = "000001") -> pd.DataFrame:
90
94
  return temp_df
91
95
 
92
96
 
93
- if __name__ == '__main__':
94
- for item in ['最新投资评级', '上调评级股票', '下调评级股票', '股票综合评级', '首次评级股票', '目标涨幅排名', '机构关注度', '行业关注度', '投资评级选股']:
97
+ if __name__ == "__main__":
98
+ for item in [
99
+ "最新投资评级",
100
+ "上调评级股票",
101
+ "下调评级股票",
102
+ "股票综合评级",
103
+ "首次评级股票",
104
+ "目标涨幅排名",
105
+ "机构关注度",
106
+ "行业关注度",
107
+ "投资评级选股",
108
+ ]:
95
109
  stock_institute_recommend_df = stock_institute_recommend(symbol=item)
96
110
  print(stock_institute_recommend_df)
97
111
 
98
- stock_institute_recommend_detail_df = stock_institute_recommend_detail(symbol="002709")
112
+ stock_institute_recommend_detail_df = stock_institute_recommend_detail(
113
+ symbol="002709"
114
+ )
99
115
  print(stock_institute_recommend_detail_df)
@@ -1,69 +1,13 @@
1
1
  # -*- coding:utf-8 -*-
2
2
  # !/usr/bin/env python
3
3
  """
4
- Date: 2023/11/27 16:30
4
+ Date: 2025/5/6 14:30
5
5
  Desc: 主营构成
6
6
  https://emweb.securities.eastmoney.com/PC_HSF10/BusinessAnalysis/Index?type=web&code=SH688041#
7
- http://f10.emoney.cn/f10/zbyz/1000001
8
7
  """
9
- from io import StringIO
10
8
 
11
9
  import pandas as pd
12
10
  import requests
13
- from bs4 import BeautifulSoup
14
-
15
-
16
- def stock_zygc_ym(symbol: str = "000001") -> pd.DataFrame:
17
- """
18
- 益盟-F10-主营构成
19
- http://f10.emoney.cn/f10/zbyz/1000001
20
- :param symbol: 股票代码
21
- :type symbol: str
22
- :return: 主营构成
23
- :rtype: pandas.DataFrame
24
- """
25
- url = f"http://f10.emoney.cn/f10/zygc/{symbol}"
26
- r = requests.get(url)
27
- soup = BeautifulSoup(r.text, "lxml")
28
- year_list = [
29
- item.text.strip()
30
- for item in soup.find(attrs={"class": "swlab_t"}).find_all("li")
31
- ]
32
-
33
- big_df = pd.DataFrame()
34
- for i, item in enumerate(year_list, 2):
35
- temp_df = pd.read_html(StringIO(r.text), header=0)[i]
36
- temp_df.columns = [
37
- "分类方向",
38
- "分类",
39
- "营业收入",
40
- "营业收入-同比增长",
41
- "营业收入-占主营收入比",
42
- "营业成本",
43
- "营业成本-同比增长",
44
- "营业成本-占主营成本比",
45
- "毛利率",
46
- "毛利率-同比增长",
47
- ]
48
- temp_df["报告期"] = item
49
- big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
50
-
51
- big_df = big_df[
52
- [
53
- "报告期",
54
- "分类方向",
55
- "分类",
56
- "营业收入",
57
- "营业收入-同比增长",
58
- "营业收入-占主营收入比",
59
- "营业成本",
60
- "营业成本-同比增长",
61
- "营业成本-占主营成本比",
62
- "毛利率",
63
- "毛利率-同比增长",
64
- ]
65
- ]
66
- return big_df
67
11
 
68
12
 
69
13
  def stock_zygc_em(symbol: str = "SH688041") -> pd.DataFrame:
@@ -113,8 +57,10 @@ def stock_zygc_em(symbol: str = "SH688041") -> pd.DataFrame:
113
57
  "毛利率",
114
58
  ]
115
59
  ]
116
- temp_df["报告日期"] = pd.to_datetime(temp_df["报告日期"]).dt.date
117
- temp_df["分类类型"] = temp_df["分类类型"].map({"2": "按产品分类", "3": "按地区分类"})
60
+ temp_df["报告日期"] = pd.to_datetime(temp_df["报告日期"], errors="coerce").dt.date
61
+ temp_df["分类类型"] = temp_df["分类类型"].map(
62
+ {"2": "按产品分类", "3": "按地区分类"}
63
+ )
118
64
  temp_df["主营收入"] = pd.to_numeric(temp_df["主营收入"], errors="coerce")
119
65
  temp_df["收入比例"] = pd.to_numeric(temp_df["收入比例"], errors="coerce")
120
66
  temp_df["主营成本"] = pd.to_numeric(temp_df["主营成本"], errors="coerce")
@@ -126,8 +72,5 @@ def stock_zygc_em(symbol: str = "SH688041") -> pd.DataFrame:
126
72
 
127
73
 
128
74
  if __name__ == "__main__":
129
- stock_zygc_ym_df = stock_zygc_ym(symbol="000001")
130
- print(stock_zygc_ym_df)
131
-
132
75
  stock_zygc_em_df = stock_zygc_em(symbol="SH688041")
133
76
  print(stock_zygc_em_df)
@@ -0,0 +1,43 @@
1
+ class AkshareConfig:
2
+ _instance = None
3
+
4
+ def __new__(cls):
5
+ if cls._instance is None:
6
+ cls._instance = super().__new__(cls)
7
+ cls._instance.proxies = None
8
+ return cls._instance
9
+
10
+ @classmethod
11
+ def set_proxies(cls, proxies):
12
+ cls().proxies = proxies
13
+
14
+ @classmethod
15
+ def get_proxies(cls):
16
+ return cls().proxies
17
+
18
+
19
+ config = AkshareConfig()
20
+
21
+
22
+ # 导出 set_proxies 函数
23
+ def set_proxies(proxies):
24
+ config.set_proxies(proxies)
25
+
26
+
27
+ def get_proxies():
28
+ return config.get_proxies()
29
+
30
+
31
+ class ProxyContext:
32
+ def __init__(self, proxies):
33
+ self.proxies = proxies
34
+ self.old_proxies = None
35
+
36
+ def __enter__(self):
37
+ self.old_proxies = config.get_proxies()
38
+ config.set_proxies(self.proxies)
39
+ return self
40
+
41
+ def __exit__(self, exc_type, exc_val, exc_tb):
42
+ config.set_proxies(self.old_proxies)
43
+ return False # 不处理异常