专栏名称: 挖地兔
金融数据采集与挖掘,开启量化金融的第一扇大门。
目录
相关文章推荐
爱可可-爱生活  ·  大模型还是小模型?AI部署的困境与突破 ... ·  17 小时前  
Web3天空之城  ·  【天空访谈·播客】AI, DeepSeek ... ·  昨天  
Web3天空之城  ·  【天空访谈·播客】AI, DeepSeek ... ·  昨天  
机器之心  ·  重磅发现!DeepSeek ... ·  2 天前  
黄建同学  ·  最近比较火🔥的Thinking ... ·  2 天前  
爱可可-爱生活  ·  【kg-gen:从任何文本中提取知识图谱的A ... ·  3 天前  
51好读  ›  专栏  ›  挖地兔

Hello pandas!

挖地兔  · 公众号  ·  · 2018-01-18 17:30

正文



Hello pandas

碰到一些Python或者pandas的初学者,很多基础的语法和使用方法都还没有学会就开始打算用Tushare进行数据分析,毫无疑问会无从下手甚至开始怀疑人生直到放弃。


其实只要稍微花一点时间学习一下基础知识,就会变得豁然开朗,再深入学习后就得心应手了。


以下是一个用户发来的学习笔记(欢迎更多用户投稿~_~),从入门到精通,只差比别人少玩了几轮游戏。


写在前面

网上介绍python之pandas库非常多,这篇从sql语言的角度解读,相信更适合有sql语言(MySql)基础的你,像使用sql一样搞定pandas。


依然要说安装,本篇案例数据均取自tushare。


1、安装pandas,如果你安装的是anaconda,那么就不用单独安装了,因为anaconda已经集成了pandas。


2、安装tushare库

Windows系统(win7及以上)

a)打开Anaconda Prompt

b)输入命令:pip install tushare

c)按“Enter”键


安装tushare,如果你看过前篇《python数据处理之入门》,在“安装python”之“安装python库”章节亦可见。


还是那句话,最重要的是业务,python是帮你实现的工具。


创建表

对于mysql而言,要查看或处理其数据,首先数据肯定得是存储在某个表中,这个表是个二维的结构。


在mysql创建表的语句是create table ……


那么在pandas里,这种二维的数据结构是怎么呈现的呢?他叫DataFrame,创建一个DataFrame就相当于创建了一张表。


比如,在tushare返回的日行情数据(get_k_data)结果就是DataFrame。


上代码:

运行结果:


这个运行结果是不是超级熟悉?


说说索引

第1列,是不是类似你们经常看到的自增长ID,那么在DataFrame,他叫index(索引),这个索引非常重要,在将来的数据分析计算使用非常频繁。


所以,对于这个index,pandas也提供了一些函数满足你对他的要求,比如set_index,reset_index, 举个set_index的例子,当我想使用date列作为索引的时候,请看下面截图代码:

运行结果:


字段

从上面截图可以一目了然的看到字段,对字段的操作,mysql有ALTER命名,那么对于pandas是什么样的呢, 字段其实是个一维的结构,在pandas里面叫Series。


加个字段


我想加个字段,内容为”Boss出品”

这样这个新的字段就加上了,并且赋了值


请看执行结果:


删个字段


有字段我不想要,怎么办,简单哈,删字段呗,pandas提供了drop函数可以用来删字段, 当日,也可以使用筛选filter,等等


比如,对于调出的数据结果,开高低价格用不上,那就去掉。

细心的你一定看到了axis这个参数,没错drop可以删除列,也可以对行进行删除。


执行结果:

我很懒,截个执行结果的图都不想干,咱们自己写代码,亲自执行看结果。


修改字段

Pandas不需要指定数据类型,那么就只剩下修改列名了。


你们想改哪个字段名,我想把date修改为trade_date。

执行结果:

懒!


数据查询

像写SQL一样,使用pandas


实现select


sql查询,select后面跟着的就是选字段,

pandas,哇!!!他更牛,不但可以根据列名来选,还能根据位置来选。


1、根据列名来选

filter,loc,at,ix,drop(drop是反向的,参见”删个字段”), 以loc为例,at与loc相近。

另外,还有一种类似切片的方法,如下:


df2 = df[['date', 'code', 'close']]


2、根据位置来选


iloc,iat,ix


以iloc为例,iat与iloc相近


说说ix


细心的你们肯定又注意到了,根据列表和位置来选,都有ix。


