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,15 +1,14 @@
1
1
  # -*- coding:utf-8 -*-
2
2
  # !/usr/bin/env python
3
3
  """
4
- Date: 2023/6/12 15:00
4
+ Date: 2024/6/19 22:00
5
5
  Desc: 巨潮资讯-数据中心-专题统计-债券报表-债券发行
6
6
  http://webapi.cninfo.com.cn/#/thematicStatistics
7
7
  """
8
- import time
9
8
 
10
9
  import pandas as pd
11
10
  import requests
12
- from py_mini_racer import py_mini_racer
11
+ import py_mini_racer
13
12
 
14
13
  from akshare.datasets import get_ths_js
15
14
 
@@ -23,7 +22,7 @@ def _get_file_content_cninfo(file: str = "cninfo.js") -> str:
23
22
  :rtype: str
24
23
  """
25
24
  setting_file_path = get_ths_js(file)
26
- with open(setting_file_path) as f:
25
+ with open(setting_file_path, encoding="utf-8") as f:
27
26
  file_data = f.read()
28
27
  return file_data
29
28
 
@@ -58,7 +57,8 @@ def bond_treasure_issue_cninfo(
58
57
  "Pragma": "no-cache",
59
58
  "Proxy-Connection": "keep-alive",
60
59
  "Referer": "http://webapi.cninfo.com.cn/",
61
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36",
60
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
61
+ "Chrome/93.0.4577.63 Safari/537.36",
62
62
  "X-Requested-With": "XMLHttpRequest",
63
63
  }
64
64
  params = {
@@ -107,8 +107,12 @@ def bond_treasure_issue_cninfo(
107
107
  "债券名称",
108
108
  ]
109
109
  ]
110
- temp_df["发行起始日"] = pd.to_datetime(temp_df["发行起始日"], errors="coerce").dt.date
111
- temp_df["发行终止日"] = pd.to_datetime(temp_df["发行终止日"], errors="coerce").dt.date
110
+ temp_df["发行起始日"] = pd.to_datetime(
111
+ temp_df["发行起始日"], errors="coerce"
112
+ ).dt.date
113
+ temp_df["发行终止日"] = pd.to_datetime(
114
+ temp_df["发行终止日"], errors="coerce"
115
+ ).dt.date
112
116
  temp_df["缴款日"] = pd.to_datetime(temp_df["缴款日"], errors="coerce").dt.date
113
117
  temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
114
118
  temp_df["计划发行总量"] = pd.to_numeric(temp_df["计划发行总量"], errors="coerce")
@@ -133,7 +137,6 @@ def bond_local_government_issue_cninfo(
133
137
  :rtype: pandas.DataFrame
134
138
  """
135
139
  url = "http://webapi.cninfo.com.cn/api/sysapi/p_sysapi1121"
136
- random_time_str = str(int(time.time()))
137
140
  js_code = py_mini_racer.MiniRacer()
138
141
  js_content = _get_file_content_cninfo("cninfo.js")
139
142
  js_code.eval(js_content)
@@ -150,7 +153,8 @@ def bond_local_government_issue_cninfo(
150
153
  "Pragma": "no-cache",
151
154
  "Proxy-Connection": "keep-alive",
152
155
  "Referer": "http://webapi.cninfo.com.cn/",
153
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36",
156
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
157
+ "Chrome/93.0.4577.63 Safari/537.36",
154
158
  "X-Requested-With": "XMLHttpRequest",
155
159
  }
156
160
  params = {
@@ -199,8 +203,12 @@ def bond_local_government_issue_cninfo(
199
203
  "债券名称",
200
204
  ]
201
205
  ]
202
- temp_df["发行起始日"] = pd.to_datetime(temp_df["发行起始日"], errors="coerce").dt.date
203
- temp_df["发行终止日"] = pd.to_datetime(temp_df["发行终止日"], errors="coerce").dt.date
206
+ temp_df["发行起始日"] = pd.to_datetime(
207
+ temp_df["发行起始日"], errors="coerce"
208
+ ).dt.date
209
+ temp_df["发行终止日"] = pd.to_datetime(
210
+ temp_df["发行终止日"], errors="coerce"
211
+ ).dt.date
204
212
  temp_df["缴款日"] = pd.to_datetime(temp_df["缴款日"], errors="coerce").dt.date
205
213
  temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
