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,表示后复权
来源:https://www.cnblogs.com/culin/p/17102351.html
本站部分图文来源于网络,如有侵权请联系删除。