最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

03-Pandas详解

来源:博客园

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*2in运算:"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 pdimport numpy as npsr = 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    26c    26d    34dtype: 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将字典转化为dataframeimport pandas as pddata = {"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 datetimedatetime.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# 取时间序列中的值  返回结果为99sr["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)# 当没有列名,全是数据的时候,可以使用列表赋值headerpd.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,表示后复权

关键词: 时间序列 处理时间 时间范围