草庐IT

03-Pandas详解

默默耕耘的王同学 2023-03-28 原文

Pandas

Pandas的主要功能

  • 具备对其功能的数据结构DataFrame、Series
  • 集成时间序列功能
  • 提供丰富的数学运算和操作
  • 灵活处理缺失数据

Series

Series介绍:Series是一种类似于一维数组的对象,由一组数据和一组与之相关的数据标签(索引)组成,比较像列表和字典的结合体
Series创建方式:

# 普通创建
pd.Series([1,2,3,4])
# 带索引创建
pd.Series([1,2,3,4],index=['a','b','c','d']) #但是我们依旧可以通过[0]来访问到数据,有两种访问方法,并没有被真正覆盖掉
# 使用字典创建
pd.Series({'a':1,'b':2})

Series使用特性

Series支持array特性 Series支持字典特性
从ndarray创建Series:Series(arr) 从字典创建Series,Series(dic)
与标量运算sr*2 in运算:'a' in str
两个Series运算:sr1+sr2 键索引:s['a']、s[['a'、'b']]
索引:sr[0],s[[1,2,4]]
切片:sr[0:2]
通用函数:np.abs(sr)
布尔值过滤:sr[sr>0]

01-常用函数

# 获取索引值
sr.index
# 获取值
sr.values
# 根据标签花式索引
sr[['a','b']]
# 根据标签切片
sr['a','b']

Sr整数索引问题
在对Series进行切片处理时,可能会出现整数访问的问题

import pandas as pd
import numpy as np
sr = pd.Series(np.arange(20))
sr2 = sr[10:].copy()
sr2[10] # 可以正常访问
sr2[0] # 无法正常访问
# 如何解决整数索引的问题
# 通过标签选择 [[1,13,14],[10,11,12]]
sr2.loc[10] #结果为1
# 通过下标选择
src.iloc[10] #选择失败,下标越界
src.iloc[0] #结果为1

02-数据对齐

在Series中,是按照索引对齐的,两个Series对象是按照索引对齐然后计算的。

sr1 = pd.Series([11,12,13],['a','c','d'])
sr2 = pd.Series([14,15,21],['c','a','d'])
sr1 + sr2
# 如果一个索引有,另外一个索引没有,那么就会出现NaN的结果
# 缺失值处理
sr1.add(sr2,fill_value=0)

运行结果如下

a    26
c    26
d    34
dtype: int64


DataFrame

DataFrame:DataFrame是一个表格型数据结构,含有一组有序的列.DataFrame可以被看作是Series组成的字典,并且共用一个索引。
创建DataFrame:
先创建一个基础的DataFrame

test1 = pd.DataFrame({'one':[1,2,3],'two':[4,5,6]},index=['a','b','c'])
test1
# 或者也可以用以下格式,体现Pandas将字典转化为dataframe
import pandas as pd
data = {"name":["yahoo","google","facebook"],"marks":[200,400,800],"price":[9,3,7]}
dataframe1 = pd.DataFrame(data,index=['one','two','three'])
dataframe1

创建出的DataFrame对象如下

以及如下:
再通过Series创建一个DataFrame

test2 = pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([1,2,3,4],index=['a','b','c','d'])})

创建出的DataFrame对象如下

DataFrame读取CSV文件

# 读取csv文件
df = pd.read_csv('test.csv')
# 保存csv文件
df.to_csv("文件名.csv")

01-常用属性

DataFrame常用属性

属性值 属性作用
index 获取索引
T 转置
columns 获取列索引
values 获取值索引
describe() 获取快速统计

02-索引与切片

# 根据索引名索引
df['列']['行'] #注意顺序不能反了
# 通过标签形式访问
df.loc['行','列']
# 通过标签方式访问某几行
df.loc[['a','c'],:]

03-数据对齐

DataFrame行列在进行数据对齐的时候,其行索引和列索引分别对齐

04-缺失值处理

DataFrame在处理缺失值的时候与Series有相像的地方,但是在使用dropna()时候,会删除这一行。
所以我们需要一个函数,当这一行全为NaN时候,我们再删除它

# 当一行全为缺失值时,进行删除
test2.dropna(how='all')
# 当一行只要有一个缺失值时,删除
test2.dropna(how='any')
# 当一列只要有一个缺失值是,删除
test2.dropna(axis=1,how='any') #默认axis=0,按行删除,修改axis=1,按列删除

05-常用函数

