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,206 +1,19 @@
1
1
  # -*- coding:utf-8 -*-
2
2
  # !/usr/bin/env python
3
3
  """
4
- Date: 2023/7/6 17:00
4
+ Date: 2024/12/23 17:00
5
5
  Desc: 中证指数-所有指数-历史行情数据
6
6
  https://www.csindex.com.cn/zh-CN/indices/index-detail/H30374#/indices/family/list?index_series=1
7
7
  """
8
- import hashlib
9
- import time
10
- from functools import lru_cache
11
8
 
12
9
  import pandas as pd
13
10
  import requests
14
11
 
15
12
 
16
- def __get_current_timestamp_ms() -> int:
17
- """
18
- 生成时间戳
19
- :return: 时间戳
20
- :rtype: int
21
- """
22
- timestamp_seconds = time.time()
23
- timestamp_ms = int(timestamp_seconds * 1000)
24
- return timestamp_ms
25
-
26
-
27
- def __md5_hash(input_string) -> str:
28
- """
29
- 生成 md5 加密后的值
30
- :return: 生成 md5 加密后的值
31
- :rtype: str
32
- """
33
- md5 = hashlib.md5()
34
- md5.update(input_string.encode("utf-8"))
35
- return md5.hexdigest()
36
-
37
-
38
- def __create_encode(
39
- act_time="1688635494326",
40
- authtoken="",
41
- gu_code="399808.SZ",
42
- pe_category="pb",
43
- type="pc",
44
- ver="new",
45
- version="2.2.7",
46
- year=-1,
47
- ) -> dict:
48
- """
49
- 生成 post 密文,需要 JS 观察如下文件:
50
- https://funddb.cn/static/js/app.1c429c670c72542fb4fd.js
51
- :return: 生成 post 密文
52
- :rtype: str
53
- """
54
- input_string = f"{act_time}{authtoken}{gu_code}{pe_category}{type}{ver}{version}{year}EWf45rlv#kfsr@k#gfksgkr"
55
- hash_value = __md5_hash(input_string)
56
- l = hash_value
57
- c = l[29:31]
58
- d = l[2:4]
59
- f = l[5:6]
60
- h = l[26:27]
61
- m = l[6:8]
62
- v = l[1:2]
63
- y = l[0:2]
64
- k = l[6:8]
65
- w = l[8:9]
66
- x = l[30:31]
67
- P = l[11:14]
68
- z = l[11:12]
69
- j = l[2:5]
70
- q = l[9:11]
71
- H = l[23:25]
72
- O = l[31:32]
73
- C = l[25:27]
74
- E = l[9:11]
75
- A = l[27:29]
76
- T = l[17:19]
77
- F = l[26:27]
78
- U = l[12:14]
79
- S = l[25:26]
80
- R = l[16:19]
81
- K = l[17:21]
82
- I = l[18:19]
83
- D = l[21:23]
84
- _ = l[
85
- 14:16
86
- ] # $ is not a valid variable name in Python, so I replaced it with an underscore
87
- B = l[29:32]
88
- N = l[21:23]
89
- V = l[24:26]
90
- Y = l[16:17]
91
-
92
- def b(
93
- t,
94
- e,
95
- n,
96
- i,
97
- a,
98
- r,
99
- o,
100
- l,
101
- u,
102
- c,
103
- s,
104
- d,
105
- _,
106
- f,
107
- h,
108
- p,
109
- m,
110
- g,
111
- v,
112
- y,
113
- b,
114
- k,
115
- w,
116
- x,
117
- P,
118
- z,
119
- j,
120
- q,
121
- H,
122
- O,
123
- C,
124
- E,
125
- A,
126
- ):
127
- t["data"]["tirgkjfs"] = f
128
- t["data"]["abiokytke"] = _
129
- t["data"]["u54rg5d"] = e
130
- t["data"]["kf54ge7"] = q
131
- t["data"]["tiklsktr4"] = d
132
- t["data"]["lksytkjh"] = z
133
- t["data"]["sbnoywr"] = j
134
- t["data"]["bgd7h8tyu54"] = w
135
- t["data"]["y654b5fs3tr"] = C
136
- t["data"]["bioduytlw"] = n
137
- t["data"]["bd4uy742"] = P
138
- t["data"]["h67456y"] = o
139
- t["data"]["bvytikwqjk"] = s
140
- t["data"]["ngd4uy551"] = b
141
- t["data"]["bgiuytkw"] = v
142
- t["data"]["nd354uy4752"] = g
143
- t["data"]["ghtoiutkmlg"] = x
144
- t["data"]["bd24y6421f"] = i
145
- t["data"]["tbvdiuytk"] = l
146
- t["data"]["ibvytiqjek"] = p
147
- t["data"]["jnhf8u5231"] = A
148
- t["data"]["fjlkatj"] = E
149
- t["data"]["hy5641d321t"] = H
150
- t["data"]["iogojti"] = r
151
- t["data"]["ngd4yut78"] = a
152
- t["data"]["nkjhrew"] = c
153
- t["data"]["yt447e13f"] = O
154
- t["data"]["n3bf4uj7y7"] = k
155
- t["data"]["nbf4uj7y432"] = h
156
- t["data"]["yi854tew"] = u
157
- t["data"]["h13ey474"] = m
158
- t["data"]["quikgdky"] = y
159
-
160
- t = {"data": {}}
161
-
162
- b(
163
- t,
164
- d,
165
- f,
166
- V,
167
- U,
168
- S,
169
- R,
170
- Y,
171
- c,
172
- h,
173
- m,
174
- v,
175
- N,
176
- y,
177
- D,
178
- _,
179
- B,
180
- x,
181
- E,
182
- A,
183
- T,
184
- I,
185
- k,
186
- P,
187
- F,
188
- K,
189
- H,
190
- O,
191
- C,
192
- w,
193
- z,
194
- j,
195
- q,
196
- )
197
- return t["data"]
198
-
199
-
200
13
  def stock_zh_index_hist_csindex(
201
14
  symbol: str = "000928",
202
15
  start_date: str = "20180526",
203
- end_date: str = "20230525",
16
+ end_date: str = "20240604",
204
17
  ) -> pd.DataFrame:
205
18
  """
206
19
  中证指数-具体指数-历史行情数据
@@ -242,7 +55,7 @@ def stock_zh_index_hist_csindex(
242
55
  "样本数量",
243
56
  "滚动市盈率",
244
57
  ]
245
- temp_df["日期"] = pd.to_datetime(temp_df["日期"]).dt.date
58
+ temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
246
59
  temp_df["开盘"] = pd.to_numeric(temp_df["开盘"], errors="coerce")
247
60
  temp_df["最高"] = pd.to_numeric(temp_df["最高"], errors="coerce")
248
61
  temp_df["最低"] = pd.to_numeric(temp_df["最低"], errors="coerce")
@@ -265,7 +78,10 @@ def stock_zh_index_value_csindex(symbol: str = "H30374") -> pd.DataFrame:
265
78
  :return: 指数估值数据
266
79
  :rtype: pandas.DataFrame
267
80
  """
268
- url = f"https://csi-web-dev.oss-cn-shanghai-finance-1-pub.aliyuncs.com/static/html/csindex/public/uploads/file/autofile/indicator/{symbol}indicator.xls"
81
+ url = (
82
+ f"https://oss-ch.csindex.com.cn/static/"
83
+ f"html/csindex/public/uploads/file/autofile/indicator/{symbol}indicator.xls"
84
+ )
269
85
  temp_df = pd.read_excel(url)
270
86
  temp_df.columns = [
271
87
  "日期",
@@ -279,191 +95,21 @@ def stock_zh_index_value_csindex(symbol: str = "H30374") -> pd.DataFrame:
279
95
  "股息率1",
280
96
  "股息率2",
281
97
  ]
