炒股盯盘很累?想自动获取每日某股票的交易信息?想实时监控某只股票?本文“自制炒股盯盘神器”帮你实现!在第一节笔者总结了如何获取某只股票的基本信息的问题,本文简单记录如何处理获取到的股票信息······
- 模块介绍
在上一节的文章安装tushare库的时候,笔者简单提到过pandas.py库,本次实验就是以此库为主讲解。事实上,我们不妨做一下类比:pandas库是处理二维表格的强大工具,就好像Windows上的Excel软件一样。如果选择上一节的选择用pip安装tushare库,那么pandas库也会自动安装上,所以这里就不再讲该库的安装了,如果大家有疑惑,可以点击上面的链接简单浏览一下。
pandas库支持两种数据结构:Series和DataFrame。前者属于一维数据,后者属于二维数据。我们只讲后者,因为tushare函数获取到的股票信息是以后者的形式保存在变量中的,即:运行下面的代码,可以看出爬取到的指数数据是以<class 'pandas.core.frame.DataFrame'>
的数据类型保存的,这也是我们着重讲后者的原因之一。
import tushare as ts
import pandas as pd
pd.set_option('display.max_columns',None)
idx = ts.get_index()
print(type(idx))
- 函数或类方法介绍
下面就总结DataFrame数据的一些基本操作,
- 索引
DataFrame数据的索引方式主要有三种,即行索引、列索引和块索引(块索引就是从整个二维表中切出连续的一块)。下面代码举例:
import tushare as ts
import pandas as pd
df = ts.get_index() # 获取指数信息
pd.set_option('display.max_columns',None) #打印出所有列
block = df[['name','change']][8:10] #块索引,获取df的name、change列,第8、9行注意python前闭后开
row = df[0:1] #获取第0行,单行
rows = df[0:2] # 获取0、1行
col = df['name'] #获取单列
cols = df[['name','change']] #获取多列
#打印出结果
print(block)
print(row)
print(rows)
print(col)
print(cols)
结果请大家自行验证。
- 增删行列
笔者仅以上证50指数为例,说明技术上如何实现。代码如下:
import tushare as ts
import pandas as pd
import datetime as dt #用于获取时间日期
df = ts.get_index() #获取指数数据和时间、日期
date = dt.datetime.now().strftime("%F")
time = dt.datetime.now().strftime("%T")
sf = df[['name','change']][8:9] #截取第8行数据中的指数名字和涨幅,上证50
zf = df[['name','change']][9:10] #截取第9行数据中的指数名字和涨幅,新综指
print(sf) #打印出原始的1*2的二维表
sf['date'] = date #添加新列给上证50
sf['time'] = time
date = dt.datetime.now().strftime("%F")
time = dt.datetime.now().strftime("%T")
zf['date'] = date #添加新列给新综指
zf['time'] = time
add_row = sf.append(zf) #增加新行,赋给新的变量
print(sf) #打印出添加新列后的1*4二维表
print(add_row) #打印出添加新行后的2*4的二维表
打印结果如下:
打印出的原始的二维表:
name change
8 上证50 -3.19
打印出增加新列的二维表:
name change date time
8 上证50 -3.19 2020-03-09 13:09:51
打印出增加新列新行后的二维表:
name change date time
8 上证50 -3.19 2020-03-09 13:09:51
9 新综指 -2.81 2020-03-09 13:09:51
删除数据:
import tushare as ts
import pandas as pd
df = ts.get_index() #得到一个4*4的二维表
sf = df[['name','change','low','volume']][8:12]
print(sf) #打印出原始数据
del_col = sf.drop(columns = 'low') #删除列
del_rows = sf.drop(index = [8,9]) #删除两行
#打印验证
print(del_col)
print(del_rows)
输出结果如下:
原始数据:
name change low volume
8 上证50 -2.72 2864.4901 47543862
9 新综指 -2.20 2484.7830 332513300
10 沪深300 -2.63 3995.1313 168434370
11 中证500 -2.82 5539.9380 176281637
删除单列后:
name change volume
8 上证50 -2.72 47543862
9 新综指 -2.20 332513300
10 沪深300 -2.63 168434370
11 中证500 -2.82 176281637
删除两行后:
name change low volume
10 沪深300 -2.63 3995.1313 168434370
11 中证500 -2.82 5539.9380 176281637
- 按条件查找数据
当我们获取的股票数据较多时,我们可能只关心其中有效的数据,比如说涨幅超过某一值的股票信息,这里也举一个例子:
import tushare as ts
import pandas as pd
df = ts.get_index()
sf = df[['name','change','low','volume']][8:12] #获取块索引
print(sf)
find_data = sf[sf['change'] < -2.5] #查找涨幅小于-2.5的指数
print(find_data)
运行结果如下:
name change low volume
8 上证50 -2.59 2864.4901 49637805
9 新综指 -2.12 2484.7830 343575044
10 沪深300 -2.52 3995.1313 174628404
11 中证500 -2.74 5539.9380 181627678
筛选后的数据:
name change low volume
8 上证50 -2.59 2864.4901 49637805
10 沪深300 -2.52 3995.1313 174628404
11 中证500 -2.74 5539.9380 181627678
- 文件写入与读取
DataFrame数据对应Excel和.csv格式中的二维表格,以excel表为例简单介绍:
#写入:
new.to_excel('SSI.xlsx',index = False)
上面index = false是指不写入索引号,默认写入索引号。
#读取:
rd = pd.read_excel('SSI.xlsx',sheet_name = 0,encoding = 'utf-8')
print(rd)
上面“SSI,xlsx”表示文档名字,sheet_name表示该文档中的第一张表,第三个参数是编码标准,为了支持中文数据。
- 数据表的拼接
相关的函数有三个,即merge()、concat()、append()。下面分别示例:
import tushare as ts
import pandas as pd
import datetime as dt
import numpy as np
#生成两个表格
a = pd.DataFrame(np.arange(1,9).reshape(2,4),columns = ['name','change','date','time'])
print(a)
b = pd.DataFrame(np.arange(11,19).reshape(2,4),columns = ['name','change','date','time'])
print(b)
#拼接数据表
'''
c = pd.merge(a,b)
c = pd.concat([a,b])
'''
c = b.append(a)
print(c) #打印结果
上面注释掉的两句均可替换未注释的那一句且效果完全一样。
3. 总结
上面总结的二维表的操作中,基本上后面处理股票信息时我们都要用到。比如说索引、增删、查找是为了筛选出我们感兴趣的信息。读取/写入文件是为了保存数据,以便以后参考这些数据对后续的投资做出调整。
既然是盯盘神器,那么怎么让它帮助我们自动盯住自己感兴趣的股票或者指数呢?如果某只股票发生了较大的变化,怎么让它提醒我们呢?下一节就解决这样的问题,敬请期待!如果大家感兴趣,可以关注公众号“24K纯学渣”,更多文章第一时间将在该公众号更新。欢迎大家学习交流,上述如有不妥或纰漏之处也非常欢迎大家评论指出!