akshare 1.12.99__py3-none-any.whl → 1.15.73__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.

Potentially problematic release.


This version of akshare might be problematic. Click here for more details.

Files changed (236) hide show
  1. akshare/__init__.py +442 -138
  2. akshare/air/air_hebei.py +79 -53
  3. akshare/air/air_zhenqi.py +29 -43
  4. akshare/air/sunrise_tad.py +32 -17
  5. akshare/bank/bank_cbirc_2020.py +12 -9
  6. akshare/bond/bond_cb_ths.py +17 -9
  7. akshare/bond/bond_china.py +38 -39
  8. akshare/bond/bond_china_money.py +75 -48
  9. akshare/bond/bond_info_cm.py +28 -8
  10. akshare/bond/bond_issue_cninfo.py +73 -30
  11. akshare/bond/bond_zh_cov.py +1 -1
  12. akshare/bond/bond_zh_sina.py +57 -51
  13. akshare/cal/__init__.py +0 -0
  14. akshare/cal/rv.py +170 -0
  15. akshare/cost/cost_living.py +7 -5
  16. akshare/currency/currency_safe.py +7 -6
  17. akshare/data/cninfo.js +15 -0
  18. akshare/datasets.py +10 -21
  19. akshare/economic/macro_bank.py +95 -653
  20. akshare/economic/macro_china.py +772 -1024
  21. akshare/economic/macro_china_hk.py +65 -243
  22. akshare/economic/macro_china_nbs.py +24 -7
  23. akshare/economic/macro_constitute.py +17 -12
  24. akshare/economic/macro_euro.py +13 -6
  25. akshare/economic/macro_finance_ths.py +133 -0
  26. akshare/economic/macro_info_ws.py +100 -0
  27. akshare/economic/macro_japan.py +5 -4
  28. akshare/economic/macro_other.py +12 -9
  29. akshare/economic/macro_usa.py +376 -1940
  30. akshare/economic/marco_cnbs.py +11 -6
  31. akshare/energy/energy_carbon.py +94 -125
  32. akshare/event/migration.py +3 -2
  33. akshare/exceptions.py +43 -0
  34. akshare/file_fold/calendar.json +245 -2
  35. akshare/fortune/fortune_500.py +15 -48
  36. akshare/fund/fund_amac.py +157 -75
  37. akshare/fund/fund_em.py +191 -184
  38. akshare/fund/fund_etf_em.py +16 -15
  39. akshare/fund/fund_etf_sina.py +71 -23
  40. akshare/fund/fund_etf_ths.py +93 -0
  41. akshare/fund/fund_fee_em.py +98 -0
  42. akshare/fund/fund_portfolio_em.py +60 -50
  43. akshare/fund/fund_rank_em.py +91 -82
  44. akshare/fund/fund_report_cninfo.py +63 -48
  45. akshare/fund/fund_scale_sina.py +20 -10
  46. akshare/fund/fund_xq.py +139 -109
  47. akshare/futures/cons.py +8 -31
  48. akshare/futures/cot.py +185 -137
  49. akshare/futures/futures_basis.py +97 -32
  50. akshare/futures/futures_comm_ctp.py +37 -0
  51. akshare/futures/futures_comm_qihuo.py +74 -45
  52. akshare/futures/futures_daily_bar.py +121 -184
  53. akshare/futures/futures_hf_em.py +66 -61
  54. akshare/futures/futures_hq_sina.py +79 -61
  55. akshare/futures/futures_index_ccidx.py +6 -3
  56. akshare/futures/futures_inventory_99.py +61 -272
  57. akshare/futures/futures_news_shmet.py +4 -2
  58. akshare/futures/futures_roll_yield.py +12 -25
  59. akshare/futures/futures_spot_stock_em.py +19 -13
  60. akshare/futures/futures_stock_js.py +14 -12
  61. akshare/futures/futures_to_spot.py +38 -33
  62. akshare/futures/futures_warehouse_receipt.py +75 -71
  63. akshare/futures/futures_zh_sina.py +5 -5
  64. akshare/futures/symbol_var.py +18 -13
  65. akshare/futures_derivative/futures_contract_info_czce.py +60 -52
  66. akshare/futures_derivative/futures_contract_info_ine.py +43 -34
  67. akshare/futures_derivative/futures_contract_info_shfe.py +46 -35
  68. akshare/futures_derivative/futures_cot_sina.py +26 -19
  69. akshare/futures_derivative/futures_spot_sys.py +21 -8
  70. akshare/fx/currency_investing.py +19 -285
  71. akshare/index/index_cflp.py +29 -26
  72. akshare/index/index_cni.py +86 -88
  73. akshare/index/index_cons.py +26 -10
  74. akshare/index/index_cx.py +248 -47
  75. akshare/index/index_drewry.py +17 -16
  76. akshare/index/index_option_qvix.py +329 -0
  77. akshare/index/index_research_fund_sw.py +134 -0
  78. akshare/index/{index_sw_research.py → index_research_sw.py} +122 -58
  79. akshare/index/index_spot.py +9 -5
  80. akshare/index/index_stock_hk.py +35 -16
  81. akshare/index/index_stock_us_sina.py +1 -1
  82. akshare/index/index_stock_zh.py +180 -89
  83. akshare/index/index_stock_zh_csindex.py +15 -369
  84. akshare/index/index_sw.py +62 -34
  85. akshare/index/index_yw.py +46 -23
  86. akshare/index/index_zh_a_scope.py +48 -0
  87. akshare/index/index_zh_em.py +6 -4
  88. akshare/interest_rate/interbank_rate_em.py +14 -9
  89. akshare/movie/artist_yien.py +32 -5
  90. akshare/movie/movie_yien.py +92 -18
  91. akshare/movie/video_yien.py +28 -5
  92. akshare/news/news_baidu.py +78 -44
  93. akshare/news/news_cctv.py +38 -38
  94. akshare/news/news_stock.py +6 -3
  95. akshare/nlp/nlp_interface.py +7 -8
  96. akshare/option/cons.py +11 -11
  97. akshare/option/option_comm_qihuo.py +86 -0
  98. akshare/option/option_commodity.py +178 -51
  99. akshare/option/option_daily_stats_sse_szse.py +146 -0
  100. akshare/option/option_em.py +147 -138
  101. akshare/option/option_finance_sina.py +160 -137
  102. akshare/option/option_lhb_em.py +62 -56
  103. akshare/option/option_risk_indicator_sse.py +17 -14
  104. akshare/other/other_car_cpca.py +934 -0
  105. akshare/other/{other_car.py → other_car_gasgoo.py} +15 -54
  106. akshare/qdii/__init__.py +0 -0
  107. akshare/qdii/qdii_jsl.py +233 -0
  108. akshare/request.py +117 -0
  109. akshare/spot/spot_hog_soozhu.py +232 -0
  110. akshare/spot/spot_price_qh.py +121 -0
  111. akshare/spot/spot_sge.py +63 -10
  112. akshare/stock/stock_allotment_cninfo.py +10 -9
  113. akshare/stock/stock_board_concept_em.py +23 -14
  114. akshare/stock/stock_board_industry_em.py +40 -34
  115. akshare/stock/stock_cg_equity_mortgage.py +15 -11
  116. akshare/stock/stock_cg_guarantee.py +41 -51
  117. akshare/stock/stock_cg_lawsuit.py +36 -35
  118. akshare/stock/stock_dividend_cninfo.py +12 -6
  119. akshare/stock/stock_dzjy_em.py +347 -260
  120. akshare/stock/stock_fund_em.py +332 -84
  121. akshare/stock/stock_hk_famous.py +108 -0
  122. akshare/stock/stock_hk_sina.py +8 -7
  123. akshare/stock/stock_hold_control_cninfo.py +100 -15
  124. akshare/stock/stock_hold_control_em.py +4 -3
  125. akshare/stock/stock_hold_num_cninfo.py +18 -12
  126. akshare/stock/stock_hot_rank_em.py +2 -1
  127. akshare/stock/stock_hot_search_baidu.py +5 -2
  128. akshare/stock/stock_industry_cninfo.py +24 -18
  129. akshare/stock/stock_industry_pe_cninfo.py +45 -31
  130. akshare/stock/stock_industry_sw.py +9 -10
  131. akshare/stock/stock_info.py +25 -15
  132. akshare/stock/stock_info_em.py +5 -2
  133. akshare/stock/stock_intraday_em.py +5 -2
  134. akshare/stock/stock_intraday_sina.py +22 -18
  135. akshare/stock/stock_ipo_summary_cninfo.py +25 -10
  136. akshare/stock/stock_new_cninfo.py +32 -19
  137. akshare/stock/stock_news_cx.py +39 -0
  138. akshare/stock/stock_profile_cninfo.py +9 -8
  139. akshare/stock/stock_rank_forecast.py +8 -6
  140. akshare/stock/stock_share_changes_cninfo.py +18 -14
  141. akshare/stock/stock_share_hold.py +24 -19
  142. akshare/stock/stock_summary.py +54 -26
  143. akshare/stock/stock_us_famous.py +15 -6
  144. akshare/stock/stock_us_pink.py +7 -5
  145. akshare/stock/stock_us_sina.py +15 -12
  146. akshare/stock/stock_xq.py +38 -12
  147. akshare/stock/stock_zh_a_sina.py +53 -78
  148. akshare/stock/stock_zh_b_sina.py +32 -55
  149. akshare/stock/stock_zh_kcb_report.py +11 -9
  150. akshare/stock/stock_zh_kcb_sina.py +67 -64
  151. akshare/stock_feature/stock_a_below_net_asset_statistics.py +5 -2
  152. akshare/stock_feature/stock_a_high_low.py +5 -2
  153. akshare/stock_feature/stock_a_indicator.py +12 -9
  154. akshare/stock_feature/stock_a_pe_and_pb.py +27 -6
  155. akshare/stock_feature/stock_account_em.py +58 -40
  156. akshare/stock_feature/stock_analyst_em.py +36 -27
  157. akshare/stock_feature/stock_board_industry_ths.py +136 -400
  158. akshare/stock_feature/stock_comment_em.py +118 -85
  159. akshare/stock_feature/stock_concept_futu.py +183 -0
  160. akshare/stock_feature/stock_cyq_em.py +58 -54
  161. akshare/stock_feature/stock_disclosure_cninfo.py +147 -102
  162. akshare/stock_feature/stock_esg_sina.py +216 -11
  163. akshare/stock_feature/stock_fhps_em.py +60 -25
  164. akshare/stock_feature/stock_fhps_ths.py +25 -6
  165. akshare/stock_feature/stock_fund_flow.py +38 -25
  166. akshare/stock_feature/stock_gdfx_em.py +180 -95
  167. akshare/stock_feature/stock_gdhs.py +73 -49
  168. akshare/stock_feature/stock_gpzy_em.py +78 -46
  169. akshare/stock_feature/stock_hist_em.py +55 -23
  170. akshare/stock_feature/stock_hk_valuation_baidu.py +20 -8
  171. akshare/stock_feature/stock_hsgt_em.py +184 -452
  172. akshare/stock_feature/stock_info.py +52 -29
  173. akshare/stock_feature/stock_inner_trade_xq.py +39 -31
  174. akshare/stock_feature/stock_irm_cninfo.py +32 -9
  175. akshare/stock_feature/stock_jgdy_em.py +41 -38
  176. akshare/stock_feature/stock_lh_yybpm.py +36 -37
  177. akshare/stock_feature/stock_lhb_em.py +135 -71
  178. akshare/stock_feature/stock_lhb_sina.py +93 -46
  179. akshare/stock_feature/stock_margin_em.py +102 -0
  180. akshare/stock_feature/{stock_sse_margin.py → stock_margin_sse.py} +21 -15
  181. akshare/stock_feature/{stock_szse_margin.py → stock_margin_szse.py} +23 -19
  182. akshare/stock_feature/stock_market_legu.py +13 -8
  183. akshare/stock_feature/stock_pankou_em.py +72 -34
  184. akshare/stock_feature/stock_report_em.py +244 -54
  185. akshare/stock_feature/stock_research_report_em.py +48 -19
  186. akshare/stock_feature/stock_sns_sseinfo.py +15 -12
  187. akshare/stock_feature/stock_sy_em.py +86 -33
  188. akshare/stock_feature/stock_technology_ths.py +152 -120
  189. akshare/stock_feature/stock_tfp_em.py +35 -13
  190. akshare/stock_feature/stock_three_report_em.py +119 -77
  191. akshare/stock_feature/stock_ttm_lyr.py +4 -7
  192. akshare/stock_feature/stock_value_em.py +83 -0
  193. akshare/stock_feature/stock_wencai.py +21 -9
  194. akshare/stock_feature/stock_yjyg_em.py +63 -28
  195. akshare/stock_feature/stock_zf_pg.py +61 -38
  196. akshare/stock_feature/stock_zh_valuation_baidu.py +3 -2
  197. akshare/stock_feature/stock_ztb_em.py +62 -40
  198. akshare/stock_fundamental/stock_finance.py +150 -58
  199. akshare/stock_fundamental/stock_finance_ths.py +116 -31
  200. akshare/stock_fundamental/stock_mda_ym.py +5 -3
  201. akshare/stock_fundamental/stock_notice.py +29 -15
  202. akshare/stock_fundamental/stock_profit_forecast_em.py +31 -13
  203. akshare/stock_fundamental/stock_profit_forecast_ths.py +19 -10
  204. akshare/stock_fundamental/stock_register_em.py +448 -0
  205. akshare/stock_fundamental/stock_restricted_em.py +79 -32
  206. akshare/stock_fundamental/stock_zygc.py +10 -8
  207. akshare/stock_fundamental/stock_zyjs_ths.py +5 -3
  208. akshare/tool/trade_date_hist.py +4 -3
  209. akshare/utils/cons.py +10 -0
  210. akshare/utils/context.py +43 -0
  211. akshare/utils/demjson.py +2 -2
  212. akshare/utils/func.py +26 -0
  213. akshare/utils/tqdm.py +13 -3
  214. {akshare-1.12.99.dist-info → akshare-1.15.73.dist-info}/METADATA +52 -69
  215. akshare-1.15.73.dist-info/RECORD +385 -0
  216. {akshare-1.12.99.dist-info → akshare-1.15.73.dist-info}/WHEEL +1 -1
  217. tests/test_func.py +3 -5
  218. akshare/bond/bond_futures.py +0 -50
  219. akshare/bond/bond_investing.py +0 -139
  220. akshare/crypto/crypto_hist_investing.py +0 -249
  221. akshare/fortune/fortune_it_juzi.py +0 -123
  222. akshare/futures/futures_international.py +0 -170
  223. akshare/futures/futures_news_baidu.py +0 -54
  224. akshare/futures/inventory_data.py +0 -100
  225. akshare/futures_derivative/futures_index_price_nh.py +0 -61
  226. akshare/futures_derivative/futures_index_return_nh.py +0 -47
  227. akshare/futures_derivative/futures_index_volatility_nh.py +0 -51
  228. akshare/futures_derivative/futures_other_index_nh.py +0 -145
  229. akshare/index/index_fear_greed_funddb.py +0 -71
  230. akshare/index/index_investing.py +0 -232
  231. akshare/sport/sport_olympic_winter.py +0 -39
  232. akshare/stock_feature/stock_board_concept_ths.py +0 -422
  233. akshare/stock_fundamental/stock_register.py +0 -292
  234. akshare-1.12.99.dist-info/RECORD +0 -374
  235. {akshare-1.12.99.dist-info → akshare-1.15.73.dist-info}/LICENSE +0 -0
  236. {akshare-1.12.99.dist-info → akshare-1.15.73.dist-info}/top_level.txt +0 -0
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2023/7/19 18:20
4
+ Date: 2023/8/14 11:10
5
5
  Desc: 国家金融与发展实验室-中国宏观杠杆率数据
