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