tushare 1.4.18__py3-none-any.whl → 1.4.20__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.
tushare/__init__.py CHANGED
@@ -2,7 +2,7 @@
2
2
  import codecs
3
3
  import os
4
4
 
5
- __version__ = '1.4.18'
5
+ __version__ = '1.4.20'
6
6
  __author__ = 'Jimmy Liu'
7
7
 
8
8
  """
tushare/stock/rtq.py CHANGED
@@ -182,7 +182,7 @@ def realtime_list(src: Optional[str] = None, interval: Optional[int] = 3,
182
182
  10、最高:HIGH
183
183
  11、最低:LOW
184
184
  12、今开:OPEN
185
- 13、昨收:PRE_CLOSE
185
+ 13、昨收:PRICE
186
186
  14、量比:VOL_RATIO
187
187
  15、换手率:TURNOVER_RATE
188
188
  16、市盈率-动态:PE
@@ -201,7 +201,7 @@ def realtime_list(src: Optional[str] = None, interval: Optional[int] = 3,
201
201
  5、涨跌幅:PCT_CHANGE
202
202
  6、买入:BUY
203
203
  7、卖出:SALE
204
- 8、昨收:PRE_CLOSE
204
+ 8、昨收:CLOSE
205
205
  9、今开:OPEN
206
206
  10、最高:HIGH
207
207
  11、最低:LOW
@@ -249,146 +249,155 @@ def get_stock_all_a_dc(page_count: Optional[int] = None,
249
249
  22、60日涨跌幅:60DAY
250
250
  23、年初至今涨跌幅:1YEAR
251
251
  """
