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,229 +1,29 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding:utf-8 -*-
3
3
  """
4
- Date: 2022/8/8 20:33
4
+ Date: 2024/6/26 15:33
5
5
  Desc: 英为财情-外汇-货币对历史数据
6
6
  https://cn.investing.com/currencies/
7
7
  https://cn.investing.com/currencies/eur-usd-historical-data
8
8
  """
9
- import json
10
9
 
11
10
  import pandas as pd
12
11
  import requests
13
12
  from bs4 import BeautifulSoup
14
- from tqdm import tqdm
13
+ from akshare.utils.tqdm import get_tqdm
15
14
 
16
- from akshare.index.cons import short_headers
17
15
 
18
-
19
- def _currency_name_url() -> dict:
20
- """
21
- 货币键值对
22
- :return: 货币键值对
23
- :rtype: dict
24
- """
25
- url = "https://cn.investing.com/currencies/"
26
- res = requests.post(url, headers=short_headers)
27
- data_table = pd.read_html(res.text)[0].iloc[:, 1:] # 实时货币行情
28
- data_table.columns = ["中文名称", "英文名称", "最新", "最高", "最低", "涨跌额", "涨跌幅", "时间"]
29
- name_code_dict = dict(
30
- zip(
31
- data_table["中文名称"].tolist(),
32
- [
33
- item.lower().replace("/", "-")
34
- for item in data_table["英文名称"].tolist()
35
- ],
36
- )
37
- )
38
- return name_code_dict
39
-
40
-
41
- def currency_hist_area_index_name_code(symbol: str = "usd-jpy") -> dict:
42
- """
43
- 指定 symbol 的所有指数和代码
44
- https://cn.investing.com/indices/
45
- :param symbol: 指定的国家或地区;ak._get_global_country_name_url() 函数返回的国家或地区的名称
46
- :type symbol: str
47
- :return: 指定 area 的所有指数和代码
48
- :rtype: dict
49
- """
50
- pd.set_option("mode.chained_assignment", None)
51
- url = f"https://cn.investing.com/currencies/{symbol}-historical-data"
52
- r = requests.get(url)
53
- soup = BeautifulSoup(r.text, "lxml")
54
- data_text = soup.find("script", attrs={"id": "__NEXT_DATA__"}).text
55
- data_json = json.loads(data_text)
56
- code = json.loads(data_json["props"]["pageProps"]["state"])["dataStore"][
57
- "pageInfoStore"
58
- ]["identifiers"]["instrument_id"]
59
- return code
60
-
61
-
62
- def currency_hist(
63
- symbol: str = "usd-jpy",
64
- period: str = "每日",
65
- start_date: str = "20030101",
66
- end_date: str = "20220808",
67
- ) -> pd.DataFrame:
68
- """
69
- 外汇历史数据, 注意获取数据区间的长短, 输入任意货币对, 具体能否获取, 通过 currency_name_code_dict 查询
70
- https://www.investing.com/
71
- :param symbol: 货币对
72
- :type symbol: str
73
- :param period: choice of {"每日", "每周", "每月"}
74
- :type period: str
75
- :param start_date: 日期
76
- :type start_date: str
77
- :param end_date: 日期
78
- :type end_date: str
79
- :return: 货币对历史数据
80
- :rtype: pandas.DataFrame
81
- """
82
- start_date = "-".join([start_date[:4], start_date[4:6], start_date[6:]])
83
- end_date = "-".join([end_date[:4], end_date[4:6], end_date[6:]])
84
- code = currency_hist_area_index_name_code(symbol)
85
- url = f"https://api.investing.com/api/financialdata/historical/{code}"
86
- period_map = {"每日": "Daily", "每周": "Weekly", "每月": "Monthly"}
87
- params = {
88
- "start-date": start_date,
89
- "end-date": end_date,
90
- "time-frame": period_map[period],
91
- "add-missing-rows": "false",
92
- }
93
- headers = {
94
- "accept": "application/json, text/plain, */*",
95
- "accept-encoding": "gzip, deflate, br",
96
- "accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
97
- "cache-control": "no-cache",
98
- "domain-id": "cn",
99
- "origin": "https://cn.investing.com",
100
- "pragma": "no-cache",
101
- "referer": "https://cn.investing.com/",
102
- "sec-ch-ua": '"Google Chrome";v="105", "Not)A;Brand";v="8", "Chromium";v="105"',
103
- "sec-ch-ua-mobile": '"?0"',
104
- "sec-ch-ua-platform": '"Windows"',
105
- "sec-fetch-dest": "empty",
106
- "sec-fetch-mode": "cors",
107
- "sec-fetch-site": "same-site",
108
- "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36",
109
- }
110
- r = requests.get(url, params=params, headers=headers)
111
- data_json = r.json()
112
- df_data = pd.DataFrame(data_json["data"])
113
- df_data.columns = [
114
- "-",
115
- "-",
116
- "-",
117
- "日期",
118
- "-",
119
- "-",
120
- "-",
121
- "-",
122
- "-",
123
- "交易量",
124
- "-",
125
- "收盘",
126
- "开盘",
127
- "高",
128
- "低",
129
- "涨跌幅",
130
- ]
131
- df_data = df_data[["日期", "收盘", "开盘", "高", "低", "交易量", "涨跌幅"]]
132
- df_data["日期"] = pd.to_datetime(df_data["日期"]).dt.date
133
- df_data["收盘"] = pd.to_numeric(df_data["收盘"])
134
- df_data["开盘"] = pd.to_numeric(df_data["开盘"])
135
- df_data["高"] = pd.to_numeric(df_data["高"])
136
- df_data["低"] = pd.to_numeric(df_data["低"])
137
- df_data["交易量"] = pd.to_numeric(df_data["交易量"])
138
- df_data["涨跌幅"] = pd.to_numeric(df_data["涨跌幅"])
139
- df_data.sort_values("日期", inplace=True)
140
- df_data.reset_index(inplace=True, drop=True)
141
- return df_data
142
-
143
-
144
- def _currency_single() -> pd.DataFrame:
145
- """
146
- 英为财情-外汇-单种货币兑换汇率-单种货币列表
147
- :return: 单种货币列表
148
- :rtype: pandas.DataFrame
149
- """
150
- url = "https://cn.investing.com/currencies/single-currency-crosses"
151
- res = requests.post(url, headers=short_headers)
152
- soup = BeautifulSoup(res.text, "lxml")
153
- name_url_option_list = soup.find(
154
- "select", attrs={"class": "newInput selectBox"}
155
- ).find_all("option")
156
- temp_df = pd.DataFrame(
157
- [item.get_text().split("-", 1) for item in name_url_option_list]
158
- )
159
- temp_df.columns = ["short_name", "name"]
160
- temp_df["short_name"] = temp_df["short_name"].str.strip()
161
- temp_df["name"] = temp_df["name"].str.strip()
162
- temp_df["code"] = [item["value"] for item in name_url_option_list]
163
- return temp_df
164
-
165
-
166
- def currency_name_code(symbol: str = "usd/jpy") -> pd.DataFrame:
16
+ def currency_pair_map(symbol: str = "美元") -> pd.DataFrame:
167
17
  """
168
- 当前所有可兑换货币对
169
- :param symbol: "usd/jpy"
18
+ 指定货币的所有可获取货币对的数据
19
+ https://cn.investing.com/currencies/cny-jmd
20
+ :param symbol: 指定货币
170
21
  :type symbol: str
171
- :return: 中英文货币对
22
+ :return: 指定货币的所有可获取货币对的数据
172
23
  :rtype: pandas.DataFrame
173
- name code
174
- 0 欧元/美元 eur-usd
175
- 1 英镑/美元 gbp-usd
176
- 2 美元/日元 usd-jpy
177
- 3 美元/瑞士法郎 usd-chf
178
- 4 澳大利亚元/美元 aud-usd
179
- .. ... ...
180
- 268 日元/新加坡元 jpy-sgd
181
- 269 科威特第纳尔/日元 kwd-jpy
182
- 270 日元/白俄罗斯卢布 jpy-byn
183
- 271 日元/乌克兰赫里纳 jpy-uah
184
- 272 日元/土耳其里拉 jpy-try
185
24
  """