206
214
  temp_df["计划发行总量"] = pd.to_numeric(temp_df["计划发行总量"], errors="coerce")
@@ -241,7 +249,8 @@ def bond_corporate_issue_cninfo(
241
249
  "Pragma": "no-cache",
242
250
  "Proxy-Connection": "keep-alive",
243
251
  "Referer": "http://webapi.cninfo.com.cn/",
244
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36",
252
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
253
+ "Chrome/93.0.4577.63 Safari/537.36",
245
254
  "X-Requested-With": "XMLHttpRequest",
246
255
  }
247
256
  params = {
@@ -295,8 +304,12 @@ def bond_corporate_issue_cninfo(
295
304
  ]
296
305
  ]
297
306
  temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
298
- temp_df["交易所网上发行起始日"] = pd.to_datetime(temp_df["交易所网上发行起始日"], errors="coerce").dt.date
299
- temp_df["交易所网上发行终止日"] = pd.to_datetime(temp_df["交易所网上发行终止日"], errors="coerce").dt.date
307
+ temp_df["交易所网上发行起始日"] = pd.to_datetime(
308
+ temp_df["交易所网上发行起始日"], errors="coerce"
309
+ ).dt.date
310
+ temp_df["交易所网上发行终止日"] = pd.to_datetime(
311
+ temp_df["交易所网上发行终止日"], errors="coerce"
312
+ ).dt.date
300
313
  temp_df["计划发行总量"] = pd.to_numeric(temp_df["计划发行总量"], errors="coerce")
301
314
  temp_df["实际发行总量"] = pd.to_numeric(temp_df["实际发行总量"], errors="coerce")
302
315
  temp_df["发行面值"] = pd.to_numeric(temp_df["发行面值"], errors="coerce")
@@ -336,7 +349,8 @@ def bond_cov_issue_cninfo(
336
349
  "Pragma": "no-cache",
337
350
  "Proxy-Connection": "keep-alive",
338
351
  "Referer": "http://webapi.cninfo.com.cn/",
339
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36",
352
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
353
+ "Chrome/93.0.4577.63 Safari/537.36",
340
354
  "X-Requested-With": "XMLHttpRequest",
341
355
  }
342
356
  params = {
@@ -418,23 +432,47 @@ def bond_cov_issue_cninfo(
418
432
  ]
419
433
  ]
420
434
  temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
421
- temp_df["发行起始日"] = pd.to_datetime(temp_df["发行起始日"], errors="coerce").dt.date
422
- temp_df["发行终止日"] = pd.to_datetime(temp_df["发行终止日"], errors="coerce").dt.date
423
- temp_df["转股开始日期"] = pd.to_datetime(temp_df["转股开始日期"], errors="coerce").dt.date
424
- temp_df["转股终止日期"] = pd.to_datetime(temp_df["转股终止日期"], errors="coerce").dt.date
425
- temp_df["转股终止日期"] = pd.to_datetime(temp_df["转股终止日期"], errors="coerce").dt.date
426
- temp_df["网上申购日期"] = pd.to_datetime(temp_df["网上申购日期"], errors="coerce").dt.date
427
- temp_df["网上申购中签结果公告日及退款日"] = pd.to_datetime(temp_df["网上申购中签结果公告日及退款日"], errors="coerce").dt.date
428
- temp_df["债权登记日"] = pd.to_datetime(temp_df["债权登记日"], errors="coerce").dt.date
429
- temp_df["优先申购日"] = pd.to_datetime(temp_df["优先申购日"], errors="coerce").dt.date
430
- temp_df["优先申购缴款日"] = pd.to_datetime(temp_df["优先申购缴款日"], errors="coerce").dt.date
435
+ temp_df["发行起始日"] = pd.to_datetime(
436
+ temp_df["发行起始日"], errors="coerce"
437
+ ).dt.date
438
+ temp_df["发行终止日"] = pd.to_datetime(
439
+ temp_df["发行终止日"], errors="coerce"
440
+ ).dt.date
441
+ temp_df["转股开始日期"] = pd.to_datetime(
442
+ temp_df["转股开始日期"], errors="coerce"
443
+ ).dt.date
444
+ temp_df["转股终止日期"] = pd.to_datetime(
445
+ temp_df["转股终止日期"], errors="coerce"
446
+ ).dt.date
447
+ temp_df["转股终止日期"] = pd.to_datetime(
448
+ temp_df["转股终止日期"], errors="coerce"
449
+ ).dt.date
450
+ temp_df["网上申购日期"] = pd.to_datetime(
451
+ temp_df["网上申购日期"], errors="coerce"
452
+ ).dt.date
453
+ temp_df["网上申购中签结果公告日及退款日"] = pd.to_datetime(
454
+ temp_df["网上申购中签结果公告日及退款日"], errors="coerce"
455
+ ).dt.date
456
+ temp_df["债权登记日"] = pd.to_datetime(
457
+ temp_df["债权登记日"], errors="coerce"
458
+ ).dt.date
459
+ temp_df["优先申购日"] = pd.to_datetime(
460
+ temp_df["优先申购日"], errors="coerce"
461
+ ).dt.date
462
+ temp_df["优先申购缴款日"] = pd.to_datetime(
463
+ temp_df["优先申购缴款日"], errors="coerce"
464
+ ).dt.date
431
465
  temp_df["计划发行总量"] = pd.to_numeric(temp_df["计划发行总量"], errors="coerce")