252
- url = "http://82.push2.eastmoney.com/api/qt/clist/get"
253
- params = {
254
- "pn": "1",
255
- "pz": "50000",
256
- "po": "1",
257
- "np": "1",
258
- "ut": "bd1d9ddb04089700cf9c27f6f7426281",
259
- "fltt": "2",
260
- "invt": "2",
261
- "fid": "f3",
262
- "fs": "m:0 t:6,m:0 t:80,m:1 t:2,m:1 t:23,m:0 t:81 s:2048",
263
- "fields": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152",
264
- "_": "1623833739532",
265
- }
266
- if page_count:
267
- params["pz"] = 20
268
- r = requests.get(url, params=params, proxies=proxies)
269
- data_json = r.json()
270
- if not data_json["data"]["diff"]:
271
- return pd.DataFrame()
272
- temp_df = pd.DataFrame(data_json["data"]["diff"])
273
- temp_df.columns = [
274
- "_",
275
- "最新价",
276
- "涨跌幅",
277
- "涨跌额",
278
- "成交量",
279
- "成交额",
280
- "振幅",
281
- "换手率",
282
- "市盈率-动态",
283
- "量比",
284
- "5分钟涨跌",
285
- "代码",
286
- "_",
287
- "名称",
288
- "最高",
289
- "最低",
290
- "今开",
291
- "昨收",
292
- "总市值",
293
- "流通市值",
294
- "涨速",
295
- "市净率",
296
- "60日涨跌幅",
297
- "年初至今涨跌幅",
298
- "-",
299
- "-",
300
- "-",
301
- "-",
302
- "-",
303
- "-",
304
- "-",
305
- ]
306
- temp_df.reset_index(inplace=True)
307
- # temp_df["index"] = temp_df.index + 1
308
- # temp_df.rename(columns={"index": "序号"}, inplace=True)
309
- temp_df = temp_df[
310
- [
311
- # "序号",
312
- "代码",
313
- "名称",
252
+ dfs = []
253
+ for page in range(1,500):
254
+ url = "http://82.push2.eastmoney.com/api/qt/clist/get"
255
+ params = {
256
+ "pn": page,
257
+ "pz": "200",
258
+ "po": "1",
259
+ "np": "1",
260
+ "ut": "bd1d9ddb04089700cf9c27f6f7426281",
261
+ "fltt": "2",
262
+ "invt": "2",
263
+ "fid": "f3",
264
+ "fs": "m:0 t:6,m:0 t:80,m:1 t:2,m:1 t:23,m:0 t:81 s:2048",
265
+ "fields": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152",
266
+ "_": "1623833739532",
267
+ }
268
+ if page_count:
269
+ params["pz"] = 20
270
+ r = requests.get(url, params=params, proxies=proxies)
271
+ data_json = r.json()
272
+ if not data_json["data"]:
273
+ break
274
+ # return pd.DataFrame()
275
+ temp_df = pd.DataFrame(data_json["data"]["diff"])
276
+ temp_df.columns = [
277
+ "_",
314
278
  "最新价",
315
279
  "涨跌幅",
316
280
  "涨跌额",
317
281
  "成交量",
318
282
  "成交额",
319
283
  "振幅",
284
+ "换手率",
285
+ "市盈率-动态",
286
+ "量比",
287
+ "5分钟涨跌",
288
+ "代码",
289
+ "_",
290
+ "名称",
320
291
  "最高",
321
292
  "最低",
322
293
  "今开",
323
294
  "昨收",
324
- "量比",
325
- "换手率",
326
- "市盈率-动态",
327
- "市净率",
328
295
  "总市值",
329
296
  "流通市值",
330
297
  "涨速",
331
- "5分钟涨跌",
298
+ "市净率",
332
299
  "60日涨跌幅",
333
300
  "年初至今涨跌幅",
301
+ "-",
302
+ "-",
303
+ "-",
304
+ "-",
305
+ "-",
306
+ "-",
307
+ "-",
308
+ ]
309
+ temp_df.reset_index(inplace=True)
310
+ # temp_df["index"] = temp_df.index + 1
311
+ # temp_df.rename(columns={"index": "序号"}, inplace=True)
312
+ temp_df = temp_df[
313
+ [
314
+ # "序号",
315
+ "代码",
316
+ "名称",
317
+ "最新价",
318
+ "涨跌幅",
319
+ "涨跌额",
320
+ "成交量",
321
+ "成交额",
322
+ "振幅",
323
+ "最高",
324
+ "最低",
325
+ "今开",
326
+ "昨收",
327
+ "量比",
328
+ "换手率",
329
+ "市盈率-动态",
330
+ "市净率",
331
+ "总市值",
332
+ "流通市值",
333
+ "涨速",
334
+ "5分钟涨跌",
335
+ "60日涨跌幅",
336
+ "年初至今涨跌幅",
337
+ ]
334
338
  ]
335
- ]
336
339
 
337
- temp_df["代码"] = temp_df["代码"].apply(format_stock_code)
338
- temp_df["最新价"] = pd.to_numeric(temp_df["最新价"], errors="coerce")
339
- temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce")
340
- temp_df["涨跌额"] = pd.to_numeric(temp_df["涨跌额"], errors="coerce")
341
- temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
342
- temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce")
343
- temp_df["振幅"] = pd.to_numeric(temp_df["振幅"], errors="coerce")
344
- temp_df["最高"] = pd.to_numeric(temp_df["最高"], errors="coerce")
345
- temp_df["最低"] = pd.to_numeric(temp_df["最低"], errors="coerce")
346
- temp_df["今开"] = pd.to_numeric(temp_df["今开"], errors="coerce")
347
- temp_df["昨收"] = pd.to_numeric(temp_df["昨收"], errors="coerce")
348
- temp_df["量比"] = pd.to_numeric(temp_df["量比"], errors="coerce")
349
- temp_df["换手率"] = pd.to_numeric(temp_df["换手率"], errors="coerce")
350
- temp_df["市盈率-动态"] = pd.to_numeric(temp_df["市盈率-动态"], errors="coerce")
351
- temp_df["市净率"] = pd.to_numeric(temp_df["市净率"], errors="coerce")
352
- temp_df["总市值"] = pd.to_numeric(temp_df["总市值"], errors="coerce")
353
- temp_df["流通市值"] = pd.to_numeric(temp_df["流通市值"], errors="coerce")
354
- temp_df["涨速"] = pd.to_numeric(temp_df["涨速"], errors="coerce")
355
- temp_df["5分钟涨跌"] = pd.to_numeric(temp_df["5分钟涨跌"], errors="coerce")
356
- temp_df["60日涨跌幅"] = pd.to_numeric(temp_df["60日涨跌幅"], errors="coerce")
357
- temp_df["年初至今涨跌幅"] = pd.to_numeric(temp_df["年初至今涨跌幅"], errors="coerce")
358
- temp_df.columns = [
359
- # "RANK",
360
- "TS_CODE",
361
- "NAME",
362
- "CLOSE",
363
- "PCT_CHANGE",
364
- "CHANGE",
365
- "VOLUME",
366
- "AMOUNT",
367
- "SWING",
368
- "HIGH",
369
- "LOW",
370
- "OPEN",
371
- "PRE_CLOSE",
372
- "VOL_RATIO",
373
- "TURNOVER_RATE",
374
- "PE",
375
- "PB",
376
- "TOTAL_MV",
377
- "FLOAT_MV",
378
- "RISE",
379
- "5MIN",
380
- "60DAY",
381
- "1YEAR",
382
- ]
383
- # 指定要转换为 float 类型的列
384
- cols_to_convert = ['CLOSE', 'PCT_CHANGE', 'CHANGE', "VOLUME", "AMOUNT", "SWING",
385
- 'HIGH', "LOW", "OPEN", "PRE_CLOSE", "VOL_RATIO", "TURNOVER_RATE", "PE", "PB", "TOTAL_MV", "FLOAT_MV",
386
- "RISE", "5MIN", "60DAY", "1YEAR"
387
- ]
388
- # 使用 to_numeric() 方法将指定的列转换为 float 类型,并将非数值类型的数据转换为 NaN
389
- temp_df[cols_to_convert] = temp_df[cols_to_convert].apply(pd.to_numeric, errors='coerce')
340
+ temp_df["代码"] = temp_df["代码"].apply(format_stock_code)
341
+ temp_df["最新价"] = pd.to_numeric(temp_df["最新价"], errors="coerce")
342
+ temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce")
343
+ temp_df["涨跌额"] = pd.to_numeric(temp_df["涨跌额"], errors="coerce")
344
+ temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
345
+ temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce")
346
+ temp_df["振幅"] = pd.to_numeric(temp_df["振幅"], errors="coerce")
347
+ temp_df["最高"] = pd.to_numeric(temp_df["最高"], errors="coerce")
348
+ temp_df["最低"] = pd.to_numeric(temp_df["最低"], errors="coerce")
349
+ temp_df["今开"] = pd.to_numeric(temp_df["今开"], errors="coerce")
350
+ temp_df["昨收"] = pd.to_numeric(temp_df["昨收"], errors="coerce")
351
+ temp_df["量比"] = pd.to_numeric(temp_df["量比"], errors="coerce")
352
+ temp_df["换手率"] = pd.to_numeric(temp_df["换手率"], errors="coerce")
353
+ temp_df["市盈率-动态"] = pd.to_numeric(temp_df["市盈率-动态"], errors="coerce")
354
+ temp_df["市净率"] = pd.to_numeric(temp_df["市净率"], errors="coerce")
355
+ temp_df["总市值"] = pd.to_numeric(temp_df["总市值"], errors="coerce")
356
+ temp_df["流通市值"] = pd.to_numeric(temp_df["流通市值"], errors="coerce")
357
+ temp_df["涨速"] = pd.to_numeric(temp_df["涨速"], errors="coerce")
358
+ temp_df["5分钟涨跌"] = pd.to_numeric(temp_df["5分钟涨跌"], errors="coerce")
359
+ temp_df["60日涨跌幅"] = pd.to_numeric(temp_df["60日涨跌幅"], errors="coerce")
360
+ temp_df["年初至今涨跌幅"] = pd.to_numeric(temp_df["年初至今涨跌幅"], errors="coerce")
361
+ temp_df.columns = [
362
+ # "RANK",
363
+ "TS_CODE",
364
+ "NAME",
365
+ "PRICE",
366
+ "PCT_CHANGE",
367
+ "CHANGE",
368
+ "VOLUME",
369
+ "AMOUNT",
370
+ "SWING",
371
+ "HIGH",
372
+ "LOW",
373
+ "OPEN",
374
+ "CLOSE",
375
+ "VOL_RATIO",
376
+ "TURNOVER_RATE",
377
+ "PE",
378
+ "PB",
379
+ "TOTAL_MV",
380
+ "FLOAT_MV",
381
+ "RISE",
382
+ "5MIN",
383
+ "60DAY",
384
+ "1YEAR",
385
+ ]
386
+ # 指定要转换为 float 类型的列
387
+ cols_to_convert = ['PRICE', 'PCT_CHANGE', 'CHANGE', "VOLUME", "AMOUNT", "SWING",
388
+ 'HIGH', "LOW", "OPEN", "CLOSE", "VOL_RATIO", "TURNOVER_RATE", "PE", "PB", "TOTAL_MV", "FLOAT_MV",
389
+ "RISE", "5MIN", "60DAY", "1YEAR"
390
+ ]
391
+ # 使用 to_numeric() 方法将指定的列转换为 float 类型,并将非数值类型的数据转换为 NaN
392
+ temp_df[cols_to_convert] = temp_df[cols_to_convert].apply(pd.to_numeric, errors='coerce')
393
+ dfs.append(
394
+ temp_df
395
+ )
396
+ if page_count:
397
+ break
398
+ result_df = pd.concat(dfs, ignore_index=True)
390
399
  # 使用 fillna() 方法将 NaN 值替换为 0
391
- df_filled = temp_df.fillna(0)
400
+ df_filled = result_df.fillna(0)
392
401
  df_sorted = df_filled.sort_values(by='PCT_CHANGE', ascending=False).reset_index(drop=True)
393
402
  return df_sorted
394
403
 
@@ -420,12 +429,12 @@ def get_stock_all_a_sina(interval: Optional[int] = 3, page_count: Optional[int]
420
429
  :rtype: pandas.DataFrame
421
430
  1、代码:TS_CODE
422
431
  2、名称:NAME
423
- 3、最新价:CLOSE
432
+ 3、最新价:PRICE
424
433
  4、涨跌额:CHANGE
425
434
  5、涨跌幅:PCT_CHANGE
426
435
  6、买入:BUY
427
436
  7、卖出:SALE
428
- 8、昨收:PRE_CLOSE
437
+ 8、昨收:CLOSE
429
438
  9、今开:OPEN
430
439
  10、最高:HIGH
431
440
  11、最低:LOW
@@ -519,12 +528,12 @@ def get_stock_all_a_sina(interval: Optional[int] = 3, page_count: Optional[int]
519
528
  big_df.columns = [
520
529
  "TS_CODE",
521
530
  "NAME",
522
- "CLOSE",
531
+ "PRICE",
523
532
  "CHANGE",
524
533
  "PCT_CHANGE",
525
534
  "BUY",
526
535
  "SALE",
527
- "PRE_CLOSE",
536
+ "CLOSE",
528
537
  "OPEN",
529
538
  "HIGH",
530
539
  "LOW",
@@ -636,16 +645,17 @@ def format_str_to_float(x):
636
645
 
637
646
  if __name__ == '__main__':
638
647
  # df = realtime_quote(ts_code="000688.SH,000010.SH,000012.SH,399005.SZ", src="sina")
639
- # df = realtime_list(src="sina", page_count=1)
640
- # print(df)
648
+ # df = realtime_list(src="dc", page_count=1)
649
+ df = realtime_list(src="dc")
650
+ print(df)
641
651
  # ts_code = '399005.SZ'
642
652
  # ts_code = '000001.SZ'
643
653
  # # ts_code = '836149.BJ'
644
654
  # # ts_code = '600000.SH'
645
655
  # # ts_code = '000001.SH'
646
656
  # # ts_code = '000010.SH'
647
- ts_code = '600148.SH'
648
- df = realtime_quote(src="dc", ts_code=ts_code)
649
- print(df)
657
+ # ts_code = '600148.SH'
658
+ # df = realtime_quote(src="dc", ts_code=ts_code)
659
+ # print(df)
650
660
 
651
661
 
@@ -44,15 +44,12 @@ def format_stock_code(x, special=""):
44
44
  return '%s.SZ' % x
45
45
  if not x[0].isdigit():
46
46
  return x.upper()
47
- if str(x[0:3]) in ['920']:
47
+ if str(x[0:3]) in ['920'] or str(x[0]) in ['8', '4']:
48
48
  x = x.zfill(stock_len) if len(x) < stock_len else x
49
49
  return '%s.BJ' % x
50
- if str(x[0]) in ['5', '6', '9']:
50
+ if str(x[0]) in ['5', '6'] or str(x[0:3]) in ['900']:
51
51
  x = x.zfill(stock_len) if len(x) < stock_len else x
52
52
  return '%s.SH' % x
53
- elif str(x[0]) in ['8', '4']:
54
- x = x.zfill(stock_len) if len(x) < stock_len else x
55
- return '%s.BJ' % x
56
53
  else:
57
54
  x = x.zfill(stock_len) if len(x) < stock_len else x
58
55
  return '%s.SZ' % x
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tushare
3
- Version: 1.4.18
3
+ Version: 1.4.20
4
4
  Summary: A utility for crawling historical and Real-time Quotes data of China stocks
5
5
  Home-page: https://tushare.pro
6
6
  Author: Jimmy Liu
@@ -80,6 +80,14 @@ return::
80
80
 
81
81
  Log
82
82
  --------------
83
+ 1.4.20
84
+ -------
85
+ - 修复 realtime_list 数值对应问题 close->price pre_close->close
86
+ --------------
87
+ 1.4.19
88
+ -------
89
+ - 修复 realtime_list 返回数据不全的问题
90
+ -------
83
91
  1.4.17
84
92
  -------
85
93
  - 修复 920 开头更改是北交所
@@ -1,4 +1,4 @@
1
- tushare/__init__.py,sha256=2L3HKsXb_jdZ_osmal0V9cG7Glc85chMkAFchG_1XeY,4778
1
+ tushare/__init__.py,sha256=1-G9qQDj8PWK8k29c1Ue5maW2VSlZG28yARU928j2Ak,4778
2
2
  tushare/bond/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  tushare/bond/bonds.py,sha256=PJM0xDiWZDpOPwDtbEU9PdP0M_Gu0c599YuB1rbZ3r8,232
4
4
  tushare/coins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -35,7 +35,7 @@ tushare/stock/news_vars.py,sha256=CQ18hvyoeScelBCqKgF_rgAufoEALAUT8y_LERvZKHk,45
35
35
  tushare/stock/newsevent.py,sha256=STR7C8MjtZlaXTCG0QNaojBuK4-oxP_8hT7ZIvRpbiI,6944
36
36
  tushare/stock/ref_vars.py,sha256=MIxor-2rISl65I32vUzC-z7ZC_QFzG4sxOKDyjLWuU4,4449
37
37
  tushare/stock/reference.py,sha256=x_HZlrP58T-5OTZ7SLdf2Dh9THj1h7cT4wcIp42IHFI,38227
38
- tushare/stock/rtq.py,sha256=uMljEz2030OE-i_JAkeSwM1gghK4g5omTx4mC0EqTVc,23159
38
+ tushare/stock/rtq.py,sha256=9AFwrtdvj5v6xXY2DO502BdAdvmBu1LMZdPSU6J2V4I,23925
39
39
  tushare/stock/rtq_vars.py,sha256=V6LeJkSP76z8veRfP_mGiQ63V5YBHoTMaqUA5hSBWh4,4200
40
40
  tushare/stock/shibor.py,sha256=Fx9OUZ429kz6l7ZdaYSD6p_X79ud69PDM9EZogm8xCY,6422
41
41
  tushare/stock/trading.py,sha256=3bvM4pexEYW-uGGEL7g6Vkte4sqGC1iYO6dC8mGLSdM,55619
@@ -61,7 +61,7 @@ tushare/util/common.py,sha256=KG86VdlhfnOf0j6SE2bBeowC_7Z54RqWpVnudS6KvEU,2581
61
61
  tushare/util/conns.py,sha256=mkcxGGD7-13GXMlrwmo4LMecmgWdm63I8KDpvcW53cI,1456
62
62
  tushare/util/dateu.py,sha256=YSvPvOlMY0qvT2IDwFNOHxTLBrPQ9ULGO7ljfu9tK3s,2931
63
63
  tushare/util/form_date.py,sha256=4nnjp6xo40FftsRP9YY1FJoPErxaWVCkjIp_3O1Qy7M,1119
64
- tushare/util/format_stock_code.py,sha256=5uQngRIqN6pzEHtI-AX_oBdHxRdOVpAvA_S41mCUY5I,3639
64
+ tushare/util/format_stock_code.py,sha256=co-CSYYu7m7B5W2guWeo4AHMu0fov8PRdy5gdGiGzIg,3563
65
65
  tushare/util/formula.py,sha256=XZVK1NTF8BTrCo78EHLzjAM_wLAjxybrN7Q-6HCHmCo,6863
66
66
  tushare/util/mailmerge.py,sha256=y_QkfHvH8nQ7peC8wQs5idB6xW9PYzzrBynzxgo924M,8980
67
67
  tushare/util/netbase.py,sha256=URvOTLJSgO7e6uCmHHD9EeQ2TRvjpxIEF-wQaWx5cKE,942
@@ -72,8 +72,8 @@ tushare/util/verify_token.py,sha256=cuV3RErWbOC318NANCYL6K1LKZ3wSAL2yMwZHA7tD3s,
72
72
  tushare/util/protobuf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
73
  tushare/util/protobuf/funcs.py,sha256=UCdK8FxTyjPZsNzoEeXqYzqrQXUmRMvW5hua6GPA66A,779
74
74
  tushare/util/protobuf/response_pb2.py,sha256=vJH9ONkDuJlg6y-q1PvuDZoviKrK7hzNtMieQHK45DI,11347
75
- tushare-1.4.18.dist-info/LICENSE,sha256=C2j55UI0Ul-1-wA1-rn7OaY6b3vGl4YukiyvYzHsU9o,1503
76
- tushare-1.4.18.dist-info/METADATA,sha256=CVHRLIhtj6fvzzYRjivj5_Z71cZFIKuInm9IY7E1nUE,3030
77
- tushare-1.4.18.dist-info/WHEEL,sha256=Wyh-_nZ0DJYolHNn1_hMa4lM7uDedD_RGVwbmTjyItk,91
78
- tushare-1.4.18.dist-info/top_level.txt,sha256=HHOxMuqc31KuAIcxpE0t5dAPMKbaiRtjsjTMFd7FlXI,8
79
- tushare-1.4.18.dist-info/RECORD,,
75
+ tushare-1.4.20.dist-info/LICENSE,sha256=C2j55UI0Ul-1-wA1-rn7OaY6b3vGl4YukiyvYzHsU9o,1503
76
+ tushare-1.4.20.dist-info/METADATA,sha256=CynEim02cLXJTw0u1KcZks_yTYH3uB7tYsrY-J0chNs,3216
77
+ tushare-1.4.20.dist-info/WHEEL,sha256=Wyh-_nZ0DJYolHNn1_hMa4lM7uDedD_RGVwbmTjyItk,91
78
+ tushare-1.4.20.dist-info/top_level.txt,sha256=HHOxMuqc31KuAIcxpE0t5dAPMKbaiRtjsjTMFd7FlXI,8
79
+ tushare-1.4.20.dist-info/RECORD,,