欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  资讯频道

量化分析师的Python日记【第6天:数据处理的瑞士军刀pandas下篇】

程序员文章站 2022-03-08 16:42:58
...

Python数据处理的瑞士军刀:pandas

第二篇:快速进阶

在上一篇中我们介绍了如何创建并访问pandas的Series和DataFrame类型的数据,本篇将介绍如何对pandas数据进行操作,掌握这些操作之后,基本可以处理大多数的数据了。首先,导入本篇中使用到的模块:

 
 
 
 
 
1
import numpy as np
2
import pandas as pd
3
from pandas import Series, DataFrame
 
 

为了看数据方便一些,我们设置一下输出屏幕的宽度

 
 
 
 
 
1
pd.set_option('display.width', 200)
 
 

一、数据创建的其他方式

数据结构的创建不止是上篇中介绍的标准形式,本篇再介绍几种。例如,我们可以创建一个以日期为元素的Series:

 
 
 
 
 
1
dates = pd.date_range('20150101', periods=5)
2
print dates
 
 
<class 'pandas.tseries.index.DatetimeIndex'> [2015-01-01, ..., 2015-01-05] Length: 5, Freq: D, Timezone: None
 

将这个日期Series作为索引赋给一个DataFrame:

 
 
 
 
 
1
df = pd.DataFrame(np.random.randn(5, 4),index=dates,columns=list('ABCD'))
2
print df
 
 
A B C D 2015-01-01 -0.168870 0.191945 -0.906788 -1.295211 2015-01-02 -0.985849 0.312378 -1.513870 -0.876869 2015-01-03 -0.241945 1.437763 0.209494 0.061032 2015-01-04 0.139199 0.124118 -0.204801 -1.745327 2015-01-05 0.243644 -0.373126 0.333583 2.640955
 

只要是能转换成Series的对象,都可以用于创建DataFrame:

 
 
 
 
 
1
df2 = pd.DataFrame({ 'A' : 1., 'B': pd.Timestamp('20150214'), 'C': pd.Series(1.6,index=list(range(4)),dtype='float64'), 'D' : np.array([4] * 4, dtype='int64'), 'E' : 'hello pandas!' })
2
print df2
 
 
A B C D E 0 1 2015-02-14 1.6 4 hello pandas! 1 1 2015-02-14 1.6 4 hello pandas! 2 1 2015-02-14 1.6 4 hello pandas! 3 1 2015-02-14 1.6 4 hello pandas!
 

二、数据的查看

在多数情况下,数据并不由分析数据的人员生成,而是通过数据接口、外部文件或者其他方式获取。这里我们通过量化实验室的数据接口获取一份数据作为示例:

 
 
 
 
 
1
stock_list = ['000001.XSHE', '000002.XSHE', '000568.XSHE', '000625.XSHE', '000768.XSHE', '600028.XSHG', '600030.XSHG', '601111.XSHG', '601390.XSHG', '601998.XSHG']
2
raw_data = DataAPI.MktEqudGet(secID=stock_list, beginDate='20150101', endDate='20150131', pandas='1')
3
df = raw_data[['secID', 'tradeDate', 'secShortName', 'openPrice', 'highestPrice', 'lowestPrice', 'closePrice', 'turnoverVol']]
 
 

以上代码获取了2015年一月份全部的交易日内十支股票的日行情信息,首先我们来看一下数据的大小:

 
 
 
 
 
1
print df.shape
 
 
(200, 8)
 