186
- symbol = symbol.upper()
187
- currency_df = _currency_single()
188
- url = "https://cn.investing.com/currencies/Service/ChangeCurrency"
189
- params = {
190
- "session_uniq_id": "53bee677662a2336ec07b40738753fc1",
191
- "currencies": currency_df[
192
- currency_df["short_name"] == symbol.split("/")[0]
193
- ]["code"].values[0],
194
- }
195
- headers = {
196
- "Accept": "application/json, text/javascript, */*; q=0.01",
197
- "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
198
- "Cache-Control": "no-cache",
199
- "Connection": "keep-alive",
200
- "Host": "cn.investing.com",
201
- "Pragma": "no-cache",
202
- "Referer": "https://cn.investing.com/currencies/single-currency-crosses",
203
- "Sec-Fetch-Mode": "cors",
204
- "Sec-Fetch-Site": "same-origin",
205
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36",
206
- "X-Requested-With": "XMLHttpRequest",
207
- }
208
- r = requests.get(url, params=params, headers=headers)
209
- temp_df = pd.read_html(r.json()["HTML"])[0].iloc[:, 1:]
210
- temp_df.rename(columns={"名称.1": "简称"}, inplace=True)
211
- temp_df["pids"] = [item[:-1] for item in r.json()["pids"]]
212
- name_code_dict_one = dict(
213
- zip(
214
- temp_df["名称"].tolist(),
215
- [
216
- item.lower().replace("/", "-")
217
- for item in temp_df["简称"].tolist()
218
- ],
219
- )
220
- )
221
- params = {
222
- "session_uniq_id": "53bee677662a2336ec07b40738753fc1",
223
- "currencies": currency_df[
224
- currency_df["short_name"] == symbol.split("/")[1]
225
- ]["code"].values[0],
226
- }
25
+ region_code = []
26
+ region_name = []
227
27
  headers = {
228
28
  "Accept": "application/json, text/javascript, */*; q=0.01",
229
29
  # "Accept-Encoding": "gzip, deflate, br",
@@ -235,64 +35,21 @@ def currency_name_code(symbol: str = "usd/jpy") -> pd.DataFrame:
235
35
  "Referer": "https://cn.investing.com/currencies/single-currency-crosses",
236
36
  "Sec-Fetch-Mode": "cors",
237
37
  "Sec-Fetch-Site": "same-origin",
238
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36",
38
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
39
+ "Chrome/79.0.3945.130 Safari/537.36",
239
40
  "X-Requested-With": "XMLHttpRequest",
240
41
  }