# 对列(行)求平均值 mean(axis=0,skipna=False)
df.mean() #默认按照列求缺失数据
df.mean(axis=1) #按照行求缺失数据
# 对列(行)求和
df.sum()  #默认按照列求缺失数据
df.sum(axis=1) #按照行求缺失数据
# 对列(行)索引排序,有NAN的部分不参与排序,放到最后
df.sort_values(by='列名') #按照某列升序排列
df.sort_values(by='列名',ascending=False) #按照某列降序排列
df.sort_values(by='行名',axis=1) #按照某行升序排列
df.sort_values(by='行名',axis=1,ascending=False) #按照某行降序排列
# 按某一列(行)索引排序
df.sort_index() #按照行索引升序排序
df.sort_index(ascending=False) #按照列索引降序排序

时间序列

01-时间对象

  • Python标准库处理时间对象:datetime
  • 灵活处理时间对象:dateutil
  • 成组处理时间对象:pandas:pd.to_datetime()

时间对象转换代码

# 初步的时间对象转换
import datetime
datetime.datetime.strptime('2023-02-06','%Y-%m-%d')
# 忽略格式,自动转换
dateutil.parser.parse('2020-02-01')
dateutil.parser.parse('2020-JAN-01')
dateutil.parser.parse('03/04/2023')
# pands转换方式
pd.to_datetime(['2001-01-02','2020-Feb-03'])
# 输出结果如下
pd.to_datetime(['2001-01-02','2020-Feb-03'])

02-生成时间范围

# 默认生成一段时间的时间序列
pd.date_range('2010-01-01','2010-05-01')
# 选择起始节点,按天数生成
pd.date_range('2010-01-01',periods=60)
# 选择起始节点,按小时数生成
pd.date_range('2023-02-01',periods=60,freq='H')
# 选择起始节点,输出工作日
pd.date_range('2023-02-01',periods=60,freq='B') #生成的是时间戳
# 时间范围转化为字符串
tm[0].to_pydatetime()

03-时间序列

时间序列:以时间对象为索引的Series或DataFrame,datatime对象作为索引时是存储在DatetimeIndex对象中的
时间序列的特殊功能:

  • 传入年或年月作为切片方式
  • 传入日期范围作为切片方式
  • 丰富的函数支持:resample()、truncate()
# 以B模式生成时间序列
sr = pd.Series(np.arange(100),index=pd.date_range('2023-01-01',periods=100,freq='B'))
sr
# 取时间序列中的值  返回结果为99
sr['2023-04-10']
# 取时间序列之后的值
sr['2023-01-01':]
# 取时间序列一段范围的值
# 返回结果为99

根据时间戳求每周的和

sr.resample('W').sum()

求和结果如下:
根据时间戳求每月的和

sr.resample('M	').sum()


文件操作

01-CSV文件读取

Pandas文件读取主要参数