我们可以看到有200行,表示我们获取到了200条记录,每条记录有8个字段,现在预览一下数据,dataframe.head()和dataframe.tail()可以查看数据的头五行和尾五行,若需要改变行数,可在括号内指定:

 
 
 
 
 
1
print "Head of this DataFrame:"
2
print df.head()
3
print "Tail of this DataFrame:"
4
print df.tail(3)
 
 
Head of this DataFrame:
secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 0 000001.XSHE 2015-01-05 平安银行 15.99 16.28 15.60 16.02 286043643 1 000001.XSHE 2015-01-06 平安银行 15.85 16.39 15.55 15.78 216642140 2 000001.XSHE 2015-01-07 平安银行 15.56 15.83 15.30 15.48 170012067 3 000001.XSHE 2015-01-08 平安银行 15.50 15.57 14.90 14.96 140771421 4 000001.XSHE 2015-01-09 平安银行 14.90 15.87 14.71 15.08 250850023 Tail of this DataFrame: secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 197 601998.XSHG 2015-01-28 中信银行 7.04 7.32 6.95 7.15 163146128 198 601998.XSHG 2015-01-29 中信银行 6.97 7.05 6.90 7.01 93003445 199 601998.XSHG 2015-01-30 中信银行 7.10 7.14 6.92 6.95 68146718

dataframe.describe()提供了DataFrame中纯数值数据的统计信息:

 
 
 
 
 
1
print df.describe()
 
 
openPrice highestPrice lowestPrice closePrice turnoverVol count 200.00000 200.000000 200.00000 200.000000 2.000000e+02 mean 15.17095 15.634000 14.86545 15.242750 2.384811e+08 std 7.72807 7.997345 7.56136 7.772184 2.330510e+08 min 6.14000 6.170000 6.02000 6.030000 1.242183e+07 25% 8.09500 8.250000 7.98750 8.127500 7.357002e+07 50% 13.96000 14.335000 13.75500 13.925000 1.554569e+08 75% 19.95000 20.500000 19.46250 20.012500 3.358617e+08 max 36.40000 37.250000 34.68000 36.150000 1.310855e+09
 

对数据的排序将便利我们观察数据,DataFrame提供了两种形式的排序。一种是按行列排序,即按照索引(行名)或者列名进行排序,可调用dataframe.sort_index,指定axis=0表示按索引(行名)排序,axis=1表示按列名排序,并可指定升序或者降序:

 
 
 
 
 
1
print "Order by column names, descending:"
2
print df.sort_index(axis=1, ascending=False).head()
 
 
Order by column names, descending:
turnoverVol tradeDate secShortName secID openPrice lowestPrice highestPrice closePrice 0 286043643 2015-01-05 平安银行 000001.XSHE 15.99 15.60 16.28 16.02 1 216642140 2015-01-06 平安银行 000001.XSHE 15.85 15.55 16.39 15.78 2 170012067 2015-01-07 平安银行 000001.XSHE 15.56 15.30 15.83 15.48 3 140771421 2015-01-08 平安银行 000001.XSHE 15.50 14.90 15.57 14.96 4 250850023 2015-01-09 平安银行 000001.XSHE 14.90 14.71 15.87 15.08

第二种排序是按值排序,可指定列名和排序方式,默认的是升序排序:

 
 
 
 
 
1
print "Order by column value, ascending:"
2
print df.sort(columns='tradeDate').head()
3
print "Order by multiple columns value:"
4
df = df.sort(columns=['tradeDate', 'secID'], ascending=[False, True])
5
print df.head()
 
 
Order by column value, ascending:
secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 0 000001.XSHE 2015-01-05 平安银行 15.99 16.28 15.60 16.02 286043643 20 000002.XSHE 2015-01-05 万科A 14.39 15.29 14.22 14.91 656083570 40 000568.XSHE 2015-01-05 泸州老窖 20.50 21.99 20.32 21.90 59304755 60 000625.XSHE 2015-01-05 长安汽车 16.40 18.07 16.32 18.07 82087982 80 000768.XSHE 2015-01-05 中航飞机 18.76 19.88 18.41 19.33 84199357 Order by multiple columns value: secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 19 000001.XSHE 2015-01-30 平安银行 13.93 14.12 13.76 13.93 93011669 39 000002.XSHE 2015-01-30 万科A 13.09 13.49 12.80 13.12 209624706 59 000568.XSHE 2015-01-30 泸州老窖 19.15 19.51 19.11 19.12 14177179 79 000625.XSHE 2015-01-30 长安汽车 19.16 19.45 18.92 19.18 21233495 99 000768.XSHE 2015-01-30 中航飞机 25.38 25.65 24.28 24.60 59550293