282
- temp_df["日期"] = pd.to_datetime(temp_df["日期"], format="%Y%m%d").dt.date
283
- temp_df["市盈率1"] = pd.to_numeric(temp_df["市盈率1"])
284
- temp_df["市盈率2"] = pd.to_numeric(temp_df["市盈率2"])
285
- temp_df["股息率1"] = pd.to_numeric(temp_df["股息率1"])
286
- temp_df["股息率2"] = pd.to_numeric(temp_df["股息率2"])
287
- return temp_df
288
-
289
-
290
- @lru_cache()
291
- def index_value_name_funddb() -> pd.DataFrame:
292
- """
293
- funddb-指数估值-指数代码
294
- https://funddb.cn/site/index
295
- :return: pandas.DataFrame
296
- :rtype: 指数代码
297
- """
298
- url = "https://api.jiucaishuo.com/v2/guzhi/showcategory"
299
- get_current_timestamp_ms_str = __get_current_timestamp_ms()
300
- encode_params = __create_encode(
301
- act_time=str(get_current_timestamp_ms_str),
302
- authtoken="",
303
- gu_code="",
304
- pe_category="",
305
- type="pc",
306
- ver="",
307
- version="2.2.7",
308
- year="",
309
- )
310
- payload = {
311
- "type": "pc",
312
- "version": "2.2.7",
313
- "authtoken": "",
314
- "act_time": str(get_current_timestamp_ms_str)
315
- }
316
- payload.update(encode_params)
317
- r = requests.post(url, json=payload)
318
- data_json = r.json()
319
- temp_df = pd.DataFrame(data_json["data"]["right_list"])
320
- temp_df.columns = [
321
- "指数开始时间",
322
- "-",
323
- "指数名称",
324
- "指数代码",
325
- "最新PE",
326
- "最新PB",
327
- "PE分位",
328
- "PB分位",
329
- "股息率",
330
- "-",
331
- "-",
332
- "-",
333
- "更新时间",
334
- "股息率分位",
335
- "-",
336
- "-",
337
- "-",
338
- "-",
339
- "-",
340
- "-",
341
- "-",
342
- "-",
343
- "-",
344
- "-",
345
- "-",
346
- "-",
347
- "-",
348
- "-",
349
- "-",
350
- "-",
351
- ]
352
- temp_df = temp_df[
353
- [
354
- "指数名称",
355
- "最新PE",
356
- "PE分位",
357
- "最新PB",
358
- "PB分位",
359
- "股息率",
360
- "股息率分位",
361
- "指数代码",
362
- "指数开始时间",
363
- "更新时间",
364
- ]
365
- ]
366
- temp_df["指数开始时间"] = pd.to_datetime(temp_df["指数开始时间"]).dt.date
367
- temp_df["最新PE"] = pd.to_numeric(temp_df["最新PE"], errors="coerce")
368
- temp_df["PE分位"] = pd.to_numeric(temp_df["PE分位"], errors="coerce")
369
- temp_df["最新PB"] = pd.to_numeric(temp_df["最新PB"], errors="coerce")
370
- temp_df["PB分位"] = pd.to_numeric(temp_df["PB分位"], errors="coerce")
371
- temp_df["股息率"] = pd.to_numeric(temp_df["股息率"], errors="coerce")
372
- temp_df["股息率分位"] = pd.to_numeric(temp_df["股息率分位"], errors="coerce")
98
+ temp_df["日期"] = pd.to_datetime(
99
+ temp_df["日期"], format="%Y%m%d", errors="coerce"
100
+ ).dt.date
101
+ temp_df["市盈率1"] = pd.to_numeric(temp_df["市盈率1"], errors="coerce")
102
+ temp_df["市盈率2"] = pd.to_numeric(temp_df["市盈率2"], errors="coerce")
103
+ temp_df["股息率1"] = pd.to_numeric(temp_df["股息率1"], errors="coerce")
104
+ temp_df["股息率2"] = pd.to_numeric(temp_df["股息率2"], errors="coerce")
373
105
  return temp_df