参数名 参数作用
sep 指定分隔符, 可用正则表达式比如's+'
header=None 指定文件无列名
name 指定列名
index_col 指定某列作为索引
skip_row 指定跳过某些行
na_values 指定某些字符串表示缺失值
parse_dates 指定某些列是否被解析为日期,类型为布尔值或者里欸包
# 读取csv文件,将时间列作为索引(注意此时为字符串)
pd.read_csv('test.csv',index_col='date')
# 将时间字符串转为时间序列
pd.read_csv('test.csv',index_col='date',parse_dates=True) #将能表示为时间序列的数据表示为时间序列
# 指定某列为时间序列
pd.read_csv('test.csv',index_col='date',parse_dates='date')
# 当没有列名,全是数据的时候,可以自动生成header,默认0,1,2...
pd.read_csv('test.csv',header=None)
# 当没有列名,全是数据的时候,可以使用列表赋值header
pd.read_csv('test.csv',header=None,names=['abcdefg']

02-CSV文件保存

Pandas文件保存主要参数

参数名 参数作用
sep 指定文件分隔符
na_rep 指定缺失值转换的字符串,默认空字符串
header=False 不输出列名的一行
index=False 不输出索引的一行
cols 输出指定的列

实战操作

01-读取股票数据

get_price():可以得到股票数据,语法格式如下:

get_price(security,start_date=None,end_date=None,frequency='daily',fields=None,skip_paused=False,fq='pre',count=None)

get_price()函数可以按天或者按分钟读取数据,各项参数含义如下:

  • security:一只股票代码或一只股票代码的list
  • start_date:开始时间,与参数count二选一,不可同时使用。需要注意的是,如果参数count和start_date都没有设置,则start_date生效值为:'2015-01-01'
  • end_date:结束时间,默认值是'2015-12-31',
  • frequency:单位时间长度,几天或几分钟,默认为daily.也可以是minute、Xd、Xm.X表示几的意思
  • fileds:字符串list,选择要获取行情的数据,默认为None。参数Fields支持SecurityUnitDate中所有的数据 ,包含
    • open close low high volume money factor high_limit low_limit avg pre_close paused
  • skip_pasued:是否跳过不交易日期
  • fq:复权选项。参数值设为pre,表示前复权,为默认设置。参数权设为None,表示不复权,返回实际价格,参数值设为post,表示后复权

有关03-Pandas详解的更多相关文章

  1. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  2. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  3. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  4. 【Elasticsearch基础】Elasticsearch索引、文档以及映射操作详解 - 2

    文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就

  5. 最强Http缓存策略之强缓存和协商缓存的详解与应用实例 - 2

    HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地,以便下次请求时能够直接从缓存中获取资源,从而减少网络请求次数,提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。一.强缓存强缓存是指浏览器直接从本地缓存中获取资源,而不需要向web服务器发出网络请求。这是因为浏览器在第一次请求资源时,服务器会在响应头中添加相关缓存的响应头,以表明该资源的缓存策略。常见的强缓存响应头如下所述:Cache-ControlCache-Control响应头是用于控制强制缓存和协商缓存的缓存策略。该响应头中的指令如下:max-age:指定该资源在本地缓存的最长有效时间,以秒为单位。例如:Ca

  6. IDEA 2022 创建 Spring Boot 项目详解 - 2

    如何用IDEA2022创建并初始化一个SpringBoot项目?目录如何用IDEA2022创建并初始化一个SpringBoot项目?0. 环境说明1.  创建SpringBoot项目 2.编写初始化代码0. 环境说明IDEA2022.3.1JDK1.8SpringBoot1.  创建SpringBoot项目        打开IDEA,选择NewProject创建项目。        填写项目名称、项目构建方式、jdk版本,按需要修改项目文件路径等信息。        选择springboot版本以及需要的包,此处只选择了springweb。        此处需特别注意,若你使用的是jdk1

  7. 详解Unity中的粒子系统Particle System (二) - 2

    前言上一篇我们简要讲述了粒子系统是什么,如何添加,以及基本模块的介绍,以及对于曲线和颜色编辑器的讲解。从本篇开始,我们将按照模块结构讲解下去,本篇主要讲粒子系统的主模块,该模块主要是控制粒子的初始状态和全局属性的,以下是关于该模块的介绍,请大家指正。目录前言本系列提要一、粒子系统主模块1.阅读前注意事项2.参考图3.参数讲解DurationLoopingPrewarmStartDelayStartLifetimeStartSpeed3DStartSizeStartSize3DStartRotationStartRotationFlipRotationStartColorGravityModif

  8. VMware虚拟机与本地主机进行磁盘共享(详解) - 2

    VMware虚拟机与本地主机进行磁盘共享前提虚拟机版本为Windows10(专业版,不是可能有问题)本地主机为家庭版或学生版(此版本会有问题,但有替代方式)最好是专业版VMware操作1.关闭防火墙,全部关闭。2.打开电脑属性3.点击共享-》高级共享-》权限4.如果没有everyone,就添加权限选择完全控制,然后应用确定。5.打开cmd输入lusrmgr.msc(只有专业版可以打开)如果不是专业版,可以跳过这一步。点击用户-》administrator密码要复杂密码,否则不行。推荐admaiN@1234类型的密码。设置完密码,点击属性,将禁用解开。6.如果虚拟机的windows不是专业版,可

  9. ruby-on-rails - Rails 未定义方法 `strftime' 为 "2013-03-06":String - 2

    我遇到了错误“2013-03-06”的未定义方法`strftime':String当尝试使用strftime从字符串2013-03-06正常显示日期(2013年6月3日或类似日期)时。在我的index.html.erb中执行此操作的行看起来像这样我只是在学习Rails,所以我确信这只是一个愚蠢的初学者错误,我们将不胜感激。谢谢 最佳答案 当strftime是时间/日期类的方法时,您的截止日期看起来是一个字符串。你可以试试这个:Date.parse(task.duedate).strftime("%B%e,%Y")

  10. ElasticSearch之 ik分词器详解 - 2

    IK分词器本文分为简介、安装、使用三个角度进行讲解。简介倒排索引众所周知,ES是一个及其强大的搜索引擎,那么它为什么搜索效率极高呢,当然和他的存储方式脱离不了关系,ES采取的是倒排索引,就是反向索引;常见索引结构几乎都是通过key找value,例如Map;倒排索引的优势就是有效利用Value,将多个含有相同Value的值存储至同一位置。分词器为了配合倒排索引,分词器也就诞生了,只有合理的利用Value,才会让倒排索引更加高效,如果一整个Value不进行任何操作直接进行存储,那么Value和key毫无区别。分词器Analyzer通常会对Value进行操作:一、字符过滤,过滤掉html标签;二、分

随机推荐