三、数据的访问和操作

3.1 再谈数据的访问

上篇中已经介绍了使用loc、iloc、at、iat、ix以及[]访问DataFrame数据的几种方式,这里再介绍一种方法,使用":"来获取部行或者全部列:

 
 
 
 
 
1
print df.iloc[1:4][:]
 
 
secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 39 000002.XSHE 2015-01-30 万科A 13.09 13.49 12.80 13.12 209624706 59 000568.XSHE 2015-01-30 泸州老窖 19.15 19.51 19.11 19.12 14177179 79 000625.XSHE 2015-01-30 长安汽车 19.16 19.45 18.92 19.18 21233495
 

我们可以扩展上篇介绍的使用布尔类型的向量获取数据的方法,可以很方便地过滤数据,例如,我们要选出收盘价在均值以上的数据:

 
 
 
 
 
1
print df[df.closePrice > df.closePrice.mean()].head()
 
 
secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 59 000568.XSHE 2015-01-30 泸州老窖 19.15 19.51 19.11 19.12 14177179 79 000625.XSHE 2015-01-30 长安汽车 19.16 19.45 18.92 19.18 21233495 99 000768.XSHE 2015-01-30 中航飞机 25.38 25.65 24.28 24.60 59550293 139 600030.XSHG 2015-01-30 中信证券 28.50 28.72 27.78 27.86 304218245 58 000568.XSHE 2015-01-29 泸州老窖 19.04 19.23 19.00 19.15 12421826
 

isin()函数可方便地过滤DataFrame中的数据:

 
 
 
 
 
1
print df[df['secID'].isin(['601628.XSHG', '000001.XSHE', '600030.XSHG'])].head()
2
print df.shape
 
 
secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 19 000001.XSHE 2015-01-30 平安银行 13.93 14.12 13.76 13.93 93011669 139 600030.XSHG 2015-01-30 中信证券 28.50 28.72 27.78 27.86 304218245 18 000001.XSHE 2015-01-29 平安银行 13.82 14.01 13.75 13.90 101675329 138 600030.XSHG 2015-01-29 中信证券 28.10 28.58 27.81 28.18 386310957 17 000001.XSHE 2015-01-28 平安银行 13.87 14.30 13.80 14.06 124087755
(200, 8)
3.2 处理缺失数据

在访问数据的基础上,我们可以更改数据,例如,修改某些元素为缺失值:

 
 
 
 
 
1
df['openPrice'][df['secID'] == '000001.XSHE'] = np.nan
2
df['highestPrice'][df['secID'] == '601111.XSHG'] = np.nan
3
df['lowestPrice'][df['secID'] == '601111.XSHG'] = np.nan
4
df['closePrice'][df['secID'] == '000002.XSHE'] = np.nan
5
df['turnoverVol'][df['secID'] == '601111.XSHG'] = np.nan
6
print df.head(10)
 
 
secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 19 000001.XSHE 2015-01-30 平安银行 NaN 14.12 13.76 13.93 93011669 39 000002.XSHE 2015-01-30 万科A 13.09 13.49 12.80 NaN 209624706 59 000568.XSHE 2015-01-30 泸州老窖 19.15 19.51 19.11 19.12 14177179 79 000625.XSHE 2015-01-30 长安汽车 19.16 19.45 18.92 19.18 21233495 99 000768.XSHE 2015-01-30 中航飞机 25.38 25.65 24.28 24.60 59550293 119 600028.XSHG 2015-01-30 中国石化 6.14 6.17 6.02 6.03 502445638 139 600030.XSHG 2015-01-30 中信证券 28.50 28.72 27.78 27.86 304218245 159 601111.XSHG 2015-01-30 中国国航 7.92 NaN NaN 7.69 NaN 179 601390.XSHG 2015-01-30 中国中铁 8.69 8.69 8.12 8.14 352357431 199 601998.XSHG 2015-01-30 中信银行 7.10 7.14 6.92 6.95 68146718
 