6
6
  http://114.115.232.154:8080/
7
7
  """
8
+
8
9
  import pandas as pd
9
10
 
10
11
 
@@ -50,16 +51,20 @@ def macro_cnbs() -> pd.DataFrame:
50
51
  "金融部门负债方",
51
52
  ]
52
53
  temp_df = temp_df.reindex(columns=column_order)
53
-
54
54
  temp_df["居民部门"] = pd.to_numeric(temp_df["居民部门"], errors="coerce")
55
- temp_df["非金融企业部门"] = pd.to_numeric(temp_df["非金融企业部门"], errors="coerce")
55
+ temp_df["非金融企业部门"] = pd.to_numeric(
56
+ temp_df["非金融企业部门"], errors="coerce"
57
+ )
56
58
  temp_df["政府部门"] = pd.to_numeric(temp_df["政府部门"], errors="coerce")
57
59
  temp_df["中央政府"] = pd.to_numeric(temp_df["中央政府"], errors="coerce")
58
60
  temp_df["地方政府"] = pd.to_numeric(temp_df["地方政府"], errors="coerce")
59
61
  temp_df["实体经济部门"] = pd.to_numeric(temp_df["实体经济部门"], errors="coerce")
60
- temp_df["金融部门资产方"] = pd.to_numeric(temp_df["金融部门资产方"], errors="coerce")
61
- temp_df["金融部门负债方"] = pd.to_numeric(temp_df["金融部门负债方"], errors="coerce")
62
-
62
+ temp_df["金融部门资产方"] = pd.to_numeric(
63
+ temp_df["金融部门资产方"], errors="coerce"
64
+ )
65
+ temp_df["金融部门负债方"] = pd.to_numeric(
66
+ temp_df["金融部门负债方"], errors="coerce"
67
+ )
63
68
  return temp_df
64
69
 
65
70
 
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2022/5/25 16:05
4
+ Date: 2024/6/25 15:00
5
5
  Desc: 碳排放交易
6
6
  北京市碳排放权电子交易平台-北京市碳排放权公开交易行情
7
7
  https://www.bjets.com.cn/article/jyxx/
@@ -18,8 +18,8 @@ http://www.cerx.cn/dailynewsOuter/index.htm
18
18
  广州碳排放权交易中心-行情信息
19
19
  http://www.cnemission.com/article/hqxx/
20
20
  """