432
466
  temp_df["实际发行总量"] = pd.to_numeric(temp_df["实际发行总量"], errors="coerce")
433
467
  temp_df["发行面值"] = pd.to_numeric(temp_df["发行面值"], errors="coerce")
434
468
  temp_df["发行价格"] = pd.to_numeric(temp_df["发行价格"], errors="coerce")
435
469
  temp_df["初始转股价格"] = pd.to_numeric(temp_df["初始转股价格"], errors="coerce")
436
- temp_df["网上申购数量上限"] = pd.to_numeric(temp_df["网上申购数量上限"], errors="coerce")
437
- temp_df["网上申购数量下限"] = pd.to_numeric(temp_df["网上申购数量下限"], errors="coerce")
470
+ temp_df["网上申购数量上限"] = pd.to_numeric(
471
+ temp_df["网上申购数量上限"], errors="coerce"
472
+ )
473
+ temp_df["网上申购数量下限"] = pd.to_numeric(
474
+ temp_df["网上申购数量下限"], errors="coerce"
475
+ )
438
476
  temp_df["网上申购单位"] = pd.to_numeric(temp_df["网上申购单位"], errors="coerce")
439
477
  temp_df["配售价格"] = pd.to_numeric(temp_df["配售价格"], errors="coerce")
440
478
  return temp_df
@@ -464,7 +502,8 @@ def bond_cov_stock_issue_cninfo() -> pd.DataFrame:
464
502
  "Pragma": "no-cache",
465
503
  "Proxy-Connection": "keep-alive",
466
504
  "Referer": "http://webapi.cninfo.com.cn/",
467
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36",
505
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
506
+ "Chrome/93.0.4577.63 Safari/537.36",
468
507
  "X-Requested-With": "XMLHttpRequest",
469
508
  }
470
509
  r = requests.post(url, headers=headers)
@@ -500,8 +539,12 @@ def bond_cov_stock_issue_cninfo() -> pd.DataFrame:
500
539
  ]
501
540
  ]
502
541
  temp_df["公告日期"] = pd.to_datetime(temp_df["公告日期"], errors="coerce").dt.date
503
- temp_df["自愿转换期起始日"] = pd.to_datetime(temp_df["自愿转换期起始日"], errors="coerce").dt.date
504
- temp_df["自愿转换期终止日"] = pd.to_datetime(temp_df["自愿转换期终止日"], errors="coerce").dt.date
542
+ temp_df["自愿转换期起始日"] = pd.to_datetime(
543
+ temp_df["自愿转换期起始日"], errors="coerce"
544
+ ).dt.date
545
+ temp_df["自愿转换期终止日"] = pd.to_datetime(
546
+ temp_df["自愿转换期终止日"], errors="coerce"
547
+ ).dt.date
505
548
  temp_df["转股价格"] = pd.to_numeric(temp_df["转股价格"], errors="coerce")
506
549
  return temp_df
507
550
 
@@ -11,7 +11,7 @@ import re
11
11
 
12
12
  import pandas as pd
13
13
  import requests
14
- from py_mini_racer import py_mini_racer
14
+ import py_mini_racer
15
15
 