374
106
 
375
107
 
376
- def index_value_hist_funddb(
377
- symbol: str = "大盘成长", indicator: str = "市盈率"
378
- ) -> pd.DataFrame:
379
- """
380
- funddb-指数估值-估值信息
381
- https://funddb.cn/site/index
382
- :param symbol: 指数名称; 通过调用 ak.index_value_name_funddb() 来获取
383
- :type symbol: str
384
- :param indicator: choice of {'市盈率', '市净率', '股息率', '风险溢价'}
385
- :type indicator: str
386
- :return: 估值信息
387
- :rtype: pandas.DataFrame
388
- """
389
- indicator_map = {
390
- "市盈率": "pe",
391
- "市净率": "pb",
392
- "股息率": "xilv",
393
- "风险溢价": "fed",
394
- }
395
- index_value_name_funddb_df = index_value_name_funddb()
396
- name_code_map = dict(
397
- zip(
398
- index_value_name_funddb_df["指数名称"],
399
- index_value_name_funddb_df["指数代码"],
400
- )
401
- )
402
- url = "https://api.jiucaishuo.com/v2/guzhi/newtubiaolinedata"
403
- get_current_timestamp_ms_str = __get_current_timestamp_ms()
404
- encode_params = __create_encode(
405
- act_time=str(get_current_timestamp_ms_str),
406
- authtoken="",
407
- gu_code=name_code_map[symbol],
408
- pe_category=indicator_map[indicator],
409
- type="pc",
410
- ver="new",
411
- version="2.2.7",
412
- year=-1,
413
- )
414
- payload = {
415
- "gu_code": name_code_map[symbol],
416
- "pe_category": indicator_map[indicator],
417
- "year": -1,
418
- "ver": "new",
419
- "type": "pc",
420
- "version": "2.2.7",
421
- "authtoken": "",
422
- "act_time": str(get_current_timestamp_ms_str)
423
- }
424
- payload.update(encode_params)
425
- r = requests.post(url, json=payload)
426
- data_json = r.json()
427
- big_df = pd.DataFrame()
428
- temp_df = pd.DataFrame(
429
- data_json["data"]["tubiao"]["series"][0]["data"],
430
- columns=["timestamp", "value"],
431
- )
432
- big_df["日期"] = (
433
- pd.to_datetime(temp_df["timestamp"], unit="ms", utc=True)
434
- .dt.tz_convert("Asia/Shanghai")
435
- .dt.date
436
- )
437
- big_df["平均值"] = pd.to_numeric(temp_df["value"])
438
- big_df[indicator] = pd.to_numeric(
439
- [item[1] for item in data_json["data"]["tubiao"]["series"][1]["data"]]
440
- )
441
- big_df["最低30"] = pd.to_numeric(
442
- [item[1] for item in data_json["data"]["tubiao"]["series"][2]["data"]]
443
- )
444
- big_df["最低10"] = pd.to_numeric(
445
- [item[1] for item in data_json["data"]["tubiao"]["series"][3]["data"]]
446
- )
447
- big_df["最高30"] = pd.to_numeric(
448
- [item[1] for item in data_json["data"]["tubiao"]["series"][4]["data"]]
449
- )
450
- big_df["最高10"] = pd.to_numeric(
451
- [item[1] for item in data_json["data"]["tubiao"]["series"][5]["data"]]
452
- )
453
- return big_df
454
-
455
-
456
108
  if __name__ == "__main__":
457
109
  stock_zh_index_hist_csindex_df = stock_zh_index_hist_csindex(
458
- symbol="H30374", start_date="20100101", end_date="20230525"
110
+ symbol="000928", start_date="20100101", end_date="20240604"
459
111
  )
460
112
  print(stock_zh_index_hist_csindex_df)