21
- import re
22
- from functools import lru_cache
21
+
22
+ from io import StringIO
23
23
 
24
24
  import pandas as pd
25
25
  import requests
@@ -27,9 +27,9 @@ from bs4 import BeautifulSoup
27
27
  from tqdm import tqdm
28
28
 
29
29
  from akshare.utils import demjson
30
+ from akshare.utils.cons import headers
30
31
 
31
32
 
32
- @lru_cache()
33
33
  def energy_carbon_domestic(symbol: str = "湖北") -> pd.DataFrame:
34
34
  """
35
35
  碳交易网-行情信息
@@ -39,9 +39,7 @@ def energy_carbon_domestic(symbol: str = "湖北") -> pd.DataFrame:
39
39
  :return: 行情信息
40
40
  :rtype: pandas.DataFrame
41
41
  """
42
- url = (
43
- "http://k.tanjiaoyi.com:8080/KDataController/getHouseDatasInAverage.do"
44
- )
42
+ url = "http://k.tanjiaoyi.com:8080/KDataController/getHouseDatasInAverage.do"
45
43
  params = {
46
44
  "lcnK": "53f75bfcefff58e4046ccfa42171636c",
47
45
  "brand": "TAN",
@@ -69,14 +67,13 @@ def energy_carbon_domestic(symbol: str = "湖北") -> pd.DataFrame:
69
67
  "地点",
70
68
  ]