16
16
  from akshare.bond.cons import (
17
17
  zh_sina_bond_hs_cov_count_url,
@@ -1,16 +1,17 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2024/2/28 23:00
4
+ Date: 2024/6/18 18:30
5
5
  Desc: 新浪财经-债券-沪深债券-实时行情数据和历史行情数据
6
6
  https://vip.stock.finance.sina.com.cn/mkt/#hs_z
7
7
  """
8
+
8
9
  import datetime
9
10
  import re
10
11
 
11
12
  import pandas as pd
12
13
  import requests
13
- from py_mini_racer import py_mini_racer
14
+ import py_mini_racer
14
15
 
15
16
  from akshare.bond.cons import (
16
17
  zh_sina_bond_hs_count_url,
@@ -41,7 +42,7 @@ def get_zh_bond_hs_page_count() -> int:
41
42
  return int(page_count) + 1
42
43
 
43
44
 
44
- def bond_zh_hs_spot() -> pd.DataFrame:
45
+ def bond_zh_hs_spot(start_page: str = "1", end_page: str = "10") -> pd.DataFrame:
45
46
  """
46
47
  新浪财经-债券-沪深债券-实时行情数据, 大量抓取容易封IP
47
48
  https://vip.stock.finance.sina.com.cn/mkt/#hs_z
@@ -49,59 +50,64 @@ def bond_zh_hs_spot() -> pd.DataFrame:
49
50
  :rtype: pandas.DataFrame
50
51
  """
51
52
  page_count = get_zh_bond_hs_page_count()
53
+ page_count = int(page_count)
52
54
  zh_sina_bond_hs_payload_copy = zh_sina_bond_hs_payload.copy()
53
55
  tqdm = get_tqdm()
54
56
  big_df = pd.DataFrame()
55
- for page in tqdm(range(1, page_count + 1), leave=False):
57
+ start_page = int(start_page)
58
+ end_page = int(end_page) + 1 if int(end_page) + 1 <= page_count else page_count
59
+ for page in tqdm(range(start_page, end_page), leave=False):
56
60
  zh_sina_bond_hs_payload_copy.update({"page": page})
57
61
  r = requests.get(zh_sina_bond_hs_url, params=zh_sina_bond_hs_payload_copy)
58
62
  data_json = demjson.decode(r.text)
59
63
  temp_df = pd.DataFrame(data_json)
60
64
  big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
61
65
  big_df.columns = [
62
- '代码',
63
- '-',
64
- '名称',
65
- '最新价',
66
- '涨跌额',
67
- '涨跌幅',
68
- '买入',
69
- '卖出',
70
- '昨收',
71
- '今开',
72
- '最高',
73
- '最低',
74
- '成交量',
75
- '成交额',
76
- '-',
77
- '-',
78
- '-',
79
- '-',
80
- '-',
81
- '-',
66
+ "代码",
67
+ "-",
68
+ "名称",
69
+ "最新价",
70
+ "涨跌额",
71
+ "涨跌幅",
72
+ "买入",
73
+ "卖出",
74
+ "昨收",
75
+ "今开",
76
+ "最高",
77
+ "最低",
78
+ "成交量",
79
+ "成交额",
80
+ "-",
81
+ "-",
82
+ "-",
83
+ "-",
84
+ "-",
85
+ "-",
86
+ ]
87
+ big_df = big_df[
88
+ [
89
+ "代码",
90
+ "名称",
91
+ "最新价",
92
+ "涨跌额",
93
+ "涨跌幅",
94
+ "买入",
95
+ "卖出",
96
+ "昨收",
97
+ "今开",
98
+ "最高",
99
+ "最低",
100
+ "成交量",
101
+ "成交额",
102
+ ]
82
103
  ]
83
- big_df = big_df[[
84
- '代码',
85
- '名称',
86
- '最新价',
87
- '涨跌额',
88
- '涨跌幅',
89
- '买入',
90
- '卖出',
91
- '昨收',
92
- '今开',
93
- '最高',
94
- '最低',
95
- '成交量',
96
- '成交额',
97
- ]]
98
- big_df['买入'] = pd.to_numeric(big_df['买入'], errors="coerce")
99
- big_df['卖出'] = pd.to_numeric(big_df['卖出'], errors="coerce")
100
- big_df['昨收'] = pd.to_numeric(big_df['昨收'], errors="coerce")
101
- big_df['今开'] = pd.to_numeric(big_df['今开'], errors="coerce")
102
- big_df['最高'] = pd.to_numeric(big_df['最高'], errors="coerce")
103
- big_df['最低'] = pd.to_numeric(big_df['最低'], errors="coerce")
104
- big_df['最新价'] = pd.to_numeric(big_df['最新价'], errors="coerce")
104
+ big_df["买入"] = pd.to_numeric(big_df["买入"], errors="coerce")
105
+ big_df["卖出"] = pd.to_numeric(big_df["卖出"], errors="coerce")
106
+ big_df["昨收"] = pd.to_numeric(big_df["昨收"], errors="coerce")
107
+ big_df["今开"] = pd.to_numeric(big_df["今开"], errors="coerce")
108
+ big_df["最高"] = pd.to_numeric(big_df["最高"], errors="coerce")
109
+ big_df["最低"] = pd.to_numeric(big_df["最低"], errors="coerce")
110
+ big_df["最新价"] = pd.to_numeric(big_df["最新价"], errors="coerce")
105
111
  return big_df
106
112
 
107
113
 
@@ -126,15 +132,15 @@ def bond_zh_hs_daily(symbol: str = "sh010107") -> pd.DataFrame:
126
132
  ) # 执行 js 解密代码
127
133
  data_df = pd.DataFrame(dict_list)
128
134
  data_df["date"] = pd.to_datetime(data_df["date"], errors="coerce").dt.date
129
- data_df['open'] = pd.to_numeric(data_df['open'], errors="coerce")
130
- data_df['high'] = pd.to_numeric(data_df['high'], errors="coerce")
131
- data_df['low'] = pd.to_numeric(data_df['low'], errors="coerce")
132
- data_df['close'] = pd.to_numeric(data_df['close'], errors="coerce")
135
+ data_df["open"] = pd.to_numeric(data_df["open"], errors="coerce")
136
+ data_df["high"] = pd.to_numeric(data_df["high"], errors="coerce")
137
+ data_df["low"] = pd.to_numeric(data_df["low"], errors="coerce")
138
+ data_df["close"] = pd.to_numeric(data_df["close"], errors="coerce")
133
139
  return data_df
134
140
 
135
141
 
136
142
  if __name__ == "__main__":
137
- bond_zh_hs_spot_df = bond_zh_hs_spot()
143
+ bond_zh_hs_spot_df = bond_zh_hs_spot(start_page="1", end_page="5")
138
144
  print(bond_zh_hs_spot_df)
139
145
 
140
146
  bond_zh_hs_daily_df = bond_zh_hs_daily(symbol="sh010107")
File without changes
akshare/cal/rv.py ADDED
@@ -0,0 +1,170 @@
1
+ """
2
+ Yang-Zhang-s-Realized-Volatility-Automated-Estimation-in-Python
3
+ https://github.com/hugogobato/Yang-Zhang-s-Realized-Volatility-Automated-Estimation-in-Python
4
+ 论文地址:https://www.jstor.org/stable/10.1086/209650
5
+ """
6
+
7
+ import warnings
8
+
9
+ import numpy as np
10
+ import pandas as pd
11
+
12
+
13
+ def rv_from_stock_zh_a_hist_min_em(
14
+ symbol="000001",
15
+ start_date="2021-10-20 09:30:00",
16
+ end_date="2024-11-01 15:00:00",
17
+ period="1",
18
+ adjust="hfq",
19
+ ) -> pd.DataFrame:
20
+ """
21
+ 从东方财富网获取股票的分钟级历史行情数据,并进行数据清洗和格式化为计算 yz 已实现波动率所需的数据格式
22
+ https://quote.eastmoney.com/concept/sh603777.html?from=classic
23
+ :param symbol: 股票代码,如"000001"
24
+ :type symbol: str
25
+ :param start_date: 开始日期时间,格式"YYYY-MM-DD HH:MM:SS"
26
+ :type start_date: str
27
+ :param end_date: 结束日期时间,格式"YYYY-MM-DD HH:MM:SS"
28
+ :type end_date: str
29
+ :param period: 时间周期,可选{'1','5','15','30','60'}分钟
30
+ :type period: str
31
+ :param adjust: 复权方式,可选{'','qfq'(前复权),'hfq'(后复权)}
32
+ :type adjust: str
33
+ :return: 整理后的分钟行情数据,包含Date(索引),Open,High,Low,Close列
34
+ :rtype: pandas.DataFrame
35
+ """
36
+ from akshare.stock_feature.stock_hist_em import stock_zh_a_hist_min_em
37
+
38
+ temp_df = stock_zh_a_hist_min_em(
39
+ symbol=symbol,
40
+ start_date=start_date,
41
+ end_date=end_date,
42
+ period=period,
43
+ adjust=adjust,
44
+ )
45
+ temp_df.rename(
46
+ columns={
47
+ "时间": "Date",
48
+ "开盘": "Open",
49
+ "最高": "High",
50
+ "最低": "Low",
51
+ "收盘": "Close",
52
+ },
53
+ inplace=True,
54
+ )
55
+ temp_df = temp_df[temp_df["Open"] != 0]
56
+ temp_df["Date"] = pd.to_datetime(temp_df["Date"])
57
+ temp_df.set_index(keys="Date", inplace=True)
58
+ return temp_df
59
+
60
+
61
+ def rv_from_futures_zh_minute_sina(
62
+ symbol: str = "IF2008", period: str = "5"
63
+ ) -> pd.DataFrame:
64
+ """
65
+ 从新浪财经获取期货的分钟级历史行情数据,并进行数据清洗和格式化
66
+ https://vip.stock.finance.sina.com.cn/quotes_service/view/qihuohangqing.html#titlePos_3
67
+ :param symbol: 期货合约代码,如"IF2008"代表沪深300期货2020年8月合约
68
+ :type symbol: str
69
+ :param period: 时间周期,可选{'1','5','15','30','60'}分钟
70
+ :type period: str
71
+ :return: 整理后的分钟行情数据,包含Date(索引),Open,High,Low,Close列
72
+ :rtype: pandas.DataFrame
73
+ """
74
+ from akshare.futures.futures_zh_sina import futures_zh_minute_sina
75
+
76
+ temp_df = futures_zh_minute_sina(symbol=symbol, period=period)
77
+ temp_df.rename(
78
+ columns={
79
+ "datetime": "Date",
80
+ "open": "Open",
81
+ "high": "High",
82
+ "low": "Low",
83
+ "close": "Close",
84
+ },
85
+ inplace=True,
86
+ )
87
+ temp_df["Date"] = pd.to_datetime(temp_df["Date"])
88
+ temp_df.set_index(keys="Date", inplace=True)
89
+ return temp_df
90
+
91
+
92
+ def volatility_yz_rv(data: pd.DataFrame) -> pd.DataFrame:
93
+ """
94
+ 波动率-已实现波动率-Yang-Zhang 已实现波动率(Yang-Zhang Realized Volatility)
95
+ https://github.com/hugogobato/Yang-Zhang-s-Realized-Volatility-Automated-Estimation-in-Python
96
+ 论文地址:https://www.jstor.org/stable/10.1086/209650
97
+ 基于以下公式计算:
98
+ RV^2 = Vo + k*Vc + (1-k)*Vrs
99
+ 其中:
100
+ - Vo: 隔夜波动率, Vo = 1/(n-1)*sum(Oi-Obar)^2
101
+ Oi为标准化开盘价, Obar为标准化开盘价均值
102
+ - Vc: 收盘波动率, Vc = 1/(n-1)*sum(ci-Cbar)^2
103
+ ci为标准化收盘价, Cbar为标准化收盘价均值
104
+ - k: 权重系数, k = 0.34/(1.34+(n+1)/(n-1))
105
+ n为样本数量
106
+ - Vrs: Rogers-Satchell波动率代理, Vrs = ui(ui-ci)+di(di-ci)
107
+ ui = ln(Hi/Oi), ci = ln(Ci/Oi), di = ln(Li/Oi), oi = ln(Oi/Ci-1)
108
+ Hi/Li/Ci/Oi分别为最高价/最低价/收盘价/开盘价
109
+
110
+ :param data: 包含 OHLC(开高低收) 价格的 pandas.DataFrame
111
+ :type data: pandas.DataFrame
112
+ :return: 包含 Yang-Zhang 实现波动率的 pandas.DataFrame
113
+ :rtype: pandas.DataFrame
114
+
115
+ 要求输入数据包含以下列:
116
+ - Open: 开盘价
117
+ - High: 最高价
118
+ - Low: 最低价
119
+ - Close: 收盘价
120
+ # yang_zhang_rv formula is give as:
121
+ # RV^2 = Vo + k*Vc + (1-k)*Vrs
122
+ # where Vo = 1/(n-1)*sum(Oi-Obar)^2
123
+ # with oi = normalized opening price at time t and Obar = mean of normalized opening prices
124
+ # Vc = = 1/(n-1)*sum(ci-Cbar)^2
125
+ # with ci = normalized close price at time t and Cbar = mean of normalized close prices
126
+ # k = 0.34/(1.34+(n+1)/(n-1))
127
+ # with n = total number of days or time periods considered
128
+ # Vrs (Rogers & Satchell RV proxy) = ui(ui-ci)+di(di-ci)
129
+ # with ui = ln(Hi/Oi), ci = ln(Ci/Oi), di=(Li/Oi), oi = ln(Oi/Ci-1)
130
+ # where Hi = high price at time t and Li = low price at time t
131
+ """ ""
132
+ warnings.filterwarnings("ignore")
133
+
134
+ data["ui"] = np.log(np.divide(data["High"][1:], data["Open"][1:]))
135
+ data["ci"] = np.log(np.divide(data["Close"][1:], data["Open"][1:]))
136
+ data["di"] = np.log(np.divide(data["Low"][1:], data["Open"][1:]))
137
+ data["oi"] = np.log(np.divide(data["Open"][1:], data["Close"][: len(data) - 1]))
138
+ data = data[1:]
139
+ data["RS"] = data["ui"] * (data["ui"] - data["ci"]) + data["di"] * (
140
+ data["di"] - data["ci"]
141
+ )
142
+ rs_var = data["RS"].groupby(pd.Grouper(freq="1D")).mean().dropna()
143
+ vc_and_vo = data[["oi", "ci"]].groupby(pd.Grouper(freq="1D")).var().dropna()
144
+ n = int(len(data) / len(rs_var))
145
+ k = 0.34 / (1.34 + (n + 1) / (n - 1))
146
+ yang_zhang_rv = np.sqrt((1 - k) * rs_var + vc_and_vo["oi"] + vc_and_vo["ci"] * k)
147
+ yang_zhang_rv_df = pd.DataFrame(yang_zhang_rv)
148
+ yang_zhang_rv_df.rename(columns={0: "yz_rv"}, inplace=True)
149
+ yang_zhang_rv_df.reset_index(inplace=True)
150
+ yang_zhang_rv_df.columns = ["date", "rv"]
151
+ yang_zhang_rv_df["date"] = pd.to_datetime(
152
+ yang_zhang_rv_df["date"], errors="coerce"
153
+ ).dt.date
154
+ return yang_zhang_rv_df
155
+
156
+
157
+ if __name__ == "__main__":
158
+ futures_df = rv_from_futures_zh_minute_sina(symbol="IF2008", period="1")
159
+ volatility_yz_rv_df = volatility_yz_rv(data=futures_df)
160
+ print(volatility_yz_rv_df)
161
+
162
+ stock_df = rv_from_stock_zh_a_hist_min_em(
163
+ symbol="000001",
164
+ start_date="2021-10-20 09:30:00",
165
+ end_date="2024-11-01 15:00:00",
166
+ period="5",
167
+ adjust="",
168
+ )
169
+ volatility_yz_rv_df = volatility_yz_rv(data=stock_df)
170
+ print(volatility_yz_rv_df)
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2024/1/20 23:30
4
+ Date: 2024/8/28 15:20
5
5
  Desc: 世界各大城市生活成本数据
6
6
  https://expatistan.com/cost-of-living/index
7
7
  """
8
+
8
9
  from io import StringIO
9
10
 
10
11
  import pandas as pd
@@ -20,14 +21,14 @@ def _get_region() -> dict:
20
21
  """
21
22
  url = "https://www.expatistan.com/cost-of-living/index"
22
23
  r = requests.get(url)
23
- soup = BeautifulSoup(r.text, "lxml")
24
+ soup = BeautifulSoup(r.text, features="lxml")
24
25
  half_url_list = [
25
26
  item["href"]
26
- for item in soup.find("ul", attrs={"class": "regions"}).find_all("a")
27
+ for item in soup.find(name="ul", attrs={"class": "regions"}).find_all("a")
27
28
  ]
28
29
  name_list = [
29
30
  item["href"].split("/")[-1]
30
- for item in soup.find("ul", attrs={"class": "regions"}).find_all("a")
31
+ for item in soup.find(name="ul", attrs={"class": "regions"}).find_all("a")
31
32
  ]
32
33
  name_url_dict = dict(zip(name_list, half_url_list))
33
34
  name_url_dict["world"] = "/cost-of-living/index"
@@ -38,7 +39,8 @@ def cost_living(symbol: str = "world") -> pd.DataFrame:
38
39
  """
39
40
  国家或地区生活成本数据
40
41
  https://expatistan.com/cost-of-living/index
41
- :param symbol: choice of {"europe", "north-america", "latin-america", "asia", "middle-east", "africa", "oceania", "world"}
42
+ :param symbol: choice of {"europe", "north-america", "latin-america",
43
+ "asia", "middle-east", "africa", "oceania", "world"}
42
44
  :type symbol: str
43
45
  :return: 国家或地区生活成本数据
44
46
  :rtype: pandas.DataFrame
@@ -1,10 +1,11 @@
1
1
  # -*- coding:utf-8 -*-
2
2
  # !/usr/bin/env python
3
3
  """
4
- Date: 2023/9/17 17:08
4
+ Date: 2024/4/29 17:00
5
5
  Desc: 人民币汇率中间价
6
6
  https://www.safe.gov.cn/safe/rmbhlzjj/index.html
7
7
  """
8
+
8
9
  import re
9
10
  from datetime import datetime
10
11
  from io import StringIO
@@ -24,11 +25,11 @@ def currency_boc_safe() -> pd.DataFrame:
24
25
  url = "https://www.safe.gov.cn/safe/2020/1218/17833.html"
25
26
  r = requests.get(url)
26
27
  r.encoding = "utf8"
27
- soup = BeautifulSoup(r.text, "lxml")
28
- content = soup.find("a", string=re.compile("人民币汇率"))["href"]
28
+ soup = BeautifulSoup(r.text, features="lxml")
29
+ content = soup.find(name="a", string=re.compile("人民币汇率"))["href"]
29
30
  url = f"https://www.safe.gov.cn{content}"
30
31
  temp_df = pd.read_excel(url)
31
- temp_df.sort_values(["日期"], inplace=True)
32
+ temp_df.sort_values(by=["日期"], inplace=True)
32
33
  temp_df.reset_index(inplace=True, drop=True)
33
34
  start_date = (
34
35
  (pd.Timestamp(temp_df["日期"].tolist()[-1]) + pd.Timedelta(days=1))
@@ -44,9 +45,9 @@ def currency_boc_safe() -> pd.DataFrame:
44
45
  }
45
46
  r = requests.post(url, data=payload)
46
47
  current_temp_df = pd.read_html(StringIO(r.text))[-1]
47
- current_temp_df.sort_values(["日期"], inplace=True)
48
+ current_temp_df.sort_values(by=["日期"], inplace=True)
48
49
  current_temp_df.reset_index(inplace=True, drop=True)
49
- big_df = pd.concat([temp_df, current_temp_df], ignore_index=True)
50
+ big_df = pd.concat(objs=[temp_df, current_temp_df], ignore_index=True)
50
51
  column_name_list = big_df.columns[1:]
51
52
  for item in column_name_list:
52
53
  big_df[item] = pd.to_numeric(big_df[item], errors="coerce")
akshare/data/cninfo.js CHANGED
@@ -5998,4 +5998,19 @@ function my_decode(data) {
5998
5998
  }
5999
5999
  );
6000
6000
  return encrypted.toString(CryptoJS.enc.Utf8);
6001
+ }
6002
+
6003
+ function new_my_decode(data) {
6004
+ let key = CryptoJS.enc.Utf8.parse('bieyanjiulexixishuibatoufameill1'); // 密钥需要是32字节,这里可能需要调整
6005
+ let iv = CryptoJS.enc.Utf8.parse('nengnongchulainbl1'); // 向量通常是16字节
6006
+ let decrypted = CryptoJS.AES.decrypt(
6007
+ data,
6008
+ key,
6009
+ {
6010
+ iv: iv,
6011
+ mode: CryptoJS.mode.CBC,
6012
+ padding: CryptoJS.pad.Pkcs7
6013
+ }
6014
+ );
6015
+ return decrypted.toString(CryptoJS.enc.Utf8);
6001
6016
  }