大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Pandas是一个python的开源库,它基于Numpy,提供了多种高性能且易于使用的数据结构。Pandas最初被用作金融数据分析工具而开发,由于它有着强大的功能,目前广泛应用于数据分析、机器学习以及量化投资等。下面来跟随作者一起认识下Pandas吧!
创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站制作、成都网站设计、外贸营销网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的新宾网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
1 如何开始
Pandas安装方式十分简单,如果使用Anaconda,Anaconda默认就已经为我们安装好了Pandas,直接拿来用就可以了,推荐使用这种方式。
如果不用Anaconda,只需执行如下命令即可:
pip install pandas
像其他python库一样,使用之前需要导入,通常采用如下方式:
import pandas as pd
2 Pandas数据结构
Pandas的数据结构包括 Series
、 DataFrame
以及 Panel
,这些数据结构基于 Numpy
,因此效率很高。其中 DataFrame
最为常用,是Pandas最主要的数据结构。所有Pandas数据结构都是值可变的,除 Series
外都是大小(Size)可变的, Series
大小不可变。
Series
Series
是一维的类似的数组的对象,它包含一个数组的数据(任意NumPy的数据类型)和一个与数组关联的索引 。
>>> import pandas as pd>>> import numpy as np>>> s = pd.Series(np.random.randn(4))>>> s0 0.1027801 1.5230012 1.7700673 0.437553dtype: float64
可以看到Pandas默认为我们生成了索引,它的结构如下表所示:
0 | 1 | 2 | 3 |
---|---|---|---|
0.102780 | 1.523001 | 1.770067 | 0.437553 |
我们也可以使用 index
关键字为其指定索引:
>>> s = pd.Series(np.random.randn(4), index=['a', 'b', 'c', 'd'])>>> sa -0.316668b 0.083363c -0.520227d -1.024034dtype: float64
DataFrame
DataFrame是二维的、类似表格的对象,是使用最为广泛的Pandas数据结构。DataFrame有行和列的索引,访问便捷。它可以被看作是Series的字典:
>>> data = {'name': ['张三', '李四', '王五'],... 'gender': ['M', 'F', 'M'],... 'height': [174, 160, 185],... 'weight': [80, 48, 70]}>>> frame = pd.DataFrame(data)>>> frame name gender height weight0 张三 M 174 801 李四 F 160 482 王五 M 185 70
结构如下表所示
name | gender | height | weight | |
---|---|---|---|---|
0 | 张三 | M | 174 | 80 |
1 | 李四 | F | 160 | 48 |
2 | 王五 | M | 185 | 70 |
一方面,我们可以使用 columns
关键字指定DataFrame列的顺序,DataFrame的列将会严格按照 columns
所指定的顺序排列;另一方面,与Series相同,我们可以使用 index
关键字为其指定索引:
>>> frame2 = pd.DataFrame(data, columns=['name', 'gender', 'weight'],... index=['one', 'two', 'three'])>>> >>> frame2 name gender weightone 张三 M 80two 李四 F 48three 王五 M 70
需要注意的是,DataFrame的同一列允许有不同类型的值(数字,字符串,布尔等),这便意味着:我们可以将 王五
的 weight
设置为 F
。
3 数据访问和遍历
DataFrame支持按下标访问:
>>> frame2.iloc[0]
name 张三
gender M
weight 80
Name: one, dtype: object
>>> frame2.iloc[0]['weight']
80
也支持按索引访问:
>>> frame2.loc['two']
name 李四
gender F
weight 48
Name: two, dtype: object
>>> frame2.loc['two']['name']
'李四'
因此,DataFrame也支持如下两种遍历方式:
>>> for i in range(0, len(frame2)):... print(frame2.iloc[i])*** 输出结果略 ***
>>> for index, row in frame2.iterrows():... print(row)*** 输出结果略 ***
4 添加和删除列
如果我们想增加一列,也非常方便,如计算BMI指数:
>>> frame['BMI'] = frame['weight']/(frame['height']*frame['height']/10000)>>> frame name gender height weight BMI0 张三 M 174 80 26.4235701 李四 F 160 48 18.7500002 王五 M 185 70 20.452885
仅需一行代码而无需遍历。
删除列:
>>> del frame2['gender']>>> frame2 name weightone 张三 80two 李四 48three 王五 70
5 添加和删除行
添加行
>>> frame3 = pd.DataFrame([['小红', 46], ['小明', 68]], columns = ['name', 'weight'], index=['four', 'five'])>>> frame4 = frame2.append(frame3)>>> frame4 name weightone 张三 80two 李四 48three 王五 70four 小红 46five 小明 68
删除行
>>> frame4.drop('four') name weightone 张三 80two 李四 48three 王五 70five 小明 68
6 数据筛选
按下标取出前两条记录
>>> frame[:2] name gender height weight BMI0 张三 M 174 80 26.423571 李四 F 160 48 18.75000
按其他条件筛选
如找到BMI>20的记录:
>>> mask = (frame['BMI'] > 20)>>> frame.loc[mask] name gender height weight BMI0 张三 M 174 80 26.4235702 王五 M 185 70 20.452885
DataFrame还支持许多其他的操作,篇幅有限,在此不一一展开。
7 Panel
Panel是三维的数据结构,可以看作是DataFrame的字典,这种数据结构使用很少,此处略过不提。
Pandas实战
学习技术是为了更好的工作和生活,抛开应用,技术也就失去了存在的意义。本文开篇中提到,Pandas作为数据分析工具的一个重要应用场景是量化投资,在此我想分享一下使用pandas的一个场景:
我想筛选出A股市场中过去60个交易日表现好的那些股票。关于表现好,也许每个人都有自己的看法,我的标准如下
涨幅够大,区间累计涨幅达60%以上
回撤小,区间内任意单个交易日跌幅不超过7%,包括高开低走7%(套人的不算好股票);区间内任意连续两个交易日累计跌幅不超过10%,包括连续两个交易日高开低走10%
我使用的数据源是TuShare,它提供了A股复权日线图,不过它没有提供复权数据的每日涨跌幅,所以我们需要对他进行处理:
>>> import tushare as ts>>> import talib as tl>>> data = ts.get_k_data('300573', autype='qfq')>>> data['p_change'] = tl.ROC(data['close'], 1)
此处使用了TALib,一个开源的金融数据分析工具。
完成初步的数据处理之后,我们就可以运行筛选条件了,截取代码片段如下:
threshold=60
if len(data)< threshold:
returnFalse
data= data.tail(n=threshold)
ratio_increase=(data.iloc[-1]['close']- data.iloc[0]['close'])/ data.iloc[0]['close']
if ratio_increase<0.6:
returnFalse
for iin range(1, len(data)):
if data.iloc[i-1]['p_change']<-7 \
or(data.iloc[i]['close']- data.iloc[i]['open'])/data.iloc[i]['open']*100<-7 \
or data.iloc[i-1]['p_change']+ data.iloc[i]['p_change']<-10 \
or(data.iloc[i]['close']- data.iloc[i-1]['open'])/ data.iloc[i-1]['open']*100<-10:
returnFalse
returnTrue
最后的结果如下:
[('603986', '兆易创新'), ('603882', '金域医学'), ('603501', '韦尔股份'), ('300782', '卓胜微'), ('300622', '博士眼镜'), ('300502', '新易盛'), ('300492', '山鼎设计'), ('300433', '蓝思科技'), ('300223', '北京君正'), ('002917', '金奥博'), ('002892', '科力尔'), ('002876', '三利谱'), ('002850', '科达利'), ('002819', '东方中科'), ('002600', '领益智造'), ('002241', '歌尔股份'), ('000049', '德赛电池')]
可以看到其中科技股独领风骚,谁让我们大A是科技牛呢?