71
69
  ]
72
- temp_df["日期"] = pd.to_datetime(temp_df["日期"]).dt.date
73
- temp_df["成交价"] = pd.to_numeric(temp_df["成交价"])
74
- temp_df["成交量"] = pd.to_numeric(temp_df["成交量"])
75
- temp_df["成交额"] = pd.to_numeric(temp_df["成交额"])
70
+ temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
71
+ temp_df["成交价"] = pd.to_numeric(temp_df["成交价"], errors="coerce")
72
+ temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
73
+ temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce")
76
74
  return temp_df
77
75
 
78
76
 
79
- @lru_cache()
80
77
  def energy_carbon_bj() -> pd.DataFrame:
81
78
  """
82
79
  北京市碳排放权电子交易平台-北京市碳排放权公开交易行情
@@ -85,8 +82,8 @@ def energy_carbon_bj() -> pd.DataFrame:
85
82
  :rtype: pandas.DataFrame
86
83
  """
87
84
  url = "https://www.bjets.com.cn/article/jyxx/"
88
- r = requests.get(url)
89
- soup = BeautifulSoup(r.text, "lxml")
85
+ r = requests.get(url, verify=False, headers=headers)
86
+ soup = BeautifulSoup(r.text, features="lxml")
90
87
  total_page = (
91
88
  soup.find("table")
92
89
  .find("script")
@@ -104,10 +101,10 @@ def energy_carbon_bj() -> pd.DataFrame:
104
101
  if i == 1:
105
102
  i = ""
106
103
  url = f"https://www.bjets.com.cn/article/jyxx/?{i}"
107
- r = requests.get(url)
104
+ r = requests.get(url, verify=False, headers=headers)
108
105
  r.encoding = "utf-8"
109
- df = pd.read_html(r.text)[0]
110
- temp_df = pd.concat([temp_df, df], ignore_index=True)
106
+ df = pd.read_html(StringIO(r.text))[0]
107
+ temp_df = pd.concat(objs=[temp_df, df], ignore_index=True)
111
108
  temp_df.columns = ["日期", "成交量", "成交均价", "成交额"]
112
109
  temp_df["成交单位"] = (
113
110
  temp_df["成交额"]
@@ -125,17 +122,16 @@ def energy_carbon_bj() -> pd.DataFrame:
125
122
  .str.split("(", expand=True)
126
123
  .iloc[:, 0]
127
124
  )
128
- temp_df["成交量"] = pd.to_numeric(temp_df["成交量"])
129
- temp_df["成交均价"] = pd.to_numeric(temp_df["成交均价"])
125
+ temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
126
+ temp_df["成交均价"] = pd.to_numeric(temp_df["成交均价"], errors="coerce")
130
127
  temp_df["成交额"] = temp_df["成交额"].str.replace(",", "")
131
128
  temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce")
132
- temp_df["日期"] = pd.to_datetime(temp_df["日期"]).dt.date
133
- temp_df.sort_values("日期", inplace=True)
129
+ temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
130
+ temp_df.sort_values(by="日期", inplace=True)
134
131
  temp_df.reset_index(inplace=True, drop=True)
135
132
  return temp_df
136
133
 
137
134
 
138
- @lru_cache()
139
135
  def energy_carbon_sz() -> pd.DataFrame:
140
136
  """
141
137
  深圳碳排放交易所-国内碳情
@@ -144,33 +140,30 @@ def energy_carbon_sz() -> pd.DataFrame:
144
140
  :rtype: pandas.DataFrame
145
141
  """
146
142
  url = "http://www.cerx.cn/dailynewsCN/index.htm"
147
- r = requests.get(url)
148
- soup = BeautifulSoup(r.text, "lxml")
149
- page_num = int(
150
- soup.find(attrs={"class": "pagebar"}).find_all("option")[-1].text
151
- )
152
- big_df = pd.read_html(r.text, header=0)[0]
143
+ r = requests.get(url, headers=headers)
144
+ soup = BeautifulSoup(r.text, features="lxml")
145
+ page_num = int(soup.find(attrs={"class": "pagebar"}).find_all("option")[-1].text)
146
+ big_df = pd.read_html(StringIO(r.text), header=0)[0]
153
147
  for page in tqdm(
154
148
  range(2, page_num + 1), desc="Please wait for a moment", leave=False
155
149
  ):
156
150
  url = f"http://www.cerx.cn/dailynewsCN/index_{page}.htm"
157
- r = requests.get(url)
158
- temp_df = pd.read_html(r.text, header=0)[0]
159
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
160
- big_df["交易日期"] = pd.to_datetime(big_df["交易日期"]).dt.date
161
- big_df["开盘价"] = pd.to_numeric(big_df["开盘价"])
162
- big_df["最高价"] = pd.to_numeric(big_df["最高价"])
163
- big_df["最低价"] = pd.to_numeric(big_df["最低价"])
164
- big_df["成交均价"] = pd.to_numeric(big_df["成交均价"])
165
- big_df["收盘价"] = pd.to_numeric(big_df["收盘价"])
166
- big_df["成交量"] = pd.to_numeric(big_df["成交量"])
167
- big_df["成交额"] = pd.to_numeric(big_df["成交额"])
168
- big_df.sort_values("交易日期", inplace=True)
151
+ r = requests.get(url, headers=headers)
152
+ temp_df = pd.read_html(StringIO(r.text), header=0)[0]
153
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
154
+ big_df["交易日期"] = pd.to_datetime(big_df["交易日期"], errors="coerce").dt.date
155
+ big_df["开盘价"] = pd.to_numeric(big_df["开盘价"], errors="coerce")
156
+ big_df["最高价"] = pd.to_numeric(big_df["最高价"], errors="coerce")
157
+ big_df["最低价"] = pd.to_numeric(big_df["最低价"], errors="coerce")
158
+ big_df["成交均价"] = pd.to_numeric(big_df["成交均价"], errors="coerce")
159
+ big_df["收盘价"] = pd.to_numeric(big_df["收盘价"], errors="coerce")
160
+ big_df["成交量"] = pd.to_numeric(big_df["成交量"], errors="coerce")
161
+ big_df["成交额"] = pd.to_numeric(big_df["成交额"], errors="coerce")
162
+ big_df.sort_values(by="交易日期", inplace=True)
169
163
  big_df.reset_index(inplace=True, drop=True)
170
164
  return big_df
171
165
 
172
166
 
173
- @lru_cache()
174
167
  def energy_carbon_eu() -> pd.DataFrame:
175
168
  """
176
169
  深圳碳排放交易所-国际碳情
@@ -179,33 +172,30 @@ def energy_carbon_eu() -> pd.DataFrame:
179
172
  :rtype: pandas.DataFrame
180
173
  """
181
174
  url = "http://www.cerx.cn/dailynewsOuter/index.htm"
182
- r = requests.get(url)
183
- soup = BeautifulSoup(r.text, "lxml")
184
- page_num = int(
185
- soup.find(attrs={"class": "pagebar"}).find_all("option")[-1].text
186
- )
187
- big_df = pd.read_html(r.text, header=0)[0]
175
+ r = requests.get(url, headers=headers)
176
+ soup = BeautifulSoup(r.text, features="lxml")
177
+ page_num = int(soup.find(attrs={"class": "pagebar"}).find_all("option")[-1].text)
178
+ big_df = pd.read_html(StringIO(r.text), header=0)[0]
188
179
  for page in tqdm(
189
180
  range(2, page_num + 1), desc="Please wait for a moment", leave=False
190
181
  ):
191
182
  url = f"http://www.cerx.cn/dailynewsOuter/index_{page}.htm"
192
183
  r = requests.get(url)
193
- temp_df = pd.read_html(r.text, header=0)[0]
194
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
195
- big_df["交易日期"] = pd.to_datetime(big_df["交易日期"]).dt.date
196
- big_df["开盘价"] = pd.to_numeric(big_df["开盘价"])
197
- big_df["最高价"] = pd.to_numeric(big_df["最高价"])
198
- big_df["最低价"] = pd.to_numeric(big_df["最低价"])
199
- big_df["成交均价"] = pd.to_numeric(big_df["成交均价"])
200
- big_df["收盘价"] = pd.to_numeric(big_df["收盘价"])
201
- big_df["成交量"] = pd.to_numeric(big_df["成交量"])
202
- big_df["成交额"] = pd.to_numeric(big_df["成交额"])
203
- big_df.sort_values("交易日期", inplace=True)
184
+ temp_df = pd.read_html(StringIO(r.text), header=0)[0]
185
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
186
+ big_df["交易日期"] = pd.to_datetime(big_df["交易日期"], errors="coerce").dt.date
187
+ big_df["开盘价"] = pd.to_numeric(big_df["开盘价"], errors="coerce")
188
+ big_df["最高价"] = pd.to_numeric(big_df["最高价"], errors="coerce")
189
+ big_df["最低价"] = pd.to_numeric(big_df["最低价"], errors="coerce")
190
+ big_df["成交均价"] = pd.to_numeric(big_df["成交均价"], errors="coerce")
191
+ big_df["收盘价"] = pd.to_numeric(big_df["收盘价"], errors="coerce")
192
+ big_df["成交量"] = pd.to_numeric(big_df["成交量"], errors="coerce")
193
+ big_df["成交额"] = pd.to_numeric(big_df["成交额"], errors="coerce")
194
+ big_df.sort_values(by="交易日期", inplace=True)
204
195
  big_df.reset_index(inplace=True, drop=True)
205
196
  return big_df
206
197
 
207
198
 
208
- @lru_cache()
209
199
  def energy_carbon_hb() -> pd.DataFrame:
210
200
  """
211
201
  湖北碳排放权交易中心-现货交易数据-配额-每日概况
@@ -213,66 +203,43 @@ def energy_carbon_hb() -> pd.DataFrame:
213
203
  :return: 现货交易数据-配额-每日概况行情数据
214
204
  :rtype: pandas.DataFrame
215
205
  """
216
- url = "http://www.hbets.cn/list/13.html"
217
- r = requests.get(url)
218
- soup = BeautifulSoup(r.text, "lxml")
219
- page_string = (
220
- soup.find("div", attrs={"class": "page"}).find_all("span")[-1].text
206
+ url = "https://www.hbets.cn/"
207
+ r = requests.get(url, headers=headers)
208
+ soup = BeautifulSoup(r.text, features="lxml")
209
+ data_text = (
210
+ soup.find(name="div", attrs={"class": "threeLeft"}).find_all("script")[1].text
221
211
  )
222
- page_num = int(re.findall(r"\d+", page_string)[-1])
223
- columns = [
224
- item.text
225
- for item in soup.find("ul", attrs={"class": "title"}).find_all("li")
226
- ]
227
- big_df = pd.DataFrame()
228
- for page in tqdm(
229
- range(1, page_num + 1), desc="Please wait for a moment", leave=False
230
- ):
231
- url = f"http://www.hbets.cn/list/13.html"
232
- params = {"page": page}
233
- r = requests.get(url, params=params)
234
- soup = BeautifulSoup(r.text, "lxml")
235
- page_node = [
236
- item
237
- for item in soup.find(attrs={"class": "future_table"}).find_all(
238
- attrs={"class": "cont"}
239
- )
212
+ start_pos = data_text.find("cjj = '[") + 7 # 找到 JSON 数组开始的位置
213
+ end_pos = data_text.rfind("cjj =") - 31 # 找到 JSON 数组结束的位置
214
+ data_json = demjson.decode(data_text[start_pos:end_pos])
215
+ temp_df = pd.DataFrame.from_dict(data_json)
216
+ temp_df.rename(
217
+ columns={
218
+ "riqi": "日期",
219
+ "cjj": "成交价",
220
+ "cjl": "成交量",
221
+ "zx": "最新",
222
+ "zd": "涨跌",
223
+ },
224
+ inplace=True,
225
+ )
226
+ temp_df = temp_df[
227
+ [
228
+ "日期",
229
+ "成交价",
230
+ "成交量",
231
+ "最新",
232
+ "涨跌",
240
233
  ]
241
- temp_list = []
242
- for item in page_node:
243
- temp_inner_list = []
244
- for inner_item in item.find_all("li"):
245
- temp_inner_list.append(inner_item.text)
246
- temp_list.append(temp_inner_list)
247
- temp_df = pd.DataFrame(temp_list)
248
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
249
- big_df.columns = columns
250
- big_df["交易品种"] = big_df["交易品种"].str.strip()
251
- big_df["日期"] = pd.to_datetime(big_df["日期"]).dt.date
252
- big_df["最新"] = pd.to_numeric(big_df["最新"])
253
- big_df["涨跌幅"] = big_df["涨跌幅"].str.strip("%").str.strip()
254
- big_df["涨跌幅"] = big_df["涨跌幅"].str.strip("%")
255
- big_df["涨跌幅"] = pd.to_numeric(big_df["涨跌幅"])
256
- big_df["最高"] = big_df["最高"].str.replace("--", "")
257
- big_df["最高"] = pd.to_numeric(big_df["最高"])
258
- big_df["最低"] = big_df["最低"].str.replace("--", "")
259
- big_df["最低"] = pd.to_numeric(big_df["最低"])
260
- big_df["成交量"] = big_df["成交量"].str.replace("--", "")
261
- big_df["成交量"] = pd.to_numeric(big_df["成交量"])
262
- big_df["成交额"] = big_df["成交额"].str.replace("--", "")
263
- big_df["成交额"] = pd.to_numeric(big_df["成交额"])
264
- big_df["昨收盘价"] = big_df["昨收盘价"].str.replace("--", "")
265
- big_df["昨收盘价"] = pd.to_numeric(big_df["昨收盘价"])
266
- big_df.dropna(subset=["最新"], inplace=True)
267
- big_df.sort_values("日期", inplace=True)
268
- big_df = big_df[
269
- ["日期", "交易品种", "最新", "涨跌幅", "最高", "最低", "成交量", "成交额", "昨收盘价"]
270
234
  ]
271
- big_df.reset_index(inplace=True, drop=True)
272
- return big_df
235
+ temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
236
+ temp_df["成交价"] = pd.to_numeric(temp_df["成交价"], errors="coerce")
237
+ temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
238
+ temp_df["最新"] = pd.to_numeric(temp_df["最新"], errors="coerce")
239
+ temp_df["涨跌"] = pd.to_numeric(temp_df["涨跌"], errors="coerce")
240
+ return temp_df
273
241
 
274
242
 
275
- @lru_cache()
276
243
  def energy_carbon_gz() -> pd.DataFrame:
277
244
  """
278
245
  广州碳排放权交易中心-行情信息
@@ -287,7 +254,7 @@ def energy_carbon_gz() -> pd.DataFrame:
287
254
  "endTime": "2030-09-12",
288
255
  }
289
256
  r = requests.get(url, params=params)
290
- temp_df = pd.read_html(r.text, header=0)[1]
257
+ temp_df = pd.read_html(StringIO(r.text), header=0)[1]
291
258
  temp_df.columns = [
292
259
  "日期",
293
260
  "品种",
@@ -300,17 +267,19 @@ def energy_carbon_gz() -> pd.DataFrame:
300
267
  "成交数量",
301
268
  "成交金额",
302
269
  ]
303
- temp_df["日期"] = pd.to_datetime(temp_df["日期"], format="%Y%m%d").dt.date
304
- temp_df["开盘价"] = pd.to_numeric(temp_df["开盘价"])
305
- temp_df["收盘价"] = pd.to_numeric(temp_df["收盘价"])
306
- temp_df["最高价"] = pd.to_numeric(temp_df["最高价"])
307
- temp_df["最低价"] = pd.to_numeric(temp_df["最低价"])
308
- temp_df["涨跌"] = pd.to_numeric(temp_df["涨跌"])
270
+ temp_df["日期"] = pd.to_datetime(
271
+ temp_df["日期"], format="%Y%m%d", errors="coerce"
272
+ ).dt.date
273
+ temp_df["开盘价"] = pd.to_numeric(temp_df["开盘价"], errors="coerce")
274
+ temp_df["收盘价"] = pd.to_numeric(temp_df["收盘价"], errors="coerce")
275
+ temp_df["最高价"] = pd.to_numeric(temp_df["最高价"], errors="coerce")
276
+ temp_df["最低价"] = pd.to_numeric(temp_df["最低价"], errors="coerce")
277
+ temp_df["涨跌"] = pd.to_numeric(temp_df["涨跌"], errors="coerce")
309
278
  temp_df["涨跌幅"] = temp_df["涨跌幅"].str.strip("%")
310
- temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"])
311
- temp_df["成交数量"] = pd.to_numeric(temp_df["成交数量"])
312
- temp_df["成交金额"] = pd.to_numeric(temp_df["成交金额"])
313
- temp_df.sort_values("日期", inplace=True)
279
+ temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce")
280
+ temp_df["成交数量"] = pd.to_numeric(temp_df["成交数量"], errors="coerce")
281
+ temp_df["成交金额"] = pd.to_numeric(temp_df["成交金额"], errors="coerce")
282
+ temp_df.sort_values(by="日期", inplace=True)
314
283
  temp_df.reset_index(inplace=True, drop=True)
315
284
  return temp_df
316
285
 
@@ -1,9 +1,10 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2023/9/24 16:30
4
+ Date: 2024/5/12 22:30
5
5
  Desc: 百度地图慧眼-百度迁徙数据
6
6
  """
7
+
7
8
  import json
8
9
 
9
10
  import pandas as pd
@@ -92,7 +93,7 @@ def migration_scale_baidu(
92
93
 
93
94
  if __name__ == "__main__":
94
95
  migration_area_baidu_df = migration_area_baidu(
95
- area="上海市", indicator="move_in", date="20230922"
96
+ area="杭州市", indicator="move_out", date="20240401"
96
97
  )
97
98
  print(migration_area_baidu_df)
98
99
 
akshare/exceptions.py ADDED
@@ -0,0 +1,43 @@
1
+ """
2
+ AKShare 异常处理模块
3
+ """
4
+
5
+
6
+ class AkshareException(Exception):
7
+ """Base exception for akshare library"""
8
+
9
+ def __init__(self, message):
10
+ self.message = message
11
+ super().__init__(self.message)
12
+
13
+
14
+ class APIError(AkshareException):
15
+ """Raised when API request fails"""
16
+
17
+ def __init__(self, message, status_code=None):
18
+ self.status_code = status_code
19
+ super().__init__(f"API Error: {message} (Status code: {status_code})")
20
+
21
+
22
+ class DataParsingError(AkshareException):
23
+ """Raised when data parsing fails"""
24
+
25
+ pass
26
+
27
+
28
+ class InvalidParameterError(AkshareException):
29
+ """Raised when an invalid parameter is provided"""
30
+
31
+ pass
32
+
33
+
34
+ class NetworkError(AkshareException):
35
+ """Raised when network-related issues occur"""
36
+
37
+ pass
38
+
39
+
40
+ class RateLimitError(AkshareException):
41
+ """Raised when API rate limit is exceeded"""
42
+
43
+ pass