mns-common 1.3.2.6__py3-none-any.whl → 1.3.2.8__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 mns-common might be problematic. Click here for more details.

@@ -8,7 +8,7 @@ file_path = os.path.abspath(__file__)
8
8
  end = file_path.index('mns') + 14
9
9
  project_path = file_path[0:end]
10
10
  sys.path.append(project_path)
11
-
11
+ from concurrent.futures import ThreadPoolExecutor
12
12
  import pandas as pd
13
13
  from loguru import logger
14
14
  import json
@@ -17,6 +17,13 @@ import time
17
17
  import akshare as ak
18
18
  import numpy as np
19
19
 
20
+ # 最大返回条数
21
+ max_number = 600
22
+ # 最小返回条数
23
+ min_number = 500
24
+ # 分页条数
25
+ page_number = 200
26
+
20
27
 
21
28
  # fields_02 = "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24,f25,f26,f27,f28,f29,f30,f31,f32,f33,f34,f35,f36,f37,f38,f39,f40,f41,f42,f43,f44,f45,f46,f47,f48,f49,f50,f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61,f62,f63,f64,f65,f66,f67,f68,f69,f70,f71,f72,f73,f74,f75,f76,f77,f78,f79,f80,f81,f82,f83,f84,f85,f86,f87,f88,f89,f90,f91,f92,f93,f94,f95,f96,f97,f98,f99,f100,f101,f102,f103,f104,f105,f106,f107,f108" \
22
29
  # ",f109,f110,f111,f112,f113,f114,f115,f116,f117,f118,f119,f120,f121,f122,f123,f124,f125,f126,f127,f128,f129,f130,f131,f132,f133,f134,f135,f136,f137,f138,f139,f140,f141,f142,f143,f144,f145,f146,f147,f148,f149,f150,f151,f152,f153,f154,f155,f156,f157,f158,f159,f160,f161,f162,f163,f164,f165,f166,f167,f168,f169,f170,f171,f172,f173,f174,f175,f176,f177,f178,f179,f180,f181,f182,f183,f184,f185,f186,f187,f188,f189,f190,f191,f192,f193,f194,f195,f196,f197,f198,f199,f200" \
@@ -29,13 +36,13 @@ import numpy as np
29
36
  # =8a086bfc3570bdde64a6a1c585cccb35&fltt=1&invt=1&fs=m:0+e:11,m:1+e:11,m:1+e:11+s:4194304,
30
37
  # m:0+e:11+s:8388608&dpt=zqsc.zpg&fields=f1,f2,f3,f4,f5,f6,f8,f10,f12,f13,f14,f18,f22,f152,
31
38
  # f237&wbp2u=|0|0|0|wap&fid=f3&po=1&pz=2000&_=1718163189870
32
- def all_debt_ticker_data(fields) -> pd.DataFrame:
39
+ def get_debt_page_data(fields, pn) -> pd.DataFrame:
33
40
  current_timestamp = str(int(round(time.time() * 1000, 0)))
34
41
  url = "https://push2.eastmoney.com/api/qt/clist/get"
35
42
 