ix,既能当loc用,又能当iloc用,兼有根据列名和位置筛选筛选两种功能


实现where


1、loc,iloc,at,iat,ix


使用位置过滤


还记得前面说过,pandas的index很常用吗,没错,在数据过滤查询里就会用到了。使用loc,iloc,at,iat,ix过滤,上述截图,大家注意到没有,无论是根据列名,还是根据位置选择列,在前面都有个冒号“:”


没错,这个就是用来做行筛选的,相当于mysql中的where

执行结果,在筛选的index范围内,不过你们注意没有,loc与iloc的过滤结果略微有些差异:


执行结果:

很明显,使用loc,包含了筛选使用的索引,而iloc没有。

这个是使用数字序列,如果使用日期作为索引,大家的感受可能会更深一些,


比如:

先设置了日期列作为索引,再使用loc对数据进行行列筛选。

--什么?

--执行什么?

--什么结果?

--结什么果?

算了,咱们敲一遍代码,自己执行看结果吧。


查询筛选


pandas对行的筛选必须要使用index(索引)吗? 非也,非也,mysql里有的,pandas肯定能满足你, 请继续往下看:


mysql里筛选使用的and,or,in,not in之pandas实现。


为了举例更方便,让大家更直观,我在tushare.get_k_data调了浦发银行、万科两只股票的行情。

代码运行后,就有了浦发银行、万科的日行情。


1、and之实现

筛选出浦发银行2018年1月11日的行情


使用符号“&”


2、or之实现

筛选收盘价大于35元,或浦发银行2018年1月11日的行情


使用符号“|”

3、 in之实现


筛选浦发银行、万科,2018年1月11日和12日两天的日行情


4、not in 之实现


筛选浦发银行、万科,不要2018年1月11日和12日这两天的日行情

另外,还可以使用query函数来构造筛选,如, 筛选出浦发银行日行情:


order排序


对应mysql之order by

pandas有使用索引排序或使用列排序两种选择,分别是:sort_index, sort_values,使用参数ascending(True、False)来满足对升序或降序的要求,比如


1、使用索引,按降序排列


2、按收盘价,升序排列

参数ascending默认等于True升序排列,所以不用写了。


取n行


对应mysql之limit


pandas不但能取前n行,还提供函数可以取后n行,分别是head()、tail()

如,取前4行、后4行


MySql通常有先排序,再limit,pandas同样可以一行代码实现


去重


对应MySql之distinct


在数据查询中,通常会使用去重,对应的pandas函数是drop_duplicates,并且更前大的是drop_duplicates提供了参数keep,供你选择保留第1条,亦或是将重复数据全删除。


空值


对应MySql之Null


pandas有空日期pd.NaT,空值None,空值亦或称之为缺失值


1、缺失值筛选

MySql的筛选通常有where date is null,或is not null

pandas对应的筛选办法是


df = df[df['close'].isnull()]

df = df[df['close'].notnull()]


代码:


另外,pandas还提供了dropna,用来做缺失值的行列选择, 这里不再赘述,大家可以使用参考链接去看下dropna的使用方法,


参考链接:

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html

再重点说下缺失值的填充


2、 fillna

对缺失值的填充,是咱们经常遇到的,比如填充个假值,用前一天数据填充,亦或用下一交易日数据填充


1)  填充为指定的值,即常说的赋值


同时指定多个列赋值:

df.fillna({'close': 1, 'NullValue': 9}, inplace=True)

2) 使用前一天值/后一天值填充

使用fillna提供的的method参数即可

是不是昏昏了,我有点昏昏了,再介绍两个提提神。


下面介绍两个相对于MySql查询的两个重量级应用,关联查询和分组查询


关联查询(join)


pandas指join和merge


这两个的使用方法相近,都能通过索引关联和字段关联


1、先说join

join被用在通过索引关联较多

DataFrame.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False)

e.g.

how : {‘left’, ‘right’, ‘outer’, ‘inner’}, default: ‘left’


left:左连接

right:右连接

outer:外连接

inner:内连接


上述关联关系,相信不用详细介绍,大家都知道了,跟Mysql的关联方法极其相近


lsuffix和rsuffix

这两个参数,用来标记当关联DataFrame出现相同字段名称的时候区分方法

2、merge

merge这个单词,印象最深刻的是听青桃说merge,在耳畔萦绕。

下面就介绍下pandas里的merge

merge被用在通过字段关联较多

DataFrame.merge(right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)

merge里,








请到「今天看啥」查看全文