NOW现在行动!
Pandas是一个强大的分析结构化数据的工具集;它基于Numpy(提供高性能的矩阵运算);用于数据挖掘和数据分析,同时也提供数据清洗功能。它是Python下用于数据工作的一个强有力的工具,数据分析、机器学习、金融、统计等很多领域都有着广泛应用。想要涉足这些领域的同学,Pandas建议一定要学一学。
两大数据结构
重点说下DataFrame,它是Pandas中的一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame即有行索引也有列索引,可以被看做是由Series组成的字典。
获取财务数据Dataframe
聚宽是国内不错的量化交易云平台,目前可以通过申请获得本地数据的使用权。授权之后,就可以通过其提供的SDK获取到你想要的数据。在这里,将通过一个获取上市公司财务数据的例子来展示DataFrame的使用。
import jqdatasdk as d
def auth(username, password):
d.auth(username, password)
if not d.is_auth():
raise Exception('Auth failed')
def get_financial_report():
q = d.query(
d.valuation, d.income
).filter(
d.valuation.code.in_(['000001.XSHE', '600519.XSHG', '000009.XSHE', '600000.XSHG'])
)
df = d.get_fundamentals(q, date='2015-10-15')
return df
if __name__ == '__main__':
auth('你的电话号码', '密码')
res = get_financial_report()
print(res)
这里的d.get_fundamentals会返回一个DataFrame对象。上面说了DataFrame是一个二维的表格,那么具体是怎么样的一个情况呢。我们可以通过.columns方法来查看支持的列:
> df.index
> Index(['id', 'code', 'pe_ratio', 'turnover_ratio', 'pb_ratio', 'ps_ratio',
'pcf_ratio', 'capitalization', 'market_cap', 'circulating_cap',
...,
'ci_minority_owners'],
dtype='object')
由于在这里我们获取的是聚宽的财务数据,因此可以看到返回了非常多的列。
我们可以使用tail()方法比较方便地返回指定的尾部的某条数据,也可以通过head()方法查看第一条数据。
> df.tail(1)
> [1 rows x 56 columns]
id code ... ci_parent_company_owners ci_minority_owners
0 5024884 000001.XSHE ... NaN 0.0
describe查看简单统计
DataFrame还提供一个叫做describe()的方法可以快速查看数据的统计摘要,比如这里查看这几家公司的统计摘要。
id pe_ratio ... ci_parent_company_owners ci_minority_owners
count 4.000000e+00 4.000000 ... 3.000000e+00 3.000000e+00
mean 5.130738e+07 26.053175 ... 9.289807e+09 3.540128e+08
std 1.152475e+03 21.007061 ... 8.683778e+09 3.138209e+08
min 5.130583e+07 5.946700 ... 6.309906e+07 1.260925e+08
25% 5.130700e+07 10.042600 ... 5.283211e+09 1.750462e+08
50% 5.130756e+07 23.860150 ... 1.050332e+10 2.240000e+08
75% 5.130794e+07 39.870725 ... 1.390316e+10 4.679730e+08
max 5.130859e+07 50.545700 ... 1.730300e+10 7.119460e+08
describe()函数自动计算的字段有count(非空值数)、unique(唯一值数)、top(频数最高者)、freq(最高频数)
rolling移动窗口函数
这是一个在量化分析时非常有用的函数。比如对于一段时间内股票收盘价,想要快速地获得这段时间内每一天的最近30天的最高价,那就可以用这个函数快速的获取。
stock_dataframe.High.rolling(window=30).max()
Series
前面也说到了Series是同构的一维数据,其实在这里也就是DataFrame中的某一列,比如ci_parent_company_owners这一列数据,想要获取这一列的数据的话,使用df.ci_parent_company_owners或者df['ci_parent_company_owners']都可以。
方便的绘图能力
我们可以利用Pandas很方便地绘制出类似Matlab那样丰富的图表,比如:我们将上面代码里获取到的四家公司的市盈率数据展示出来,只需要加上如下的代码即可:
plot = df['pe_ratio'].plot(title='PE Ratio')
plot.set_xticklabels(['000001.XSHE', '600519.XSHG', '000009.XSHE', '600000.XSHG'])
plt.show()
最后
Pandas的功能远不止这里列举的,在此只是开了一扇门,门外的世界还需要你我共同去探索。在数据分析这块,Pandas无疑是我们的神兵利器。我们可以用它很方便地进行各种函数计算,图标展示等工作,将会大大提升我们的工作效率。后续我也将逐渐记录下更多有意思的玩儿法。