36
43
  params = {
37
44
  "cb": "jQuery34103608466964799838_" + current_timestamp,
38
- "pn": 1,
45
+ "pn": str(pn),
39
46
  "np": 3,
40
47
  "ut": "8a086bfc3570bdde64a6a1c585cccb35",
41
48
  "fltt": 1,
@@ -58,16 +65,58 @@ def all_debt_ticker_data(fields) -> pd.DataFrame:
58
65
  data_json = json.loads(data_json)
59
66
  if data_json is None:
60
67
  return pd.DataFrame()
61
- return pd.DataFrame(data_json)
68
+ else:
69
+ return pd.DataFrame(data_json)
62
70
  except Exception as e:
63
- logger.error("获取股票列表,实时行情异常:{}", e)
64
- return None
71
+ logger.error("获取可转债列表,实时行情异常:{}", e)
72
+ return pd.DataFrame()
73
+
74
+
75
+ def all_debt_ticker_data(fields) -> pd.DataFrame:
76
+ """
77
+ 使用多线程获取所有债券数据
78
+ """
79
+ # 计算总页数,假设总共有1000条数据,每页200条
80
+
81
+ per_page = page_number
82
+ total_pages = (max_number + per_page - 1) // per_page # 向上取整
83
+
84
+ # 创建线程池
85
+ with ThreadPoolExecutor(max_workers=3) as executor:
86
+ # 提交任务,获取每页数据
87
+ futures = [executor.submit(get_debt_page_data, fields, pn)
88
+ for pn in range(1, total_pages + 1)]
89
+
90
+ # 收集结果
91
+ results = []
92
+ for future in futures:
93
+ result = future.result()
94
+ if not result.empty:
95
+ results.append(result)
96
+
97
+ # 合并所有页面的数据
98
+ if results:
99
+ return pd.concat(results, ignore_index=True)
100
+ else:
101
+ return pd.DataFrame()
65
102
 
66
103
 
67
104
  def get_debt_real_time_quotes():
68
105
  fields = ("f352,f2,f3,f5,f6,f8,f10,f11,f22,f12,f14,f15,f16,f17,f18,f20,f21,f26,f33,f34,f35,f62,f66,f69,f72,f184,"
69
106
  "f211,f212,f232,f233,f234")
70
- temp_df = all_debt_ticker_data(fields)
107
+ # 获取第一页数据
108
+ page_one_df = get_debt_page_data(fields, 1)
109
+ # 数据接口正常返回5600以上的数量
110
+ if page_one_df.shape[0] > min_number:
111
+ page_one_df = rename_real_time_quotes_df(page_one_df)
112
+ return page_one_df
113
+ else:
114
+ page_df = all_debt_ticker_data(fields)
115
+ page_df = rename_real_time_quotes_df(page_df)
116
+ return page_df
117
+
118
+
119
+ def rename_real_time_quotes_df(temp_df):
71
120
  temp_df = temp_df.rename(columns={
72
121
  "f2": "now_price",
73
122
  "f3": "chg",
@@ -233,5 +282,8 @@ def get_kzz_bond_info():
233
282
 
234
283
 
235
284
  if __name__ == '__main__':
236
- print(get_debt_real_time_quotes())
237
- get_kzz_bond_info()
285
+ info_df = get_kzz_bond_info()
286
+ print(info_df)
287
+ while True:
288
+ df = get_debt_real_time_quotes()
289
+ logger.info(df)
@@ -6,21 +6,32 @@ end = file_path.index('mns') + 16
6
6
  project_path = file_path[0:end]
7
7
  sys.path.append(project_path)
8
8
 
9
+ from concurrent.futures import ThreadPoolExecutor
9
10
  import pandas as pd
11
+ from loguru import logger
10
12
  import requests
13
+ import time
11
14
  import numpy as np
12
15
 
16
+ # 最大返回条数
17
+ max_number = 1200
18
+ # 最小返回条数
19
+ min_number = 1000
20
+ # 分页条数
21
+ page_number = 200
13
22
 
14
- def fund_etf_spot_em() -> pd.DataFrame:
23
+
24
+ def get_fund_etf_page_df(pn) -> pd.DataFrame:
15
25
  """
16
26
  东方财富-ETF 实时行情
17
27
  https://quote.eastmoney.com/center/gridlist.html#fund_etf
18
28
  :return: ETF 实时行情
19
29
  :rtype: pandas.DataFrame
20
30
  """
31
+ current_timestamp = str(int(round(time.time() * 1000, 0)))
21
32
  url = "https://88.push2.eastmoney.com/api/qt/clist/get"
22
33
  params = {
23
- "pn": "1",
34
+ "pn": str(pn),
24
35
  "pz": "5000",
25
36
  "po": "1",
26
37
  "np": "3",
@@ -38,165 +49,197 @@ def fund_etf_spot_em() -> pd.DataFrame:
38
49
  "f72,f75,f78,f81,f84,f87,f115,f124,f128,"
39
50
  "f136,f152,f184,f297,f402,f441"
40
51
  ),
41
- "_": "1672806290972",
52
+ "_": str(current_timestamp),
42
53
  }
43
- r = requests.get(url, timeout=15, params=params)
44
- data_json = r.json()
45
- temp_df = pd.DataFrame(data_json["data"]["diff"])
46
- temp_df.rename(
47
- columns={
48
- "f26": "上市时间",
49
- "f12": "代码",
50
- "f14": "名称",
51
- "f2": "最新价",
52
- "f4": "涨跌额",
53
- "f3": "涨跌幅",
54
- "f5": "成交量",
55
- "f6": "成交额",
56
- "f7": "振幅",
57
- "f17": "开盘价",
58
- "f15": "最高价",
59
- "f16": "最低价",
60
- "f18": "昨收",
61
- "f8": "换手率",
62
- "f10": "量比",
63
- "f30": "现手",
64
- "f31": "买一",
65
- "f32": "卖一",
66
- "f33": "委比",
67
- "f34": "外盘",
68
- "f35": "内盘",
69
- "f62": "主力净流入-净额",
70
- "f184": "主力净流入-净占比",
71
- "f66": "超大单净流入-净额",
72
- "f69": "超大单净流入-净占比",
73
- "f72": "大单净流入-净额",
74
- "f75": "大单净流入-净占比",
75
- "f78": "中单净流入-净额",
76
- "f81": "中单净流入-净占比",
77
- "f84": "小单净流入-净额",
78
- "f87": "小单净流入-净占比",
79
- "f38": "最新份额",
80
- "f21": "流通市值",
81
- "f20": "总市值",
82
- "f402": "基金折价率",
83
- "f441": "IOPV实时估值",
84
- "f297": "数据日期",
85
- "f124": "更新时间",
86
- "f13": "market"
87
- },
88
- inplace=True,
89
- )
90
- temp_df = temp_df[
91
- [
92
- "代码",
93
- "名称",
94
- "最新价",
95
- "IOPV实时估值",
96
- "基金折价率",
97
- "涨跌额",
98
- "涨跌幅",
99
- "成交量",
100
- "成交额",
101
- "开盘价",
102
- "最高价",
103
- "最低价",
104
- "昨收",
105
- "振幅",
106
- "换手率",
107
- "量比",
108
- "委比",
109
- "外盘",
110
- "内盘",
111
- "主力净流入-净额",
112
- "主力净流入-净占比",
113
- "超大单净流入-净额",
114
- "超大单净流入-净占比",
115
- "大单净流入-净额",
116
- "大单净流入-净占比",
117
- "中单净流入-净额",
118
- "中单净流入-净占比",
119
- "小单净流入-净额",
120
- "小单净流入-净占比",
121
- "现手",
122
- "买一",
123
- "卖一",
124
- "最新份额",
125
- "流通市值",
126
- "总市值",
127
- "数据日期",
128
- "更新时间",
129
- "market",
130
- "上市时间"
54
+ try:
55
+ r = requests.get(url, timeout=15, params=params)
56
+ data_json = r.json()
57
+ temp_df = pd.DataFrame(data_json["data"]["diff"])
58
+ temp_df.rename(
59
+ columns={
60
+ "f26": "上市时间",
61
+ "f12": "代码",
62
+ "f14": "名称",
63
+ "f2": "最新价",
64
+ "f4": "涨跌额",
65
+ "f3": "涨跌幅",
66
+ "f5": "成交量",
67
+ "f6": "成交额",
68
+ "f7": "振幅",
69
+ "f17": "开盘价",
70
+ "f15": "最高价",
71
+ "f16": "最低价",
72
+ "f18": "昨收",
73
+ "f8": "换手率",
74
+ "f10": "量比",
75
+ "f30": "现手",
76
+ "f31": "买一",
77
+ "f32": "卖一",
78
+ "f33": "委比",
79
+ "f34": "外盘",
80
+ "f35": "内盘",
81
+ "f62": "主力净流入-净额",
82
+ "f184": "主力净流入-净占比",
83
+ "f66": "超大单净流入-净额",
84
+ "f69": "超大单净流入-净占比",
85
+ "f72": "大单净流入-净额",
86
+ "f75": "大单净流入-净占比",
87
+ "f78": "中单净流入-净额",
88
+ "f81": "中单净流入-净占比",
89
+ "f84": "小单净流入-净额",
90
+ "f87": "小单净流入-净占比",
91
+ "f38": "最新份额",
92
+ "f21": "流通市值",
93
+ "f20": "总市值",
94
+ "f402": "基金折价率",
95
+ "f441": "IOPV实时估值",
96
+ "f297": "数据日期",
97
+ "f124": "更新时间",
98
+ "f13": "market"
99
+ },
100
+ inplace=True,
101
+ )
102
+ temp_df = temp_df[
103
+ [
104
+ "代码",
105
+ "名称",
106
+ "最新价",
107
+ "IOPV实时估值",
108
+ "基金折价率",
109
+ "涨跌额",
110
+ "涨跌幅",
111
+ "成交量",
112
+ "成交额",
113
+ "开盘价",
114
+ "最高价",
115
+ "最低价",
116
+ "昨收",
117
+ "振幅",
118
+ "换手率",
119
+ "量比",
120
+ "委比",
121
+ "外盘",
122
+ "内盘",
123
+ "主力净流入-净额",
124
+ "主力净流入-净占比",
125
+ "超大单净流入-净额",
126
+ "超大单净流入-净占比",
127
+ "大单净流入-净额",
128
+ "大单净流入-净占比",
129
+ "中单净流入-净额",
130
+ "中单净流入-净占比",
131
+ "小单净流入-净额",
132
+ "小单净流入-净占比",
133
+ "现手",
134
+ "买一",
135
+ "卖一",
136
+ "最新份额",
137
+ "流通市值",
138
+ "总市值",
139
+ "数据日期",
140
+ "更新时间",
141
+ "market",
142
+ "上市时间"
143
+ ]
131
144
  ]
132
- ]
133
- temp_df["最新价"] = pd.to_numeric(temp_df["最新价"], errors="coerce")
134
- temp_df["涨跌额"] = pd.to_numeric(temp_df["涨跌额"], errors="coerce")
135
- temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce")
136
- temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
137
- temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce")
138
- temp_df["开盘价"] = pd.to_numeric(temp_df["开盘价"], errors="coerce")
139
- temp_df["最高价"] = pd.to_numeric(temp_df["最高价"], errors="coerce")
140
- temp_df["最低价"] = pd.to_numeric(temp_df["最低价"], errors="coerce")
141
- temp_df["昨收"] = pd.to_numeric(temp_df["昨收"], errors="coerce")
142
- temp_df["换手率"] = pd.to_numeric(temp_df["换手率"], errors="coerce")
143
- temp_df["量比"] = pd.to_numeric(temp_df["量比"], errors="coerce")
144
- temp_df["委比"] = pd.to_numeric(temp_df["委比"], errors="coerce")
145
- temp_df["外盘"] = pd.to_numeric(temp_df["外盘"], errors="coerce")
146
- temp_df["内盘"] = pd.to_numeric(temp_df["内盘"], errors="coerce")
147
- temp_df["流通市值"] = pd.to_numeric(temp_df["流通市值"], errors="coerce")
148
- temp_df["总市值"] = pd.to_numeric(temp_df["总市值"], errors="coerce")
149
- temp_df["振幅"] = pd.to_numeric(temp_df["振幅"], errors="coerce")
150
- temp_df["现手"] = pd.to_numeric(temp_df["现手"], errors="coerce")
151
- temp_df["买一"] = pd.to_numeric(temp_df["买一"], errors="coerce")
152
- temp_df["卖一"] = pd.to_numeric(temp_df["卖一"], errors="coerce")
153
- temp_df["最新份额"] = pd.to_numeric(temp_df["最新份额"], errors="coerce")
154
- temp_df["IOPV实时估值"] = pd.to_numeric(temp_df["IOPV实时估值"], errors="coerce")
155
- temp_df["基金折价率"] = pd.to_numeric(temp_df["基金折价率"], errors="coerce")
156
- temp_df["主力净流入-净额"] = pd.to_numeric(
157
- temp_df["主力净流入-净额"], errors="coerce"
158
- )
159
- temp_df["主力净流入-净占比"] = pd.to_numeric(
160
- temp_df["主力净流入-净占比"], errors="coerce"
161
- )
162
- temp_df["超大单净流入-净额"] = pd.to_numeric(
163
- temp_df["超大单净流入-净额"], errors="coerce"
164
- )
165
- temp_df["超大单净流入-净占比"] = pd.to_numeric(
166
- temp_df["超大单净流入-净占比"], errors="coerce"
167
- )
168
- temp_df["大单净流入-净额"] = pd.to_numeric(
169
- temp_df["大单净流入-净额"], errors="coerce"
170
- )
171
- temp_df["大单净流入-净占比"] = pd.to_numeric(
172
- temp_df["大单净流入-净占比"], errors="coerce"
173
- )
174
- temp_df["中单净流入-净额"] = pd.to_numeric(
175
- temp_df["中单净流入-净额"], errors="coerce"
176
- )
177
- temp_df["中单净流入-净占比"] = pd.to_numeric(
178
- temp_df["中单净流入-净占比"], errors="coerce"
179
- )
180
- temp_df["小单净流入-净额"] = pd.to_numeric(
181
- temp_df["小单净流入-净额"], errors="coerce"
182
- )
183
- temp_df["小单净流入-净占比"] = pd.to_numeric(
184
- temp_df["小单净流入-净占比"], errors="coerce"
185
- )
186
- temp_df["数据日期"] = pd.to_datetime(
187
- temp_df["数据日期"], format="%Y%m%d", errors="coerce"
188
- )
189
- temp_df["更新时间"] = (
190
- pd.to_datetime(temp_df["更新时间"], unit="s", errors="coerce")
191
- .dt.tz_localize("UTC")
192
- .dt.tz_convert("Asia/Shanghai")
193
- )
145
+ temp_df["最新价"] = pd.to_numeric(temp_df["最新价"], errors="coerce")
146
+ temp_df["涨跌额"] = pd.to_numeric(temp_df["涨跌额"], errors="coerce")
147
+ temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce")
148
+ temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
149
+ temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce")
150
+ temp_df["开盘价"] = pd.to_numeric(temp_df["开盘价"], errors="coerce")
151
+ temp_df["最高价"] = pd.to_numeric(temp_df["最高价"], errors="coerce")
152
+ temp_df["最低价"] = pd.to_numeric(temp_df["最低价"], errors="coerce")
153
+ temp_df["昨收"] = pd.to_numeric(temp_df["昨收"], errors="coerce")
154
+ temp_df["换手率"] = pd.to_numeric(temp_df["换手率"], errors="coerce")
155
+ temp_df["量比"] = pd.to_numeric(temp_df["量比"], errors="coerce")
156
+ temp_df["委比"] = pd.to_numeric(temp_df["委比"], errors="coerce")
157
+ temp_df["外盘"] = pd.to_numeric(temp_df["外盘"], errors="coerce")
158
+ temp_df["内盘"] = pd.to_numeric(temp_df["内盘"], errors="coerce")
159
+ temp_df["流通市值"] = pd.to_numeric(temp_df["流通市值"], errors="coerce")
160
+ temp_df["总市值"] = pd.to_numeric(temp_df["总市值"], errors="coerce")
161
+ temp_df["振幅"] = pd.to_numeric(temp_df["振幅"], errors="coerce")
162
+ temp_df["现手"] = pd.to_numeric(temp_df["现手"], errors="coerce")
163
+ temp_df["买一"] = pd.to_numeric(temp_df["买一"], errors="coerce")
164
+ temp_df["卖一"] = pd.to_numeric(temp_df["卖一"], errors="coerce")
165
+ temp_df["最新份额"] = pd.to_numeric(temp_df["最新份额"], errors="coerce")
166
+ temp_df["IOPV实时估值"] = pd.to_numeric(temp_df["IOPV实时估值"], errors="coerce")
167
+ temp_df["基金折价率"] = pd.to_numeric(temp_df["基金折价率"], errors="coerce")
168
+ temp_df["主力净流入-净额"] = pd.to_numeric(
169
+ temp_df["主力净流入-净额"], errors="coerce"
170
+ )
171
+ temp_df["主力净流入-净占比"] = pd.to_numeric(
172
+ temp_df["主力净流入-净占比"], errors="coerce"
173
+ )
174
+ temp_df["超大单净流入-净额"] = pd.to_numeric(
175
+ temp_df["超大单净流入-净额"], errors="coerce"
176
+ )
177
+ temp_df["超大单净流入-净占比"] = pd.to_numeric(
178
+ temp_df["超大单净流入-净占比"], errors="coerce"
179
+ )
180
+ temp_df["大单净流入-净额"] = pd.to_numeric(
181
+ temp_df["大单净流入-净额"], errors="coerce"
182
+ )
183
+ temp_df["大单净流入-净占比"] = pd.to_numeric(
184
+ temp_df["大单净流入-净占比"], errors="coerce"
185
+ )
186
+ temp_df["中单净流入-净额"] = pd.to_numeric(
187
+ temp_df["中单净流入-净额"], errors="coerce"
188
+ )
189
+ temp_df["中单净流入-净占比"] = pd.to_numeric(
190
+ temp_df["中单净流入-净占比"], errors="coerce"
191
+ )
192
+ temp_df["小单净流入-净额"] = pd.to_numeric(
193
+ temp_df["小单净流入-净额"], errors="coerce"
194
+ )
195
+ temp_df["小单净流入-净占比"] = pd.to_numeric(
196
+ temp_df["小单净流入-净占比"], errors="coerce"
197
+ )
198
+ temp_df["数据日期"] = pd.to_datetime(
199
+ temp_df["数据日期"], format="%Y%m%d", errors="coerce"
200
+ )
201
+ temp_df["更新时间"] = (
202
+ pd.to_datetime(temp_df["更新时间"], unit="s", errors="coerce")
203
+ .dt.tz_localize("UTC")
204
+ .dt.tz_convert("Asia/Shanghai")
205
+ )
194
206
 
195
- return temp_df
207
+ return temp_df
208
+ except Exception as e:
209
+ logger.error("获取ETF列表,实时行情异常:{}", e)
210
+ return pd.DataFrame()
196
211
 
197
212
 
198
- def get_etf_real_time_quotes():
199
- fund_etf_spot_em_df = fund_etf_spot_em()
213
+ def thread_pool_executor():
214
+ """
215
+ 使用多线程获取所有ETF数据
216
+ """
217
+ # 计算总页数,假设总共有1000条数据,每页200条
218
+
219
+ per_page = page_number
220
+ total_pages = (max_number + per_page - 1) // per_page # 向上取整
221
+
222
+ # 创建线程池
223
+ with ThreadPoolExecutor(max_workers=3) as executor:
224
+ # 提交任务,获取每页数据
225
+ futures = [executor.submit(get_fund_etf_page_df, pn)
226
+ for pn in range(1, total_pages + 1)]
227
+
228
+ # 收集结果
229
+ results = []
230
+ for future in futures:
231
+ result = future.result()
232
+ if not result.empty:
233
+ results.append(result)
234
+
235
+ # 合并所有页面的数据
236
+ if results:
237
+ return pd.concat(results, ignore_index=True)
238
+ else:
239
+ return pd.DataFrame()
240
+
241
+
242
+ def rename_etf(fund_etf_spot_em_df):
200
243
  fund_etf_spot_em_df = fund_etf_spot_em_df.rename(columns={
201
244
  "上市时间": "list_date",
202
245
  "最新价": "now_price",
@@ -298,13 +341,21 @@ def get_etf_real_time_quotes():
298
341
  return fund_etf_spot_em_df
299
342
 
300
343
 
344
+ def get_etf_real_time_quotes():
345
+ # 获取第一页数据
346
+ page_one_df = get_fund_etf_page_df(1)
347
+ # 数据接口正常返回5600以上的数量
348
+ if page_one_df.shape[0] > min_number:
349
+ page_one_df = rename_etf(page_one_df)
350
+ return page_one_df
351
+ else:
352
+ page_df = thread_pool_executor()
353
+ page_df = rename_etf(page_df)
354
+ return page_df
355
+
356
+
301
357
  if __name__ == '__main__':
302
358
  fund_etf_df = get_etf_real_time_quotes()
303
359
  fund_etf_df = fund_etf_df.sort_values(by=['amount'], ascending=False)
304
360
  fund_etf_df = fund_etf_df.fillna(0)
305
361
  print(fund_etf_df)
306
-
307
- import akshare as ak
308
-
309
- fund_lof_spot_em_df = ak.fund_lof_spot_em()
310
- print(fund_lof_spot_em_df)