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
@@ -1,19 +1,23 @@
1
1
  # -*- coding:utf-8 -*-
2
2
  # !/usr/bin/env python
3
3
  """
4
- Date: 2022/5/13 19:25
4
+ Date: 2024/6/13 13:00
5
5
  Desc: 东方财富网-数据中心-公告大全-沪深 A 股公告
6
- http://data.eastmoney.com/notices/hsa/5.html
6
+ https://data.eastmoney.com/notices/hsa/5.html
7
7
  """
8
+
9
+ import math
10
+
8
11
  import pandas as pd
9
12
  import requests
10
- from tqdm import tqdm
13
+
14
+ from akshare.utils.tqdm import get_tqdm
11
15
 
12
16
 
13
17
  def stock_notice_report(symbol: str = "全部", date: str = "20220511") -> pd.DataFrame:
14
18
  """
15
19
  东方财富网-数据中心-公告大全-沪深京 A 股公告
16
- http://data.eastmoney.com/notices/hsa/5.html
20
+ https://data.eastmoney.com/notices/hsa/5.html
17
21
  :param symbol: 报告类型; choice of {"全部", "重大事项", "财务报告", "融资公告", "风险提示", "资产重组", "信息变更", "持股变动"}
18
22
  :type symbol: str
19
23
  :param date: 制定日期
@@ -21,7 +25,7 @@ def stock_notice_report(symbol: str = "全部", date: str = "20220511") -> pd.Da
21
25
  :return: 沪深京 A 股公告
22
26
  :rtype: pandas.DataFrame
23
27
  """
24
- url = "http://np-anotice-stock.eastmoney.com/api/security/ann"
28
+ url = "https://np-anotice-stock.eastmoney.com/api/security/ann"
25
29
  report_map = {
26
30
  "全部": "0",
27
31
  "财务报告": "1",
@@ -45,11 +49,9 @@ def stock_notice_report(symbol: str = "全部", date: str = "20220511") -> pd.Da
45
49
  }
46
50
  r = requests.get(url, params=params)
47
51
  data_json = r.json()
48
- import math
49
-
50
52
  total_page = math.ceil(data_json["data"]["total_hits"] / 100)
51
-
52
53
  big_df = pd.DataFrame()
54
+ tqdm = get_tqdm()
53
55
  for page in tqdm(range(1, int(total_page) + 1), leave=False):
54
56
  params.update(
55
57
  {
@@ -59,23 +61,32 @@ def stock_notice_report(symbol: str = "全部", date: str = "20220511") -> pd.Da
59
61
  r = requests.get(url, params=params)
60
62
  data_json = r.json()
61
63
  temp_df = pd.DataFrame(data_json["data"]["list"])
62
- temp_codes_df = pd.DataFrame(
63
- [item["codes"][0] for item in data_json["data"]["list"]]
64
- )
64
+
65
+ temp_code_list = []
66
+ for item in data_json["data"]["list"]:
67
+ if len(item["codes"]) == 1:
68
+ temp_code_list.append(item["codes"][0])
69
+ else:
70
+ for code in item["codes"]:
71
+ if code["ann_type"].startswith("A"):
72
+ temp_code_list.append(code)
73
+ break
74
+ temp_codes_df = pd.DataFrame(temp_code_list)
75
+
65
76
  try:
66
77
  temp_columns_df = pd.DataFrame(
67
78
  [item["columns"][0] for item in data_json["data"]["list"]]
68
79
  )
69
- except:
80
+ except: # noqa: E722
70
81
  continue
71
82
  del temp_df["codes"]
72
83
  del temp_df["columns"]
73
- temp_df = pd.concat([temp_df, temp_columns_df, temp_codes_df], axis=1)
74
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
84
+ temp_df = pd.concat(objs=[temp_df, temp_columns_df, temp_codes_df], axis=1)
85
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
75
86
 
76
87
  big_df.rename(
77
88
  columns={
78
- "art_code": "_",
89
+ "art_code": "编码",
79
90
  "display_time": "-",
80
91
  "eiTime": "-",
81
92
  "notice_date": "公告日期",
@@ -90,6 +101,8 @@ def stock_notice_report(symbol: str = "全部", date: str = "20220511") -> pd.Da
90
101
  },
91
102
  inplace=True,
92
103
  )
104
+ url = "https://data.eastmoney.com/notices/detail/"
105
+ big_df["网址"] = url + big_df["代码"] + "/" + big_df["编码"] + ".html"
93
106
  big_df = big_df[
94
107
  [
95
108
  "代码",
@@ -97,17 +110,27 @@ def stock_notice_report(symbol: str = "全部", date: str = "20220511") -> pd.Da
97
110
  "公告标题",
98
111
  "公告类型",
99
112
  "公告日期",
113
+ "网址",
100
114
  ]
101
115
  ]
102
- big_df["公告日期"] = pd.to_datetime(big_df["公告日期"]).dt.date
116
+ big_df["公告日期"] = pd.to_datetime(big_df["公告日期"], errors="coerce").dt.date
103
117
  return big_df
104
118
 
105
119
 
106
120
  if __name__ == "__main__":
107
- stock_notice_report_df = stock_notice_report(symbol='财务报告', date="20220511")
121
+ stock_notice_report_df = stock_notice_report(symbol="财务报告", date="20240612")
108
122
  print(stock_notice_report_df)
109
123
 
110
- item_list = ["全部", "财务报告", "融资公告", "风险提示", "信息变更", "重大事项", "资产重组", "持股变动"]
124
+ item_list = [
125
+ "全部",
126
+ "财务报告",
127
+ "融资公告",
128
+ "风险提示",
129
+ "信息变更",
130
+ "重大事项",
131
+ "资产重组",
132
+ "持股变动",
133
+ ]
111
134
  for temp_item in item_list:
112
135
  stock_notice_report_df = stock_notice_report(symbol=temp_item, date="20220511")
113
136
  print(stock_notice_report_df)
@@ -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)