akshare 1.12.95__py3-none-any.whl → 1.15.72__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 (240) hide show
  1. akshare/__init__.py +446 -139
  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_convert.py +40 -16
  10. akshare/bond/bond_info_cm.py +28 -8
  11. akshare/bond/bond_issue_cninfo.py +73 -30
  12. akshare/bond/{bond_zh_cov_sina.py → bond_zh_cov.py} +41 -17
  13. akshare/bond/bond_zh_sina.py +57 -51
  14. akshare/cal/__init__.py +0 -0
  15. akshare/cal/rv.py +170 -0
  16. akshare/cost/cost_living.py +7 -5
  17. akshare/currency/currency_safe.py +7 -6
  18. akshare/data/cninfo.js +15 -0
  19. akshare/datasets.py +10 -21
  20. akshare/economic/macro_bank.py +95 -653
  21. akshare/economic/macro_china.py +772 -1024
  22. akshare/economic/macro_china_hk.py +65 -243
  23. akshare/economic/macro_china_nbs.py +24 -7
  24. akshare/economic/macro_constitute.py +17 -12
  25. akshare/economic/macro_euro.py +13 -6
  26. akshare/economic/macro_finance_ths.py +133 -0
  27. akshare/economic/macro_info_ws.py +100 -0
  28. akshare/economic/macro_japan.py +5 -4
  29. akshare/economic/macro_other.py +12 -9
  30. akshare/economic/macro_usa.py +376 -1940
  31. akshare/economic/marco_cnbs.py +11 -6
  32. akshare/energy/energy_carbon.py +94 -125
  33. akshare/event/migration.py +3 -2
  34. akshare/exceptions.py +43 -0
  35. akshare/file_fold/calendar.json +245 -2
  36. akshare/fortune/fortune_500.py +15 -48
  37. akshare/fund/fund_amac.py +157 -75
  38. akshare/fund/fund_em.py +191 -184
  39. akshare/fund/fund_etf_em.py +20 -19
  40. akshare/fund/fund_etf_sina.py +71 -23
  41. akshare/fund/fund_etf_ths.py +93 -0
  42. akshare/fund/fund_fee_em.py +98 -0
  43. akshare/fund/fund_lof_em.py +10 -8
  44. akshare/fund/fund_portfolio_em.py +60 -50
  45. akshare/fund/fund_rank_em.py +91 -82
  46. akshare/fund/fund_report_cninfo.py +63 -48
  47. akshare/fund/fund_scale_sina.py +20 -10
  48. akshare/fund/fund_xq.py +139 -109
  49. akshare/futures/cons.py +8 -31
  50. akshare/futures/cot.py +185 -137
  51. akshare/futures/futures_basis.py +97 -32
  52. akshare/futures/futures_comm_ctp.py +37 -0
  53. akshare/futures/futures_comm_qihuo.py +74 -45
  54. akshare/futures/futures_daily_bar.py +121 -184
  55. akshare/futures/futures_hf_em.py +66 -61
  56. akshare/futures/futures_hq_sina.py +79 -61
  57. akshare/futures/futures_index_ccidx.py +6 -3
  58. akshare/futures/futures_inventory_99.py +61 -272
  59. akshare/futures/futures_news_shmet.py +4 -2
  60. akshare/futures/futures_roll_yield.py +12 -25
  61. akshare/futures/futures_spot_stock_em.py +19 -13
  62. akshare/futures/futures_stock_js.py +14 -12
  63. akshare/futures/futures_to_spot.py +38 -33
  64. akshare/futures/futures_warehouse_receipt.py +75 -71
  65. akshare/futures/futures_zh_sina.py +73 -50
  66. akshare/futures/symbol_var.py +18 -13
  67. akshare/futures_derivative/futures_contract_info_czce.py +60 -52
  68. akshare/futures_derivative/futures_contract_info_ine.py +43 -34
  69. akshare/futures_derivative/futures_contract_info_shfe.py +46 -35
  70. akshare/futures_derivative/futures_cot_sina.py +26 -19
  71. akshare/futures_derivative/futures_spot_sys.py +21 -8
  72. akshare/fx/currency_investing.py +19 -285
  73. akshare/index/index_cflp.py +29 -26
  74. akshare/index/index_cni.py +86 -88
  75. akshare/index/index_cons.py +26 -10
  76. akshare/index/index_cx.py +248 -47
  77. akshare/index/index_drewry.py +17 -16
  78. akshare/index/index_hog.py +27 -26
  79. akshare/index/index_option_qvix.py +329 -0
  80. akshare/index/index_research_fund_sw.py +134 -0
  81. akshare/index/{index_sw_research.py → index_research_sw.py} +122 -58
  82. akshare/index/index_spot.py +9 -5
  83. akshare/index/index_stock_hk.py +35 -16
  84. akshare/index/index_stock_us_sina.py +1 -1
  85. akshare/index/index_stock_zh.py +180 -89
  86. akshare/index/index_stock_zh_csindex.py +15 -369
  87. akshare/index/index_sw.py +62 -34
  88. akshare/index/index_yw.py +46 -23
  89. akshare/index/index_zh_a_scope.py +48 -0
  90. akshare/index/index_zh_em.py +17 -14
  91. akshare/interest_rate/interbank_rate_em.py +14 -9
  92. akshare/movie/artist_yien.py +32 -5
  93. akshare/movie/movie_yien.py +92 -18
  94. akshare/movie/video_yien.py +28 -5
  95. akshare/news/news_baidu.py +78 -44
  96. akshare/news/news_cctv.py +38 -38
  97. akshare/news/news_stock.py +6 -3
  98. akshare/nlp/nlp_interface.py +7 -8
  99. akshare/option/cons.py +11 -11
  100. akshare/option/option_comm_qihuo.py +86 -0
  101. akshare/option/option_commodity.py +178 -51
  102. akshare/option/option_daily_stats_sse_szse.py +146 -0
  103. akshare/option/option_em.py +147 -138
  104. akshare/option/option_finance_sina.py +160 -137
  105. akshare/option/option_lhb_em.py +62 -56
  106. akshare/option/option_risk_indicator_sse.py +17 -14
  107. akshare/other/other_car_cpca.py +934 -0
  108. akshare/other/{other_car.py → other_car_gasgoo.py} +15 -54
  109. akshare/qdii/__init__.py +0 -0
  110. akshare/qdii/qdii_jsl.py +233 -0
  111. akshare/request.py +117 -0
  112. akshare/spot/spot_hog_soozhu.py +232 -0
  113. akshare/spot/spot_price_qh.py +121 -0
  114. akshare/spot/spot_sge.py +63 -10
  115. akshare/stock/stock_allotment_cninfo.py +10 -9
  116. akshare/stock/stock_ask_bid_em.py +27 -3
  117. akshare/stock/stock_board_concept_em.py +23 -14
  118. akshare/stock/stock_board_industry_em.py +40 -34
  119. akshare/stock/stock_cg_equity_mortgage.py +15 -11
  120. akshare/stock/stock_cg_guarantee.py +41 -51
  121. akshare/stock/stock_cg_lawsuit.py +36 -35
  122. akshare/stock/stock_dividend_cninfo.py +12 -6
  123. akshare/stock/stock_dzjy_em.py +347 -260
  124. akshare/stock/stock_fund_em.py +332 -84
  125. akshare/stock/stock_hk_famous.py +108 -0
  126. akshare/stock/stock_hk_sina.py +8 -7
  127. akshare/stock/stock_hold_control_cninfo.py +100 -15
  128. akshare/stock/stock_hold_control_em.py +4 -3
  129. akshare/stock/stock_hold_num_cninfo.py +18 -12
  130. akshare/stock/stock_hot_rank_em.py +2 -1
  131. akshare/stock/stock_hot_search_baidu.py +5 -2
  132. akshare/stock/stock_industry_cninfo.py +24 -18
  133. akshare/stock/stock_industry_pe_cninfo.py +45 -31
  134. akshare/stock/stock_industry_sw.py +9 -10
  135. akshare/stock/stock_info.py +25 -15
  136. akshare/stock/stock_info_em.py +5 -2
  137. akshare/stock/stock_intraday_em.py +5 -2
  138. akshare/stock/stock_intraday_sina.py +22 -18
  139. akshare/stock/stock_ipo_summary_cninfo.py +25 -10
  140. akshare/stock/stock_new_cninfo.py +32 -19
  141. akshare/stock/stock_news_cx.py +39 -0
  142. akshare/stock/stock_profile_cninfo.py +9 -8
  143. akshare/stock/stock_rank_forecast.py +8 -6
  144. akshare/stock/stock_share_changes_cninfo.py +18 -14
  145. akshare/stock/stock_share_hold.py +24 -19
  146. akshare/stock/stock_summary.py +54 -26
  147. akshare/stock/stock_us_famous.py +15 -6
  148. akshare/stock/stock_us_pink.py +7 -5
  149. akshare/stock/stock_us_sina.py +15 -12
  150. akshare/stock/stock_xq.py +38 -12
  151. akshare/stock/stock_zh_a_sina.py +53 -78
  152. akshare/stock/stock_zh_b_sina.py +32 -55
  153. akshare/stock/stock_zh_kcb_report.py +11 -9
  154. akshare/stock/stock_zh_kcb_sina.py +67 -64
  155. akshare/stock_feature/stock_a_below_net_asset_statistics.py +5 -2
  156. akshare/stock_feature/stock_a_high_low.py +5 -2
  157. akshare/stock_feature/stock_a_indicator.py +12 -9
  158. akshare/stock_feature/stock_a_pe_and_pb.py +27 -6
  159. akshare/stock_feature/stock_account_em.py +58 -40
  160. akshare/stock_feature/stock_analyst_em.py +36 -27
  161. akshare/stock_feature/stock_board_industry_ths.py +136 -400
  162. akshare/stock_feature/stock_comment_em.py +118 -85
  163. akshare/stock_feature/stock_concept_futu.py +183 -0
  164. akshare/stock_feature/stock_cyq_em.py +58 -54
  165. akshare/stock_feature/stock_disclosure_cninfo.py +147 -102
  166. akshare/stock_feature/stock_esg_sina.py +216 -11
  167. akshare/stock_feature/stock_fhps_em.py +60 -25
  168. akshare/stock_feature/stock_fhps_ths.py +25 -6
  169. akshare/stock_feature/stock_fund_flow.py +38 -25
  170. akshare/stock_feature/stock_gdfx_em.py +180 -95
  171. akshare/stock_feature/stock_gdhs.py +73 -49
  172. akshare/stock_feature/stock_gpzy_em.py +78 -46
  173. akshare/stock_feature/stock_hist_em.py +164 -111
  174. akshare/stock_feature/stock_hk_valuation_baidu.py +20 -8
  175. akshare/stock_feature/stock_hsgt_em.py +184 -452
  176. akshare/stock_feature/stock_info.py +52 -29
  177. akshare/stock_feature/stock_inner_trade_xq.py +39 -31
  178. akshare/stock_feature/stock_irm_cninfo.py +32 -9
  179. akshare/stock_feature/stock_jgdy_em.py +41 -38
  180. akshare/stock_feature/stock_lh_yybpm.py +36 -37
  181. akshare/stock_feature/stock_lhb_em.py +135 -71
  182. akshare/stock_feature/stock_lhb_sina.py +93 -46
  183. akshare/stock_feature/stock_margin_em.py +102 -0
  184. akshare/stock_feature/{stock_sse_margin.py → stock_margin_sse.py} +21 -15
  185. akshare/stock_feature/{stock_szse_margin.py → stock_margin_szse.py} +23 -19
  186. akshare/stock_feature/stock_market_legu.py +13 -8
  187. akshare/stock_feature/stock_pankou_em.py +72 -34
  188. akshare/stock_feature/stock_report_em.py +244 -54
  189. akshare/stock_feature/stock_research_report_em.py +48 -19
  190. akshare/stock_feature/stock_sns_sseinfo.py +15 -12
  191. akshare/stock_feature/stock_sy_em.py +86 -33
  192. akshare/stock_feature/stock_technology_ths.py +152 -120
  193. akshare/stock_feature/stock_tfp_em.py +35 -13
  194. akshare/stock_feature/stock_three_report_em.py +119 -77
  195. akshare/stock_feature/stock_ttm_lyr.py +4 -7
  196. akshare/stock_feature/stock_value_em.py +83 -0
  197. akshare/stock_feature/stock_wencai.py +21 -9
  198. akshare/stock_feature/stock_yjyg_em.py +63 -28
  199. akshare/stock_feature/stock_zf_pg.py +61 -38
  200. akshare/stock_feature/stock_zh_valuation_baidu.py +3 -2
  201. akshare/stock_feature/stock_ztb_em.py +62 -40
  202. akshare/stock_fundamental/stock_finance.py +150 -58
  203. akshare/stock_fundamental/stock_finance_ths.py +116 -31
  204. akshare/stock_fundamental/stock_mda_ym.py +5 -3
  205. akshare/stock_fundamental/stock_notice.py +29 -15
  206. akshare/stock_fundamental/stock_profit_forecast_em.py +31 -13
  207. akshare/stock_fundamental/stock_profit_forecast_ths.py +19 -10
  208. akshare/stock_fundamental/stock_register_em.py +448 -0
  209. akshare/stock_fundamental/stock_restricted_em.py +79 -32
  210. akshare/stock_fundamental/stock_zygc.py +10 -8
  211. akshare/stock_fundamental/stock_zyjs_ths.py +5 -3
  212. akshare/tool/trade_date_hist.py +4 -3
  213. akshare/utils/cons.py +10 -0
  214. akshare/utils/context.py +43 -0
  215. akshare/utils/demjson.py +2 -2
  216. akshare/utils/func.py +26 -0
  217. akshare/utils/tqdm.py +13 -3
  218. {akshare-1.12.95.dist-info → akshare-1.15.72.dist-info}/METADATA +52 -69
  219. akshare-1.15.72.dist-info/RECORD +385 -0
  220. {akshare-1.12.95.dist-info → akshare-1.15.72.dist-info}/WHEEL +1 -1
  221. tests/test_func.py +3 -5
  222. akshare/bond/bond_futures.py +0 -50
  223. akshare/bond/bond_investing.py +0 -139
  224. akshare/crypto/crypto_hist_investing.py +0 -249
  225. akshare/fortune/fortune_it_juzi.py +0 -123
  226. akshare/futures/futures_international.py +0 -170
  227. akshare/futures/futures_news_baidu.py +0 -54
  228. akshare/futures/inventory_data.py +0 -100
  229. akshare/futures_derivative/futures_index_price_nh.py +0 -61
  230. akshare/futures_derivative/futures_index_return_nh.py +0 -47
  231. akshare/futures_derivative/futures_index_volatility_nh.py +0 -51
  232. akshare/futures_derivative/futures_other_index_nh.py +0 -145
  233. akshare/index/index_fear_greed_funddb.py +0 -71
  234. akshare/index/index_investing.py +0 -232
  235. akshare/sport/sport_olympic_winter.py +0 -39
  236. akshare/stock_feature/stock_board_concept_ths.py +0 -422
  237. akshare/stock_fundamental/stock_register.py +0 -292
  238. akshare-1.12.95.dist-info/RECORD +0 -374
  239. {akshare-1.12.95.dist-info → akshare-1.15.72.dist-info}/LICENSE +0 -0
  240. {akshare-1.12.95.dist-info → akshare-1.15.72.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,448 @@
1
+ # -*- coding:utf-8 -*-
2
+ # !/usr/bin/env python
3
+ """
4
+ Date: 2024/6/15 20:20
5
+ Desc: 东方财富网-数据中心-新股数据-注册制审核
6
+ https://data.eastmoney.com/kcb/?type=nsb
7
+ """
8
+
9
+ import pandas as pd
10
+ import requests
11
+
12
+ from akshare.utils.cons import headers
13
+ from akshare.utils.tqdm import get_tqdm
14
+
15
+
16
+ def stock_register_kcb() -> pd.DataFrame:
17
+ """
18
+ 东方财富网-数据中心-新股数据-IPO审核信息-科创板
19
+ https://data.eastmoney.com/xg/ipo/
20
+ :return: 科创板注册制审核结果
21
+ :rtype: pandas.DataFrame
22
+ """
23
+ url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
24
+ params = {
25
+ "sortColumns": "UPDATE_DATE,ORG_CODE",
26
+ "sortTypes": "-1,-1",
27
+ "pageSize": "500",
28
+ "pageNumber": "1",
29
+ "reportName": "RPT_IPO_INFOALLNEW",
30
+ "columns": "SECURITY_CODE,STATE,REG_ADDRESS,INFO_CODE,CSRC_INDUSTRY,ACCEPT_DATE,DECLARE_ORG,"
31
+ "PREDICT_LISTING_MARKET,LAW_FIRM,ACCOUNT_FIRM,ORG_CODE,UPDATE_DATE,RECOMMEND_ORG,IS_REGISTRATION",
32
+ "source": "WEB",
33
+ "client": "WEB",
34
+ "filter": '(PREDICT_LISTING_MARKET="科创板")',
35
+ }
36
+ r = requests.get(url, params=params, headers=headers)
37
+ data_json = r.json()
38
+ page_num = data_json["result"]["pages"]
39
+ big_df = pd.DataFrame()
40
+ tqdm = get_tqdm()
41
+ for page in tqdm(range(1, page_num + 1), leave=False):
42
+ params.update({"pageNumber": page})
43
+ r = requests.get(url, params=params, headers=headers)
44
+ data_json = r.json()
45
+ temp_df = pd.DataFrame(data_json["result"]["data"])
46
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
47
+ big_df.reset_index(inplace=True)
48
+ big_df["index"] = big_df.index + 1
49
+ big_df.rename(
50
+ columns={
51
+ "index": "序号",
52
+ "DECLARE_ORG": "企业名称",
53
+ "STATE": "最新状态",
54
+ "REG_ADDRESS": "注册地",
55
+ "CSRC_INDUSTRY": "行业",
56
+ "RECOMMEND_ORG": "保荐机构",
57
+ "LAW_FIRM": "律师事务所",
58
+ "ACCOUNT_FIRM": "会计师事务所",
59
+ "UPDATE_DATE": "更新日期",
60
+ "ACCEPT_DATE": "受理日期",
61
+ "PREDICT_LISTING_MARKET": "拟上市地点",
62
+ "INFO_CODE": "招股说明书",
63
+ },
64
+ inplace=True,
65
+ )
66
+ big_df["招股说明书"] = [
67
+ f"https://pdf.dfcfw.com/pdf/H2_{item}_1.pdf" for item in big_df["招股说明书"]
68
+ ]
69
+ big_df = big_df[
70
+ [
71
+ "序号",
72
+ "企业名称",
73
+ "最新状态",
74
+ "注册地",
75
+ "行业",
76
+ "保荐机构",
77
+ "律师事务所",
78
+ "会计师事务所",
79
+ "更新日期",
80
+ "受理日期",
81
+ "拟上市地点",
82
+ "招股说明书",
83
+ ]
84
+ ]
85
+ big_df["更新日期"] = pd.to_datetime(big_df["更新日期"], errors="coerce").dt.date
86
+ big_df["受理日期"] = pd.to_datetime(big_df["受理日期"], errors="coerce").dt.date
87
+ return big_df
88
+
89
+
90
+ def stock_register_cyb() -> pd.DataFrame:
91
+ """
92
+ 东方财富网-数据中心-新股数据-IPO审核信息-创业板
93
+ https://data.eastmoney.com/xg/ipo/
94
+ :return: 创业板注册制审核结果
95
+ :rtype: pandas.DataFrame
96
+ """
97
+ url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
98
+ params = {
99
+ "sortColumns": "UPDATE_DATE,ORG_CODE",
100
+ "sortTypes": "-1,-1",
101
+ "pageSize": "500",
102
+ "pageNumber": "1",
103
+ "reportName": "RPT_IPO_INFOALLNEW",
104
+ "columns": "SECURITY_CODE,STATE,REG_ADDRESS,INFO_CODE,CSRC_INDUSTRY,ACCEPT_DATE,DECLARE_ORG,"
105
+ "PREDICT_LISTING_MARKET,LAW_FIRM,ACCOUNT_FIRM,ORG_CODE,UPDATE_DATE,RECOMMEND_ORG,IS_REGISTRATION",
106
+ "source": "WEB",
107
+ "client": "WEB",
108
+ "filter": '(PREDICT_LISTING_MARKET="创业板")',
109
+ }
110
+ r = requests.get(url, params=params, headers=headers)
111
+ data_json = r.json()
112
+ page_num = data_json["result"]["pages"]
113
+ big_df = pd.DataFrame()
114
+ tqdm = get_tqdm()
115
+ for page in tqdm(range(1, page_num + 1), leave=False):
116
+ params.update({"pageNumber": page})
117
+ r = requests.get(url, params=params, headers=headers)
118
+ data_json = r.json()
119
+ temp_df = pd.DataFrame(data_json["result"]["data"])
120
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
121
+ big_df.reset_index(inplace=True)
122
+ big_df["index"] = big_df.index + 1
123
+ big_df.rename(
124
+ columns={
125
+ "index": "序号",
126
+ "DECLARE_ORG": "企业名称",
127
+ "STATE": "最新状态",
128
+ "REG_ADDRESS": "注册地",
129
+ "CSRC_INDUSTRY": "行业",
130
+ "RECOMMEND_ORG": "保荐机构",
131
+ "LAW_FIRM": "律师事务所",
132
+ "ACCOUNT_FIRM": "会计师事务所",
133
+ "UPDATE_DATE": "更新日期",
134
+ "ACCEPT_DATE": "受理日期",
135
+ "PREDICT_LISTING_MARKET": "拟上市地点",
136
+ "INFO_CODE": "招股说明书",
137
+ },
138
+ inplace=True,
139
+ )
140
+ big_df["招股说明书"] = [
141
+ f"https://pdf.dfcfw.com/pdf/H2_{item}_1.pdf" for item in big_df["招股说明书"]
142
+ ]
143
+ big_df = big_df[
144
+ [
145
+ "序号",
146
+ "企业名称",
147
+ "最新状态",
148
+ "注册地",
149
+ "行业",
150
+ "保荐机构",
151
+ "律师事务所",
152
+ "会计师事务所",
153
+ "更新日期",
154
+ "受理日期",
155
+ "拟上市地点",
156
+ "招股说明书",
157
+ ]
158
+ ]
159
+ big_df["更新日期"] = pd.to_datetime(big_df["更新日期"], errors="coerce").dt.date
160
+ big_df["受理日期"] = pd.to_datetime(big_df["受理日期"], errors="coerce").dt.date
161
+ return big_df
162
+
163
+
164
+ def stock_register_bj() -> pd.DataFrame:
165
+ """
166
+ 东方财富网-数据中心-新股数据-IPO审核信息-北交所
167
+ https://data.eastmoney.com/xg/ipo/
168
+ :return: 北交所
169
+ :rtype: pandas.DataFrame
170
+ """
171
+ url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
172
+ params = {
173
+ "sortColumns": "UPDATE_DATE,ORG_CODE",
174
+ "sortTypes": "-1,-1",
175
+ "pageSize": "500",
176
+ "pageNumber": "1",
177
+ "reportName": "RPT_IPO_INFOALLNEW",
178
+ "columns": "SECURITY_CODE,STATE,REG_ADDRESS,INFO_CODE,CSRC_INDUSTRY,ACCEPT_DATE,DECLARE_ORG,"
179
+ "PREDICT_LISTING_MARKET,LAW_FIRM,ACCOUNT_FIRM,ORG_CODE,UPDATE_DATE,RECOMMEND_ORG,IS_REGISTRATION",
180
+ "source": "WEB",
181
+ "client": "WEB",
182
+ "filter": '(PREDICT_LISTING_MARKET="北交所")',
183
+ }
184
+ r = requests.get(url, params=params, headers=headers)
185
+ data_json = r.json()
186
+ page_num = data_json["result"]["pages"]
187
+ big_df = pd.DataFrame()
188
+ tqdm = get_tqdm()
189
+ for page in tqdm(range(1, page_num + 1), leave=False):
190
+ params.update({"pageNumber": page})
191
+ r = requests.get(url, params=params, headers=headers)
192
+ data_json = r.json()
193
+ temp_df = pd.DataFrame(data_json["result"]["data"])
194
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
195
+ big_df.reset_index(inplace=True)
196
+ big_df["index"] = big_df.index + 1
197
+ big_df.rename(
198
+ columns={
199
+ "index": "序号",
200
+ "DECLARE_ORG": "企业名称",
201
+ "STATE": "最新状态",
202
+ "REG_ADDRESS": "注册地",
203
+ "CSRC_INDUSTRY": "行业",
204
+ "RECOMMEND_ORG": "保荐机构",
205
+ "LAW_FIRM": "律师事务所",
206
+ "ACCOUNT_FIRM": "会计师事务所",
207
+ "UPDATE_DATE": "更新日期",
208
+ "ACCEPT_DATE": "受理日期",
209
+ "PREDICT_LISTING_MARKET": "拟上市地点",
210
+ "INFO_CODE": "招股说明书",
211
+ },
212
+ inplace=True,
213
+ )
214
+ big_df["招股说明书"] = [
215
+ f"https://pdf.dfcfw.com/pdf/H2_{item}_1.pdf" for item in big_df["招股说明书"]
216
+ ]
217
+ big_df = big_df[
218
+ [
219
+ "序号",
220
+ "企业名称",
221
+ "最新状态",
222
+ "注册地",
223
+ "行业",
224
+ "保荐机构",
225
+ "律师事务所",
226
+ "会计师事务所",
227
+ "更新日期",
228
+ "受理日期",
229
+ "拟上市地点",
230
+ "招股说明书",
231
+ ]
232
+ ]
233
+ big_df["更新日期"] = pd.to_datetime(big_df["更新日期"], errors="coerce").dt.date
234
+ big_df["受理日期"] = pd.to_datetime(big_df["受理日期"], errors="coerce").dt.date
235
+ return big_df
236
+
237
+
238
+ def stock_register_sh() -> pd.DataFrame:
239
+ """
240
+ 东方财富网-数据中心-新股数据-IPO审核信息-上海主板
241
+ https://data.eastmoney.com/xg/ipo/
242
+ :return: 上海主板
243
+ :rtype: pandas.DataFrame
244
+ """
245
+ url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
246
+ params = {
247
+ "sortColumns": "UPDATE_DATE,ORG_CODE",
248
+ "sortTypes": "-1,-1",
249
+ "pageSize": "500",
250
+ "pageNumber": "1",
251
+ "reportName": "RPT_IPO_INFOALLNEW",
252
+ "columns": "SECURITY_CODE,STATE,REG_ADDRESS,INFO_CODE,CSRC_INDUSTRY,ACCEPT_DATE,DECLARE_ORG,"
253
+ "PREDICT_LISTING_MARKET,LAW_FIRM,ACCOUNT_FIRM,ORG_CODE,UPDATE_DATE,RECOMMEND_ORG,IS_REGISTRATION",
254
+ "source": "WEB",
255
+ "client": "WEB",
256
+ "filter": '(PREDICT_LISTING_MARKET="沪主板")',
257
+ }
258
+ r = requests.get(url, params=params, headers=headers)
259
+ data_json = r.json()
260
+ page_num = data_json["result"]["pages"]
261
+ big_df = pd.DataFrame()
262
+ tqdm = get_tqdm()
263
+ for page in tqdm(range(1, page_num + 1), leave=False):
264
+ params.update({"pageNumber": page})
265
+ r = requests.get(url, params=params, headers=headers)
266
+ data_json = r.json()
267
+ temp_df = pd.DataFrame(data_json["result"]["data"])
268
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
269
+ big_df.reset_index(inplace=True)
270
+ big_df["index"] = big_df.index + 1
271
+ big_df.rename(
272
+ columns={
273
+ "index": "序号",
274
+ "DECLARE_ORG": "企业名称",
275
+ "STATE": "最新状态",
276
+ "REG_ADDRESS": "注册地",
277
+ "CSRC_INDUSTRY": "行业",
278
+ "RECOMMEND_ORG": "保荐机构",
279
+ "LAW_FIRM": "律师事务所",
280
+ "ACCOUNT_FIRM": "会计师事务所",
281
+ "UPDATE_DATE": "更新日期",
282
+ "ACCEPT_DATE": "受理日期",
283
+ "PREDICT_LISTING_MARKET": "拟上市地点",
284
+ "INFO_CODE": "招股说明书",
285
+ },
286
+ inplace=True,
287
+ )
288
+ big_df["招股说明书"] = [
289
+ f"https://pdf.dfcfw.com/pdf/H2_{item}_1.pdf" for item in big_df["招股说明书"]
290
+ ]
291
+ big_df = big_df[
292
+ [
293
+ "序号",
294
+ "企业名称",
295
+ "最新状态",
296
+ "注册地",
297
+ "行业",
298
+ "保荐机构",
299
+ "律师事务所",
300
+ "会计师事务所",
301
+ "更新日期",
302
+ "受理日期",
303
+ "拟上市地点",
304
+ "招股说明书",
305
+ ]
306
+ ]
307
+ big_df["更新日期"] = pd.to_datetime(big_df["更新日期"], errors="coerce").dt.date
308
+ big_df["受理日期"] = pd.to_datetime(big_df["受理日期"], errors="coerce").dt.date
309
+ return big_df
310
+
311
+
312
+ def stock_register_sz() -> pd.DataFrame:
313
+ """
314
+ 东方财富网-数据中心-新股数据-IPO审核信息-深圳主板
315
+ https://data.eastmoney.com/xg/ipo/
316
+ :return: 深圳主板
317
+ :rtype: pandas.DataFrame
318
+ """
319
+ url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
320
+ params = {
321
+ "sortColumns": "UPDATE_DATE,ORG_CODE",
322
+ "sortTypes": "-1,-1",
323
+ "pageSize": "500",
324
+ "pageNumber": "1",
325
+ "reportName": "RPT_IPO_INFOALLNEW",
326
+ "columns": "SECURITY_CODE,STATE,REG_ADDRESS,INFO_CODE,CSRC_INDUSTRY,ACCEPT_DATE,DECLARE_ORG,"
327
+ "PREDICT_LISTING_MARKET,LAW_FIRM,ACCOUNT_FIRM,ORG_CODE,UPDATE_DATE,RECOMMEND_ORG,IS_REGISTRATION",
328
+ "source": "WEB",
329
+ "client": "WEB",
330
+ "filter": '(PREDICT_LISTING_MARKET="深主板")',
331
+ }
332
+ r = requests.get(url, params=params, headers=headers)
333
+ data_json = r.json()
334
+ page_num = data_json["result"]["pages"]
335
+ big_df = pd.DataFrame()
336
+ tqdm = get_tqdm()
337
+ for page in tqdm(range(1, page_num + 1), leave=False):
338
+ params.update({"pageNumber": page})
339
+ r = requests.get(url, params=params, headers=headers)
340
+ data_json = r.json()
341
+ temp_df = pd.DataFrame(data_json["result"]["data"])
342
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
343
+ big_df.reset_index(inplace=True)
344
+ big_df["index"] = big_df.index + 1
345
+ big_df.rename(
346
+ columns={
347
+ "index": "序号",
348
+ "DECLARE_ORG": "企业名称",
349
+ "STATE": "最新状态",
350
+ "REG_ADDRESS": "注册地",
351
+ "CSRC_INDUSTRY": "行业",
352
+ "RECOMMEND_ORG": "保荐机构",
353
+ "LAW_FIRM": "律师事务所",
354
+ "ACCOUNT_FIRM": "会计师事务所",
355
+ "UPDATE_DATE": "更新日期",
356
+ "ACCEPT_DATE": "受理日期",
357
+ "PREDICT_LISTING_MARKET": "拟上市地点",
358
+ "INFO_CODE": "招股说明书",
359
+ },
360
+ inplace=True,
361
+ )
362
+ big_df["招股说明书"] = [
363
+ f"https://pdf.dfcfw.com/pdf/H2_{item}_1.pdf" for item in big_df["招股说明书"]
364
+ ]
365
+ big_df = big_df[
366
+ [
367
+ "序号",
368
+ "企业名称",
369
+ "最新状态",
370
+ "注册地",
371
+ "行业",
372
+ "保荐机构",
373
+ "律师事务所",
374
+ "会计师事务所",
375
+ "更新日期",
376
+ "受理日期",
377
+ "拟上市地点",
378
+ "招股说明书",
379
+ ]
380
+ ]
381
+ big_df["更新日期"] = pd.to_datetime(big_df["更新日期"], errors="coerce").dt.date
382
+ big_df["受理日期"] = pd.to_datetime(big_df["受理日期"], errors="coerce").dt.date
383
+ return big_df
384
+
385
+
386
+ def stock_register_db() -> pd.DataFrame:
387
+ """
388
+ 东方财富网-数据中心-新股数据-IPO审核信息-达标企业
389
+ https://data.eastmoney.com/xg/cyb/
390
+ :return: 达标企业
391
+ :rtype: pandas.DataFrame
392
+ """
393
+ url = "https://datacenter-web.eastmoney.com/api/data/v1/get"
394
+ params = {
395
+ "sortColumns": "NOTICE_DATE,SECURITY_CODE",
396
+ "sortTypes": "-1,-1",
397
+ "pageSize": "500",
398
+ "pageNumber": "1",
399
+ "reportName": "RPT_KCB_IPO",
400
+ "columns": "KCB_LB",
401
+ "source": "WEB",
402
+ "client": "WEB",
403
+ "filter": '(ORG_TYPE_CODE="03")',
404
+ }
405
+ r = requests.get(url, params=params, headers=headers)
406
+ data_json = r.json()
407
+ page_num = data_json["result"]["pages"]
408
+ big_df = pd.DataFrame()
409
+ tqdm = get_tqdm()
410
+ for page in tqdm(range(1, page_num + 1), leave=False):
411
+ params.update({"pageNumber": page})
412
+ r = requests.get(url, params=params, headers=headers)
413
+ data_json = r.json()
414
+ temp_df = pd.DataFrame(data_json["result"]["data"])
415
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
416
+ big_df.reset_index(inplace=True)
417
+ big_df["index"] = range(1, len(big_df) + 1)
418
+ big_df.rename(
419
+ columns={
420
+ "index": "序号",
421
+ "ORG_NAME": "企业名称",
422
+ },
423
+ inplace=True,
424
+ )
425
+
426
+ big_df = big_df[
427
+ [
428
+ "序号",
429
+ "企业名称",
430
+ ]
431
+ ]
432
+
433
+ return big_df
434
+
435
+
436
+ if __name__ == "__main__":
437
+ pd.set_option("display.max_columns", None)
438
+ stock_register_kcb_df = stock_register_kcb()
439
+ print(stock_register_kcb_df)
440
+
441
+ stock_register_cyb_df = stock_register_cyb()
442
+ print(stock_register_cyb_df)
443
+
444
+ stock_register_bj_df = stock_register_bj()
445
+ print(stock_register_bj_df)
446
+
447
+ stock_register_db_df = stock_register_db()
448
+ print(stock_register_db_df)
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2022/12/2 16:28
4
+ Date: 2024/4/7 19:30
5
5
  Desc: 限售股解禁
6
6
  https://data.eastmoney.com/dxf/detail.html
7
7
  """
8
+
8
9
  import pandas as pd
9
10
  import requests
10
11
  from tqdm import tqdm
@@ -46,7 +47,8 @@ def stock_restricted_release_summary_em(
46
47
  "quoteType": "0",
47
48
  "source": "WEB",
48
49
  "client": "WEB",
49
- "filter": f"""(INDEX_CODE="{symbol_map[symbol]}")(FREE_DATE>='{start_date_str}')(FREE_DATE<='{end_date_str}')""",
50
+ "filter": f"""(INDEX_CODE="{symbol_map[symbol]}")(FREE_DATE>=
51
+ '{start_date_str}')(FREE_DATE<='{end_date_str}')""",
50
52
  "reportName": "RPT_LIFTDAY_STA",
51
53
  }
52
54
  r = requests.get(url, params=params)
@@ -83,14 +85,21 @@ def stock_restricted_release_summary_em(
83
85
  "沪深300指数涨跌幅",
84
86
  ]
85
87
  ]
86
- temp_df["解禁时间"] = pd.to_datetime(temp_df["解禁时间"]).dt.date
87
-
88
- temp_df["当日解禁股票家数"] = pd.to_numeric(temp_df["当日解禁股票家数"], errors="coerce")
88
+ temp_df["解禁时间"] = pd.to_datetime(temp_df["解禁时间"], errors="coerce").dt.date
89
+ temp_df["当日解禁股票家数"] = pd.to_numeric(
90
+ temp_df["当日解禁股票家数"], errors="coerce"
91
+ )
89
92
  temp_df["解禁数量"] = pd.to_numeric(temp_df["解禁数量"], errors="coerce") * 10000
90
- temp_df["实际解禁数量"] = pd.to_numeric(temp_df["实际解禁数量"], errors="coerce") * 10000
91
- temp_df["实际解禁市值"] = pd.to_numeric(temp_df["实际解禁市值"], errors="coerce") * 10000
93
+ temp_df["实际解禁数量"] = (
94
+ pd.to_numeric(temp_df["实际解禁数量"], errors="coerce") * 10000
95
+ )
96
+ temp_df["实际解禁市值"] = (
97
+ pd.to_numeric(temp_df["实际解禁市值"], errors="coerce") * 10000
98
+ )
92
99
  temp_df["沪深300指数"] = pd.to_numeric(temp_df["沪深300指数"], errors="coerce")
93
- temp_df["沪深300指数涨跌幅"] = pd.to_numeric(temp_df["沪深300指数涨跌幅"], errors="coerce")
100
+ temp_df["沪深300指数涨跌幅"] = pd.to_numeric(
101
+ temp_df["沪深300指数涨跌幅"], errors="coerce"
102
+ )
94
103
  return temp_df
95
104
 
96
105
 
@@ -116,7 +125,9 @@ def stock_restricted_release_detail_em(
116
125
  "pageSize": "500",
117
126
  "pageNumber": "1",
118
127
  "reportName": "RPT_LIFT_STAGE",
119
- "columns": "SECURITY_CODE,SECURITY_NAME_ABBR,FREE_DATE,CURRENT_FREE_SHARES,ABLE_FREE_SHARES,LIFT_MARKET_CAP,FREE_RATIO,NEW,B20_ADJCHRATE,A20_ADJCHRATE,FREE_SHARES_TYPE,TOTAL_RATIO,NON_FREE_SHARES,BATCH_HOLDER_NUM",
128
+ "columns": "SECURITY_CODE,SECURITY_NAME_ABBR,FREE_DATE,CURRENT_FREE_SHARES,ABLE_FREE_SHARES,"
129
+ "LIFT_MARKET_CAP,FREE_RATIO,NEW,B20_ADJCHRATE,A20_ADJCHRATE,FREE_SHARES_TYPE,TOTAL_RATIO,"
130
+ "NON_FREE_SHARES,BATCH_HOLDER_NUM",
120
131
  "source": "WEB",
121
132
  "client": "WEB",
122
133
  "filter": f"""(FREE_DATE>='{start_date_str}')(FREE_DATE<='{end_date_str}')""",
@@ -134,7 +145,7 @@ def stock_restricted_release_detail_em(
134
145
  r = requests.get(url, params=params)
135
146
  data_json = r.json()
136
147
  temp_df = pd.DataFrame(data_json["result"]["data"])
137
- big_df = pd.concat([big_df, temp_df], ignore_index=True)
148
+ big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)
138
149
 
139
150
  big_df.reset_index(inplace=True)
140
151
  big_df["index"] = big_df["index"] + 1
@@ -171,15 +182,27 @@ def stock_restricted_release_detail_em(
171
182
  "解禁后20日涨跌幅",
172
183
  ]
173
184
  ]
174
- big_df["解禁时间"] = pd.to_datetime(big_df["解禁时间"]).dt.date
185
+ big_df["解禁时间"] = pd.to_datetime(big_df["解禁时间"], errors="coerce").dt.date
175
186
 
176
187
  big_df["解禁数量"] = pd.to_numeric(big_df["解禁数量"], errors="coerce") * 10000
177
- big_df["实际解禁数量"] = pd.to_numeric(big_df["实际解禁数量"], errors="coerce") * 10000
178
- big_df["实际解禁市值"] = pd.to_numeric(big_df["实际解禁市值"], errors="coerce") * 10000
179
- big_df["占解禁前流通市值比例"] = pd.to_numeric(big_df["占解禁前流通市值比例"], errors="coerce")
180
- big_df["解禁前一交易日收盘价"] = pd.to_numeric(big_df["解禁前一交易日收盘价"], errors="coerce")
181
- big_df["解禁前20日涨跌幅"] = pd.to_numeric(big_df["解禁前20日涨跌幅"], errors="coerce")
182
- big_df["解禁后20日涨跌幅"] = pd.to_numeric(big_df["解禁后20日涨跌幅"], errors="coerce")
188
+ big_df["实际解禁数量"] = (
189
+ pd.to_numeric(big_df["实际解禁数量"], errors="coerce") * 10000
190
+ )
191
+ big_df["实际解禁市值"] = (
192
+ pd.to_numeric(big_df["实际解禁市值"], errors="coerce") * 10000
193
+ )
194
+ big_df["占解禁前流通市值比例"] = pd.to_numeric(
195
+ big_df["占解禁前流通市值比例"], errors="coerce"
196
+ )
197
+ big_df["解禁前一交易日收盘价"] = pd.to_numeric(
198
+ big_df["解禁前一交易日收盘价"], errors="coerce"
199
+ )
200
+ big_df["解禁前20日涨跌幅"] = pd.to_numeric(
201
+ big_df["解禁前20日涨跌幅"], errors="coerce"
202
+ )
203
+ big_df["解禁后20日涨跌幅"] = pd.to_numeric(
204
+ big_df["解禁后20日涨跌幅"], errors="coerce"
205
+ )
183
206
  return big_df
184
207
 
185
208
 
@@ -200,12 +223,16 @@ def stock_restricted_release_queue_em(symbol: str = "600000") -> pd.DataFrame:
200
223
  "pageNumber": "1",
201
224
  "reportName": "RPT_LIFT_STAGE",
202
225
  "filter": f'(SECURITY_CODE="{symbol}")',
203
- "columns": "SECURITY_CODE,SECURITY_NAME_ABBR,FREE_DATE,CURRENT_FREE_SHARES,ABLE_FREE_SHARES,LIFT_MARKET_CAP,FREE_RATIO,NEW,B20_ADJCHRATE,A20_ADJCHRATE,FREE_SHARES_TYPE,TOTAL_RATIO,NON_FREE_SHARES,BATCH_HOLDER_NUM",
226
+ "columns": "SECURITY_CODE,SECURITY_NAME_ABBR,FREE_DATE,CURRENT_FREE_SHARES,ABLE_FREE_SHARES,"
227
+ "LIFT_MARKET_CAP,FREE_RATIO,NEW,B20_ADJCHRATE,A20_ADJCHRATE,FREE_SHARES_TYPE,TOTAL_RATIO,"
228
+ "NON_FREE_SHARES,BATCH_HOLDER_NUM",
204
229
  "source": "WEB",
205
230
  "client": "WEB",
206
231
  }
207
232
  r = requests.get(url, params=params)
208
233
  data_json = r.json()
234
+ if not data_json["result"]:
235
+ return pd.DataFrame()
209
236
  temp_df = pd.DataFrame(data_json["result"]["data"])
210
237
  temp_df.reset_index(inplace=True)
211
238
  temp_df["index"] = temp_df["index"] + 1
@@ -243,18 +270,31 @@ def stock_restricted_release_queue_em(symbol: str = "600000") -> pd.DataFrame:
243
270
  "解禁后20日涨跌幅",
244
271
  ]
245
272
  ]
246
- temp_df["解禁时间"] = pd.to_datetime(temp_df["解禁时间"]).dt.date
247
-
273
+ temp_df["解禁时间"] = pd.to_datetime(temp_df["解禁时间"], errors="coerce").dt.date
248
274
  temp_df["解禁股东数"] = pd.to_numeric(temp_df["解禁股东数"], errors="coerce")
249
275
  temp_df["解禁数量"] = pd.to_numeric(temp_df["解禁数量"], errors="coerce") * 10000
250
- temp_df["实际解禁数量"] = pd.to_numeric(temp_df["实际解禁数量"], errors="coerce") * 10000
251
- temp_df["未解禁数量"] = pd.to_numeric(temp_df["未解禁数量"], errors="coerce") * 10000
252
- temp_df["实际解禁数量市值"] = pd.to_numeric(temp_df["实际解禁数量市值"], errors="coerce") * 10000
276
+ temp_df["实际解禁数量"] = (
277
+ pd.to_numeric(temp_df["实际解禁数量"], errors="coerce") * 10000
278
+ )
279
+ temp_df["未解禁数量"] = (
280
+ pd.to_numeric(temp_df["未解禁数量"], errors="coerce") * 10000
281
+ )
282
+ temp_df["实际解禁数量市值"] = (
283
+ pd.to_numeric(temp_df["实际解禁数量市值"], errors="coerce") * 10000
284
+ )
253
285
  temp_df["占总市值比例"] = pd.to_numeric(temp_df["占总市值比例"], errors="coerce")
254
- temp_df["占流通市值比例"] = pd.to_numeric(temp_df["占流通市值比例"], errors="coerce")
255
- temp_df["解禁前一交易日收盘价"] = pd.to_numeric(temp_df["解禁前一交易日收盘价"], errors="coerce")
256
- temp_df["解禁前20日涨跌幅"] = pd.to_numeric(temp_df["解禁前20日涨跌幅"], errors="coerce")
257
- temp_df["解禁后20日涨跌幅"] = pd.to_numeric(temp_df["解禁后20日涨跌幅"], errors="coerce")
286
+ temp_df["占流通市值比例"] = pd.to_numeric(
287
+ temp_df["占流通市值比例"], errors="coerce"
288
+ )
289
+ temp_df["解禁前一交易日收盘价"] = pd.to_numeric(
290
+ temp_df["解禁前一交易日收盘价"], errors="coerce"
291
+ )
292
+ temp_df["解禁前20日涨跌幅"] = pd.to_numeric(
293
+ temp_df["解禁前20日涨跌幅"], errors="coerce"
294
+ )
295
+ temp_df["解禁后20日涨跌幅"] = pd.to_numeric(
296
+ temp_df["解禁后20日涨跌幅"], errors="coerce"
297
+ )
258
298
  return temp_df
259
299
 
260
300
 
@@ -280,7 +320,8 @@ def stock_restricted_release_stockholder_em(
280
320
  "pageNumber": "1",
281
321
  "reportName": "RPT_LIFT_GD",
282
322
  "filter": f"""(SECURITY_CODE="{symbol}")(FREE_DATE='{date_str}')""",
283
- "columns": "LIMITED_HOLDER_NAME,ADD_LISTING_SHARES,ACTUAL_LISTED_SHARES,ADD_LISTING_CAP,LOCK_MONTH,RESIDUAL_LIMITED_SHARES,FREE_SHARES_TYPE,PLAN_FEATURE",
323
+ "columns": "LIMITED_HOLDER_NAME,ADD_LISTING_SHARES,ACTUAL_LISTED_SHARES,ADD_LISTING_CAP,LOCK_MONTH,"
324
+ "RESIDUAL_LIMITED_SHARES,FREE_SHARES_TYPE,PLAN_FEATURE",
284
325
  "source": "WEB",
285
326
  "client": "WEB",
286
327
  }
@@ -304,14 +345,18 @@ def stock_restricted_release_stockholder_em(
304
345
  temp_df["实际解禁数量"] = pd.to_numeric(temp_df["实际解禁数量"], errors="coerce")
305
346
  temp_df["解禁市值"] = pd.to_numeric(temp_df["解禁市值"], errors="coerce")
306
347
  temp_df["锁定期"] = pd.to_numeric(temp_df["锁定期"], errors="coerce")
307
- temp_df["剩余未解禁数量"] = pd.to_numeric(temp_df["剩余未解禁数量"], errors="coerce")
308
- temp_df["剩余未解禁数量"] = pd.to_numeric(temp_df["剩余未解禁数量"], errors="coerce")
348
+ temp_df["剩余未解禁数量"] = pd.to_numeric(
349
+ temp_df["剩余未解禁数量"], errors="coerce"
350
+ )
351
+ temp_df["剩余未解禁数量"] = pd.to_numeric(
352
+ temp_df["剩余未解禁数量"], errors="coerce"
353
+ )
309
354
  return temp_df
310
355
 
311
356
 
312
357
  if __name__ == "__main__":
313
358
  stock_restricted_release_summary_em_df = stock_restricted_release_summary_em(
314
- symbol="全部股票", start_date="20221108", end_date="20221209"
359
+ symbol="全部股票", start_date="20221108", end_date="20221209"
315
360
  )
316
361
  print(stock_restricted_release_summary_em_df)
317
362
 
@@ -325,5 +370,7 @@ if __name__ == "__main__":
325
370
  )
326
371
  print(stock_restricted_release_queue_em_df)
327
372
 
328
- stock_restricted_release_stockholder_em_df = stock_restricted_release_stockholder_em(symbol="600000", date="20200904")
373
+ stock_restricted_release_stockholder_em_df = (
374
+ stock_restricted_release_stockholder_em(symbol="600000", date="20200904")
375
+ )
329
376
  print(stock_restricted_release_stockholder_em_df)