241
- r = requests.get(url, params=params, headers=headers)
242
- temp_df = pd.read_html(r.json()["HTML"])[0].iloc[:, 1:]
243
- temp_df.rename(columns={"名称.1": "简称"}, inplace=True)
244
- temp_df["pids"] = [item[:-1] for item in r.json()["pids"]]
245
- name_code_dict_two = dict(
246
- zip(
247
- temp_df["名称"].tolist(),
248
- [
249
- item.lower().replace("/", "-")
250
- for item in temp_df["简称"].tolist()
251
- ],
252
- )
253
- )
254
- name_code_dict_one.update(name_code_dict_two)
255
- temp_df = pd.DataFrame.from_dict(
256
- name_code_dict_one, orient="index"
257
- ).reset_index()
258
- temp_df.columns = ["name", "code"]
259
- return temp_df
260
-
261
-
262
- def currency_pair_map(symbol: str = "美元") -> pd.DataFrame:
263
- """
264
- 指定货币的所有可获取货币对的数据
265
- https://cn.investing.com/currencies/cny-jmd
266
- :param symbol: 指定货币
267
- :type symbol: str
268
- :return: 指定货币的所有可获取货币对的数据
269
- :rtype: pandas.DataFrame
270
- """
271
- region_code = []
272
- region_name = []
273
42
 
274
43
  def has_data_sml_id_but_no_id(tag):
275
44
  return tag.has_attr("data-sml-id") and not tag.has_attr("title")
276
45
 
46
+ tqdm = get_tqdm()
277
47
  for region_id in tqdm(["4", "1", "8", "7", "6"], leave=False):
278
48
  url = "https://cn.investing.com/currencies/Service/region"
279
49
  params = {"region_ID": region_id, "currency_ID": "false"}
280
- headers = {
281
- "Accept": "application/json, text/javascript, */*; q=0.01",
282
- # "Accept-Encoding": "gzip, deflate, br",
283
- "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
284
- "Cache-Control": "no-cache",
285
- "Connection": "keep-alive",
286
- "Host": "cn.investing.com",
287
- "Pragma": "no-cache",
288
- "Referer": "https://cn.investing.com/currencies/single-currency-crosses",
289
- "Sec-Fetch-Mode": "cors",
290
- "Sec-Fetch-Site": "same-origin",
291
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36",
292
- "X-Requested-With": "XMLHttpRequest",
293
- }
50
+
294
51
  r = requests.get(url, params=params, headers=headers)