461
113
 
462
114
  stock_zh_index_value_csindex_df = stock_zh_index_value_csindex(symbol="H30374")
463
115
  print(stock_zh_index_value_csindex_df)
464
-
465
- index_value_name_funddb_df = index_value_name_funddb()
466
- print(index_value_name_funddb_df)
467
-
468
- index_value_hist_funddb_df = index_value_hist_funddb(symbol="大盘成长", indicator="市盈率")
469
- print(index_value_hist_funddb_df)
@@ -5,6 +5,7 @@ Date: 2023/6/19 17:00
5
5
  Desc: 沐甜科技数据中心-中国食糖指数
6
6
  https://www.msweet.com.cn/mtkj/sjzx13/index.html
7
7
  """
8
+
8
9
  import requests
9
10
  import pandas as pd
10
11
 
@@ -93,12 +94,25 @@ def index_outer_quote_sugar_msweet() -> pd.DataFrame:
93
94
  temp_df = pd.concat(
94
95
  [pd.DataFrame(data_json["category"]), pd.DataFrame(data_json["data"])], axis=1
95
96
  )
96
- temp_df.columns = ["日期", "巴西糖进口成本", "泰国糖进口利润空间", "巴西糖进口利润空间", "泰国糖进口成本", "日照现货价"]
97
+ temp_df.columns = [
98
+ "日期",
99
+ "巴西糖进口成本",
100
+ "泰国糖进口利润空间",
101
+ "巴西糖进口利润空间",
102
+ "泰国糖进口成本",
103
+ "日照现货价",
104
+ ]
97
105
  temp_df["日期"] = temp_df["日期"].str.replace("/", "-")
98
106
  temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
99
- temp_df["巴西糖进口成本"] = pd.to_numeric(temp_df["巴西糖进口成本"], errors="coerce")
100
- temp_df["泰国糖进口利润空间"] = pd.to_numeric(temp_df["泰国糖进口利润空间"], errors="coerce")
101
- temp_df["巴西糖进口利润空间"] = pd.to_numeric(temp_df["巴西糖进口利润空间"], errors="coerce")
107
+ temp_df["巴西糖进口成本"] = pd.to_numeric(
108
+ temp_df["巴西糖进口成本"], errors="coerce"
109
+ )
110
+ temp_df["泰国糖进口利润空间"] = pd.to_numeric(
111
+ temp_df["泰国糖进口利润空间"], errors="coerce"
112
+ )
113
+ temp_df["巴西糖进口利润空间"] = pd.to_numeric(
114
+ temp_df["巴西糖进口利润空间"], errors="coerce"
115
+ )
102
116
  temp_df["泰国糖进口成本"] = pd.to_numeric(temp_df["泰国糖进口成本"])
103
117
  temp_df["日照现货价"] = pd.to_numeric(temp_df["日照现货价"], errors="coerce")
104
118
  return temp_df
akshare/index/index_sw.py CHANGED
@@ -6,10 +6,15 @@ Desc: 申万宏源研究-申万指数-指数发布
6
6
  乐咕乐股网
7
7
  https://legulegu.com/stockdata/index-composition?industryCode=851921.SI
8
8
  """
9
+
10
+ from io import StringIO
11
+
9
12
  import pandas as pd
10
13
  import requests
11
14
  from bs4 import BeautifulSoup
12
15
 
16
+ from akshare.utils.cons import headers
17
+
13
18
 
14
19
  def sw_index_first_info() -> pd.DataFrame:
15
20
  """
@@ -19,16 +24,16 @@ def sw_index_first_info() -> pd.DataFrame:
19
24
  :rtype: pandas.DataFrame
20
25
  """
21
26
  url = "https://legulegu.com/stockdata/sw-industry-overview"