原始数据的中很可能存在一些数据的缺失,就如同现在处理的这个样例数据一样,处理缺失数据有多种方式。通常使用dataframe.dropna(),dataframe.dropna()可以按行丢弃带有nan的数据;若指定how='all'(默认是'any'),则只在整行全部是nan时丢弃数据;若指定thresh,则表示当某行数据非缺失列数超过指定数值时才保留;要指定根据某列丢弃可以通过subset完成。

 
 
 
 
 
1
print "Data size before filtering:"
2
print df.shape
3
4
print "Drop all rows that have any NaN values:"
5
print "Da
    
来自: q.datayes.com
0
0
评论 共 0 条 请登录后发表评论

发表评论

量化分析师的Python日记【第6天:数据处理的瑞士军刀pandas下篇】 您还没有登录,请您登录后再发表评论

相关推荐

  • python数据分析pandas快速入门教程.pdf

    python数据分析pandas快速入门教程,电子版书籍,带你学习python使用pandas数据处理

  • [转帖]Attribute在.NET编程中的应用

    选择自 niwalker 的 BlogAttribute的基本概念经常有朋友问,Attribute是什么?它有什么用?好像没有这个东东程序也能运行。实际上在.Net中,Attribute是一个非常重要的组成部分,为了帮助大家理解和掌握Attribute,以及它的使用方法,特地收集了几个Attribute使用的例子,提供给大家参考。在具体的演示之前,我想先大致介绍一下Attribute。

  • Attribute在.NET编程中的应用(五)

    Attribute在.NET编程中的应用(五)Attribute在拦截机制上的应用从这一节开始我们讨论Attribute的高级应用,为此我准备了一个实际的例子:我们有一个订单处理系统,当一份订单提交的时候,系统检查库存,如果库存存量满足订单的数量,系统记录订单处理记录,然后更新库存,如果库存存量低于订单的数量,系统做相应的记录,同时向库存管理员发送邮件。为了方便演示,我们对例子进行了简化:

  • Attribute 在.NET编程中的应用(二)

    Attribute在.net编程中的应用(二).NET Framework中对Attribute的支持是一个全新的功能,这种支持来自它的Attribute类。在你的程序中适当地使用这个类,或者是灵活巧妙地利用这个类,将使你的程序获得某种在以往编程中很难做到的能力。我们来看一个例子:假如你是一个项目开发小组中的成员,你想要跟踪项目代码检查的信息,通常你可以把代码的检查信息保存在数据库中以便查询;

  • Attribute在.NET编程中的应用(三)

    用于参数的Attribute 在编写多层应用程序的时候,你是否为每次要写大量类似的数据访问代码而感到枯燥无味?比如我们需要编写调用存储过程的代码,或者编写T_SQL代码,这些代码往往需要传递各种参数,有的参数个数比较多,一不小心还容易写错。有没有一种一劳永逸的方法?当然,你可以使用MS的Data Access Application Block,也可以使用自己编写的

  • 小白学 Python 数据分析(6):Pandas (五)基础操作(2)数据选择

    小白学 Python 数据分析(3):Pandas (二)数据结构 Series 小白学 Python 数据分析(4):Pandas (三)数据结构 DataFrame 小白学 Python 数据分析(5):Pandas (四)基础操作(1)查看数据 引言 上一篇文章...

  • Python处理Excel数据-pandas篇

    Python处理Excel数据-pandas篇 非常适用于大量数据的拼接、清洗、筛选及分析 在计算机编程中,pandas是Python编程语言的用于数据操纵和分析的软件库。特别是,它提供操纵数值表格和时间序列的数据结构和运算操作。...

  • Python数据分析:pandas数据操作和分析案例

    Python数据分析:pandas数据操作和分析案例 项目介绍: https://www.kaggle.com/openfoodfacts/world-food-facts 项目任务: 统计各个国家食物中的食品添加剂种类个数 import zipfile import os import pandas ...

  • Python数据分析:手把手教你用Pandas生成可视化图表

    但自从Python进入3.0时代以后,pandas的使用变得更加普及,它的身影经常见于市场分析、爬虫、金融分析以及科学计算中。 作为数据分析工具的集大成者,pandas作者曾说,pandas中的可视化功能比plt更加简便和功能强大...

  • 1天搞定Python进阶课程-数据分析库Pandas

    pandas是python中非常常用的数据分析库,在数据分析,机器学习,深度学习等领域经常被使用。本课程会讲解到pandas中核心的一些知识点,包括Series以及DataFrame的构建,赋值,操作,选择数据,合并等等,以及使用...

  • 量化分析师的Python日记 系列

    量化分析师的Python日记 系列 转发,原作者 薛昆Kelvin 为方便学习,整理一下学习材料。持续更新。 【第1天:谁来给我讲讲Python?】 https://uqer.io/community/share/54c89443f9f06c276f651a52 【第2天:再接着...

  • Python数据分析库Pandas实战:解析Excel数据

    上一节Python操作Excel表格使用的是openpyxl包,这个包虽然能处理简单日常工作中Excel表格数据处理,但面对机器学习庞大的数据,还是显得力不从心,所以openpyxl大多数应用于简单的Excel表格操作,以及机器学习分析...

  • Python数据分析:pandas时间序列处理及操作

    Python数据分析:pandas时间序列处理及操作 基本类型,以时间戳为索引的series–&gt;datatimeindex 创建方法: 指定index为datatime的list from datetime import datetime import pandas as pd import numpy ...

  • 「数据分析师的编程基础」Python使用Pandas数据处理技巧

    虽然作为一名数据分析师来说编程不是必备技能,对于不管任何编程语言Python、R、MATLAB、GO等等这些都是工具,不管使用哪一种语言我们的目标是一致的,就是做数据分析,得到想要的结果,然后进行解读,所以对于编程...

  • 「数据分析师的编程基础」Python使用Pandas数据合并处理

    文章目录内容介绍数据合并数据库风格的...本系列文章介绍的是对于Python复杂的编程语言中提取了数据分析常用的数据处理以及数据可视化等数据分析师常用的内容,区别与其他的Python编程教程,如果是纯开发的小伙伴

  • [Python从零到壹] 十七.可视化分析之Matplotlib、Pandas、Echarts入门万字详解

    前一篇文章讲述了数据预处理、Jieba分词和文本聚类知识,这篇文章主要介绍Matplotlib和Pandas扩展包绘图的基础用法,同时引入Echarts技术,该技术主要应用于网站可视化展示中。本文内容以实例为主,给读者最直观的...

  • 量化分析师的Python日记

    您观看课程学习后 免费入群领取【超全Python资料包+17本学习电子书】 量化分析师的Python学习教程,课程先从介绍Python本身一些基本语法,再介绍 python 相关应用及在数据分析及处理领域几大利器:pandas、scipy、...

  • Python_数据分析_pandas_04缺失值处理

    1. 缺失值处理 缺失值处理主要有三个内容、四个函数:发现缺失值(isnull() notnull())、删除缺失值(dropna())、填补缺失值(fillna()) 首先创建一个矩阵 1.1 发现缺失值 发现缺失值是生成布尔类型的掩码数据,...

  • 2017最新python金融量化分析与策略编写实战

    第一部分:金融与量化投资 股票 股票的分类 股票市场的构成 影响股价的因素 股票买卖(A股) 金融分析 金融量化投资 量化策略 第二部分:量化投资与Python Ipython:交互式的Python命令行 Ipython常用的魔术命令 ...

  • C#中的Attribute详解(下)

    从上篇里我们可以看到,Attribute似乎总跟public、static这些关键字(Keyword)出现在一起。莫非使用了Attribute就相当于定义了新的修饰符(Modifier)吗?让我们一窥究竟吧!

量化分析师的Python日记【第6天:数据处理的瑞士军刀pandas下篇】
量化分析师的Python日记【第6天:数据处理的瑞士军刀pandas下篇】
Global site tag (gtag.js) - Google Analytics