295
- soup = BeautifulSoup(r.text, "lxml")
52
+ soup = BeautifulSoup(r.text, features="lxml")
296
53
  region_code.extend(
297
54
  [
298
55
  item["continentid"] + "-" + region_id
@@ -300,10 +57,7 @@ def currency_pair_map(symbol: str = "美元") -> pd.DataFrame:
300
57
  ]
301
58
  )
302
59
  region_name.extend(
303
- [
304
- item.find("i").text
305
- for item in soup.find_all(has_data_sml_id_but_no_id)
306
- ]
60
+ [item.find("i").text for item in soup.find_all(has_data_sml_id_but_no_id)]
307
61
  )
308
62
 
309
63
  name_id_map = dict(zip(region_name, region_code))
@@ -313,34 +67,14 @@ def currency_pair_map(symbol: str = "美元") -> pd.DataFrame:
313
67
  "currency_ID": name_id_map[symbol].split("-")[0],
314
68
  }
315
69
  r = requests.get(url, params=params, headers=headers)
316
- soup = BeautifulSoup(r.text, "lxml")
70
+ soup = BeautifulSoup(r.text, features="lxml")
317
71
 
318
- temp_code = [
319
- item["href"].split("/")[-1] for item in soup.find_all("a")
320
- ] # need
321
- temp_name = [
322
- item["title"].replace(" ", "-") for item in soup.find_all("a")
323
- ]
324
- temp_df = pd.DataFrame([temp_name, temp_code], index=["name", "code"]).T
72
+ temp_code = [item["href"].split("/")[-1] for item in soup.find_all("a")] # need
73
+ temp_name = [item["title"].replace(" ", "-") for item in soup.find_all("a")]
74
+ temp_df = pd.DataFrame(data=[temp_name, temp_code], index=["name", "code"]).T
325
75
  return temp_df
326
76
 
327
77
 
328
78
  if __name__ == "__main__":
329
- currency_hist_area_index_name_code_df = currency_hist_area_index_name_code(
330
- symbol="usd-jpy"
331
- )
332
- print(currency_hist_area_index_name_code_df)
333
-
334
79
  currency_pair_map_df = currency_pair_map(symbol="人民币")
335
80
  print(currency_pair_map_df)
336
-
337
- currency_name_code_df = currency_name_code(symbol="cny/dkk")
338
- print(currency_name_code_df)
339
-
340
- currency_hist_df = currency_hist(
341
- symbol="usd-jpy",
342
- period="每日",
343
- start_date="20050101",
344
- end_date="20220808",
345
- )
346
- print(currency_hist_df)
@@ -5,11 +5,12 @@ Date: 2021/12/27 15:47
5
5
  Desc: 中国公路物流运价、运量指数
6
6
  http://index.0256.cn/expx.htm
7
7
  """
8
+
8
9
  import pandas as pd
9
10
  import requests
10
11
 
11
12
 
12
- def index_cflp_price(symbol: str = "周指数") -> pd.DataFrame:
13
+ def index_price_cflp(symbol: str = "周指数") -> pd.DataFrame:
13
14
  """
14
15
  中国公路物流运价指数
15
16
  http://index.0256.cn/expx.htm
@@ -38,7 +39,8 @@ def index_cflp_price(symbol: str = "周指数") -> pd.DataFrame:
38
39
  headers = {
39
40
  "Origin": "http://index.0256.cn",
40
41
  "Referer": "http://index.0256.cn/expx.htm",
41
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36",
42
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
43
+ "Chrome/90.0.4430.212 Safari/537.36",
42
44
  }
43
45
  r = requests.post(url, data=params, headers=headers)
44
46
  data_json = r.json()
@@ -51,14 +53,14 @@ def index_cflp_price(symbol: str = "周指数") -> pd.DataFrame:
51
53
  ]
52
54
  ).T
53
55
  temp_df.columns = ["日期", "定基指数", "环比指数", "同比指数"]