22
- r = requests.get(url)
23
- soup = BeautifulSoup(r.text, "lxml")
24
- code_raw = soup.find("div", attrs={"id": "level1Items"}).find_all(
25
- "div", attrs={"class": "lg-industries-item-chinese-title"}
27
+ r = requests.get(url, headers=headers)
28
+ soup = BeautifulSoup(r.text, features="lxml")
29
+ code_raw = soup.find(name="div", attrs={"id": "level1Items"}).find_all(
30
+ name="div", attrs={"class": "lg-industries-item-chinese-title"}
26
31
  )
27
- name_raw = soup.find("div", attrs={"id": "level1Items"}).find_all(
28
- "div", attrs={"class": "lg-industries-item-number"}
32
+ name_raw = soup.find(name="div", attrs={"id": "level1Items"}).find_all(
33
+ name="div", attrs={"class": "lg-industries-item-number"}
29
34
  )
30
- value_raw = soup.find("div", attrs={"id": "level1Items"}).find_all(
31
- "div", attrs={"class": "lg-sw-industries-item-value"}
35
+ value_raw = soup.find(name="div", attrs={"id": "level1Items"}).find_all(
36
+ name="div", attrs={"class": "lg-sw-industries-item-value"}
32
37
  )
33
38
  code = [item.get_text() for item in code_raw]
34
39
  name = [item.get_text().split("(")[0] for item in name_raw]
@@ -61,7 +66,9 @@ def sw_index_first_info() -> pd.DataFrame:
61
66
  ]
62
67
  temp_df["成份个数"] = pd.to_numeric(temp_df["成份个数"], errors="coerce")
63
68
  temp_df["静态市盈率"] = pd.to_numeric(temp_df["静态市盈率"], errors="coerce")
64
- temp_df["TTM(滚动)市盈率"] = pd.to_numeric(temp_df["TTM(滚动)市盈率"], errors="coerce")
69
+ temp_df["TTM(滚动)市盈率"] = pd.to_numeric(
70
+ temp_df["TTM(滚动)市盈率"], errors="coerce"
71
+ )
65
72
  temp_df["市净率"] = pd.to_numeric(temp_df["市净率"], errors="coerce")
66
73
  temp_df["静态股息率"] = pd.to_numeric(temp_df["静态股息率"], errors="coerce")
67
74
  return temp_df
@@ -75,19 +82,22 @@ def sw_index_second_info() -> pd.DataFrame:
75
82
  :rtype: pandas.DataFrame
76
83
  """
77
84
  url = "https://legulegu.com/stockdata/sw-industry-overview"
78
- r = requests.get(url)
79
- soup = BeautifulSoup(r.text, "lxml")
80
- code_raw = soup.find("div", attrs={"id": "level2Items"}).find_all(
81
- "div", attrs={"class": "lg-industries-item-chinese-title"}
85
+ r = requests.get(url, headers=headers)
86
+ soup = BeautifulSoup(r.text, features="lxml")
87
+ code_raw = soup.find(name="div", attrs={"id": "level2Items"}).find_all(
88
+ name="div", attrs={"class": "lg-industries-item-chinese-title"}
82
89
  )
83
- name_raw = soup.find("div", attrs={"id": "level2Items"}).find_all(
84
- "div", attrs={"class": "lg-industries-item-number"}
90
+ name_raw = soup.find(name="div", attrs={"id": "level2Items"}).find_all(
91
+ name="div", attrs={"class": "lg-industries-item-number"}
85
92
  )
86
- value_raw = soup.find("div", attrs={"id": "level2Items"}).find_all(
87
- "div", attrs={"class": "lg-sw-industries-item-value"}
93
+ value_raw = soup.find(name="div", attrs={"id": "level2Items"}).find_all(
94
+ name="div", attrs={"class": "lg-sw-industries-item-value"}
88
95
  )
89
96
  code = [item.get_text() for item in code_raw]
90
97
  name = [item.get_text().split("(")[0] for item in name_raw]
98
+ parent_name = [
99
+ item.find("span").get_text().split("(")[0][1:-1] for item in name_raw
100
+ ]
91
101
  num = [item.get_text().split("(")[1].split(")")[0] for item in name_raw]
92
102
  num_1 = [
93
103
  item.find_all("span", attrs={"class": "value"})[0].get_text().strip()
@@ -105,10 +115,11 @@ def sw_index_second_info() -> pd.DataFrame:
105
115
  item.find_all("span", attrs={"class": "value"})[3].get_text().strip()
106
116
  for item in value_raw
107
117
  ]
108
- temp_df = pd.DataFrame([code, name, num, num_1, num_2, num_3, num_4]).T
118
+ temp_df = pd.DataFrame([code, name, parent_name, num, num_1, num_2, num_3, num_4]).T
109
119
  temp_df.columns = [
110
120
  "行业代码",
111
121
  "行业名称",
122
+ "上级行业",
112
123
  "成份个数",
113
124
  "静态市盈率",
114
125
  "TTM(滚动)市盈率",
@@ -117,7 +128,9 @@ def sw_index_second_info() -> pd.DataFrame:
117
128
  ]
118
129
  temp_df["成份个数"] = pd.to_numeric(temp_df["成份个数"], errors="coerce")
119
130
  temp_df["静态市盈率"] = pd.to_numeric(temp_df["静态市盈率"], errors="coerce")
120
- temp_df["TTM(滚动)市盈率"] = pd.to_numeric(temp_df["TTM(滚动)市盈率"], errors="coerce")
131
+ temp_df["TTM(滚动)市盈率"] = pd.to_numeric(
132
+ temp_df["TTM(滚动)市盈率"], errors="coerce"
133
+ )
121
134
  temp_df["市净率"] = pd.to_numeric(temp_df["市净率"], errors="coerce")
122
135
  temp_df["静态股息率"] = pd.to_numeric(temp_df["静态股息率"], errors="coerce")
123
136
  return temp_df
@@ -131,19 +144,22 @@ def sw_index_third_info() -> pd.DataFrame:
131
144
  :rtype: pandas.DataFrame
132
145
  """
133
146
  url = "https://legulegu.com/stockdata/sw-industry-overview"
134
- r = requests.get(url)
135
- soup = BeautifulSoup(r.text, "lxml")
136
- code_raw = soup.find("div", attrs={"id": "level3Items"}).find_all(
137
- "div", attrs={"class": "lg-industries-item-chinese-title"}
147
+ r = requests.get(url, headers=headers)
148
+ soup = BeautifulSoup(r.text, features="lxml")
149
+ code_raw = soup.find(name="div", attrs={"id": "level3Items"}).find_all(
150
+ name="div", attrs={"class": "lg-industries-item-chinese-title"}
138
151
  )
139
- name_raw = soup.find("div", attrs={"id": "level3Items"}).find_all(
140
- "div", attrs={"class": "lg-industries-item-number"}
152
+ name_raw = soup.find(name="div", attrs={"id": "level3Items"}).find_all(
153
+ name="div", attrs={"class": "lg-industries-item-number"}
141
154
  )
142
- value_raw = soup.find("div", attrs={"id": "level3Items"}).find_all(
143
- "div", attrs={"class": "lg-sw-industries-item-value"}
155
+ value_raw = soup.find(name="div", attrs={"id": "level3Items"}).find_all(
156
+ name="div", attrs={"class": "lg-sw-industries-item-value"}
144
157
  )
145
158
  code = [item.get_text() for item in code_raw]
146
159
  name = [item.get_text().split("(")[0] for item in name_raw]
160
+ parent_name = [
161
+ item.find("span").get_text().split("(")[0][1:-1] for item in name_raw
162
+ ]
147
163
  num = [item.get_text().split("(")[1].split(")")[0] for item in name_raw]
148
164
  num_1 = [
149
165
  item.find_all("span", attrs={"class": "value"})[0].get_text().strip()
@@ -161,10 +177,11 @@ def sw_index_third_info() -> pd.DataFrame:
161
177
  item.find_all("span", attrs={"class": "value"})[3].get_text().strip()
162
178
  for item in value_raw
163
179
  ]
164
- temp_df = pd.DataFrame([code, name, num, num_1, num_2, num_3, num_4]).T
180
+ temp_df = pd.DataFrame([code, name, parent_name, num, num_1, num_2, num_3, num_4]).T
165
181
  temp_df.columns = [
166
182
  "行业代码",
167
183
  "行业名称",
184
+ "上级行业",
168
185
  "成份个数",
169
186
  "静态市盈率",
170
187
  "TTM(滚动)市盈率",
@@ -173,7 +190,9 @@ def sw_index_third_info() -> pd.DataFrame:
173
190
  ]
174
191
  temp_df["成份个数"] = pd.to_numeric(temp_df["成份个数"], errors="coerce")
175
192
  temp_df["静态市盈率"] = pd.to_numeric(temp_df["静态市盈率"], errors="coerce")
176
- temp_df["TTM(滚动)市盈率"] = pd.to_numeric(temp_df["TTM(滚动)市盈率"], errors="coerce")
193
+ temp_df["TTM(滚动)市盈率"] = pd.to_numeric(
194
+ temp_df["TTM(滚动)市盈率"], errors="coerce"
195
+ )
177
196
  temp_df["市净率"] = pd.to_numeric(temp_df["市净率"], errors="coerce")
178
197
  temp_df["静态股息率"] = pd.to_numeric(temp_df["静态股息率"], errors="coerce")
179
198
  return temp_df
@@ -189,7 +208,8 @@ def sw_index_third_cons(symbol: str = "801120.SI") -> pd.DataFrame:
189
208
  :rtype: pandas.DataFrame
190
209
  """
191
210
  url = f"https://legulegu.com/stockdata/index-composition?industryCode={symbol}"
192
- temp_df = pd.read_html(url)[0]
211
+ r = requests.get(url, headers=headers)
212
+ temp_df = pd.read_html(StringIO(r.text))[0]
193
213
  temp_df.columns = [
194
214
  "序号",
195
215
  "股票代码",
@@ -216,10 +236,18 @@ def sw_index_third_cons(symbol: str = "801120.SI") -> pd.DataFrame:
216
236
  temp_df["股息率"] = pd.to_numeric(temp_df["股息率"].str.strip("%"), errors="coerce")
217
237
  temp_df["市值"] = pd.to_numeric(temp_df["市值"], errors="coerce")
218
238
 
219
- temp_df["归母净利润同比增长(09-30)"] = temp_df["归母净利润同比增长(09-30)"].str.strip("%")
220
- temp_df["归母净利润同比增长(06-30)"] = temp_df["归母净利润同比增长(06-30)"].str.strip("%")
221
- temp_df["营业收入同比增长(09-30)"] = temp_df["营业收入同比增长(09-30)"].str.strip("%")
222
- temp_df["营业收入同比增长(06-30)"] = temp_df["营业收入同比增长(06-30)"].str.strip("%")
239
+ temp_df["归母净利润同比增长(09-30)"] = temp_df[
240
+ "归母净利润同比增长(09-30)"
241
+ ].str.strip("%")
242
+ temp_df["归母净利润同比增长(06-30)"] = temp_df[
243
+ "归母净利润同比增长(06-30)"
244
+ ].str.strip("%")
245
+ temp_df["营业收入同比增长(09-30)"] = temp_df["营业收入同比增长(09-30)"].str.strip(
246
+ "%"
247
+ )
248
+ temp_df["营业收入同比增长(06-30)"] = temp_df["营业收入同比增长(06-30)"].str.strip(
249
+ "%"
250
+ )
223
251
 
224
252
  temp_df["归母净利润同比增长(09-30)"] = pd.to_numeric(
225
253
  temp_df["归母净利润同比增长(09-30)"], errors="coerce"