54
- temp_df["日期"] = pd.to_datetime(temp_df["日期"]).dt.date
55
- temp_df["定基指数"] = pd.to_numeric(temp_df["定基指数"])
56
- temp_df["环比指数"] = pd.to_numeric(temp_df["环比指数"])
57
- temp_df["同比指数"] = pd.to_numeric(temp_df["同比指数"])
56
+ temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
57
+ temp_df["定基指数"] = pd.to_numeric(temp_df["定基指数"], errors="coerce")
58
+ temp_df["环比指数"] = pd.to_numeric(temp_df["环比指数"], errors="coerce")
59
+ temp_df["同比指数"] = pd.to_numeric(temp_df["同比指数"], errors="coerce")
58
60
  return temp_df
59
61
 
60
62
 
61
- def index_cflp_volume(symbol: str = "月指数") -> pd.DataFrame:
63
+ def index_volume_cflp(symbol: str = "月指数") -> pd.DataFrame:
62
64
  """
63
65
  中国公路物流运量指数
64
66
  http://index.0256.cn/expx.htm
@@ -86,7 +88,8 @@ def index_cflp_volume(symbol: str = "月指数") -> pd.DataFrame:
86
88
  headers = {
87
89
  "Origin": "http://index.0256.cn",
88
90
  "Referer": "http://index.0256.cn/expx.htm",
89
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36",
91
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
92
+ "Chrome/90.0.4430.212 Safari/537.36",
90
93
  }
91
94
  r = requests.post(url, data=params, headers=headers)
92
95
  data_json = r.json()
@@ -99,31 +102,31 @@ def index_cflp_volume(symbol: str = "月指数") -> pd.DataFrame:
99
102
  ]
100
103
  ).T
101
104
  temp_df.columns = ["日期", "定基指数", "环比指数", "同比指数"]
102
- temp_df["日期"] = pd.to_datetime(temp_df["日期"]).dt.date
103
- temp_df["定基指数"] = pd.to_numeric(temp_df["定基指数"])
104
- temp_df["环比指数"] = pd.to_numeric(temp_df["环比指数"])
105
- temp_df["同比指数"] = pd.to_numeric(temp_df["同比指数"])
105
+ temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
106
+ temp_df["定基指数"] = pd.to_numeric(temp_df["定基指数"], errors="coerce")
107
+ temp_df["环比指数"] = pd.to_numeric(temp_df["环比指数"], errors="coerce")
108
+ temp_df["同比指数"] = pd.to_numeric(temp_df["同比指数"], errors="coerce")
106
109
  return temp_df
107
110
 
108
111
 
109
112
  if __name__ == "__main__":
110
- index_cflp_price_df = index_cflp_price(symbol="周指数")
111
- print(index_cflp_price_df)
113
+ index_price_cflp_df = index_price_cflp(symbol="周指数")
114
+ print(index_price_cflp_df)
112
115
 
113
- index_cflp_price_df = index_cflp_price(symbol="月指数")
114
- print(index_cflp_price_df)
116
+ index_price_cflp_df = index_price_cflp(symbol="月指数")
117
+ print(index_price_cflp_df)
115
118
 
116
- index_cflp_price_df = index_cflp_price(symbol="季度指数")
117
- print(index_cflp_price_df)
119
+ index_price_cflp_df = index_price_cflp(symbol="季度指数")
120
+ print(index_price_cflp_df)
118
121
 
119
- index_cflp_price_df = index_cflp_price(symbol="年度指数")
120
- print(index_cflp_price_df)
122
+ index_price_cflp_df = index_price_cflp(symbol="年度指数")
123
+ print(index_price_cflp_df)
121
124
 
122
- index_cflp_volume_df = index_cflp_volume(symbol="月指数")
123
- print(index_cflp_volume_df)
125
+ index_volume_cflp_df = index_volume_cflp(symbol="月指数")
126
+ print(index_volume_cflp_df)
124
127
 
125
- index_cflp_volume_df = index_cflp_volume(symbol="季度指数")
126
- print(index_cflp_volume_df)
128
+ index_volume_cflp_df = index_volume_cflp(symbol="季度指数")
129
+ print(index_volume_cflp_df)
127
130
 
128
- index_cflp_volume_df = index_cflp_volume(symbol="年度指数")
129
- print(index_cflp_volume_df)
131
+ index_volume_cflp_df = index_volume_cflp(symbol="年度指数")
132
+ print(index_volume_cflp_df)