翼度科技»论坛 编程开发 python 查看内容

03-Pandas详解

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
Pandas

Pandas的主要功能

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

Series

Series介绍:Series是一种类似于一维数组的对象,由一组数据和一组与之相关的数据标签(索引)组成,比较像列表和字典的结合体
Series创建方式:
  1. # 普通创建
  2. pd.Series([1,2,3,4])
  3. # 带索引创建
  4. pd.Series([1,2,3,4],index=['a','b','c','d']) #但是我们依旧可以通过[0]来访问到数据,有两种访问方法,并没有被真正覆盖掉
  5. # 使用字典创建
  6. 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-常用函数
  1. # 获取索引值
  2. sr.index
  3. # 获取值
  4. sr.values
  5. # 根据标签花式索引
  6. sr[['a','b']]
  7. # 根据标签切片
  8. sr['a','b']
复制代码
Sr整数索引问题
在对Series进行切片处理时,可能会出现整数访问的问题
  1. import pandas as pd
  2. import numpy as np
  3. sr = pd.Series(np.arange(20))
  4. sr2 = sr[10:].copy()
  5. sr2[10] # 可以正常访问
  6. sr2[0] # 无法正常访问
  7. # 如何解决整数索引的问题
  8. # 通过标签选择 [[1,13,14],[10,11,12]]
  9. sr2.loc[10] #结果为1
  10. # 通过下标选择
  11. src.iloc[10] #选择失败,下标越界
  12. src.iloc[0] #结果为1
复制代码
02-数据对齐

在Series中,是按照索引对齐的,两个Series对象是按照索引对齐然后计算的。
  1. sr1 = pd.Series([11,12,13],['a','c','d'])
  2. sr2 = pd.Series([14,15,21],['c','a','d'])
  3. sr1 + sr2
  4. # 如果一个索引有,另外一个索引没有,那么就会出现NaN的结果
  5. # 缺失值处理
  6. sr1.add(sr2,fill_value=0)
复制代码
运行结果如下
  1. a    26
  2. c    26
  3. d    34
  4. dtype: int64
复制代码

DataFrame

DataFrame:DataFrame是一个表格型数据结构,含有一组有序的列.DataFrame可以被看作是Series组成的字典,并且共用一个索引。
创建DataFrame:
先创建一个基础的DataFrame
  1. test1 = pd.DataFrame({'one':[1,2,3],'two':[4,5,6]},index=['a','b','c'])
  2. test1
  3. # 或者也可以用以下格式,体现Pandas将字典转化为dataframe
  4. import pandas as pd
  5. data = {"name":["yahoo","google","facebook"],"marks":[200,400,800],"price":[9,3,7]}
  6. dataframe1 = pd.DataFrame(data,index=['one','two','three'])
  7. dataframe1
复制代码
创建出的DataFrame对象如下

以及如下:

再通过Series创建一个DataFrame
  1. 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文件
  1. # 读取csv文件
  2. df = pd.read_csv('test.csv')
  3. # 保存csv文件
  4. df.to_csv("文件名.csv")
复制代码
01-常用属性

DataFrame常用属性
属性值属性作用index获取索引T转置columns获取列索引values获取值索引describe()获取快速统计
02-索引与切片
  1. # 根据索引名索引
  2. df['列']['行'] #注意顺序不能反了
  3. # 通过标签形式访问
  4. df.loc['行','列']
  5. # 通过标签方式访问某几行
  6. df.loc[['a','c'],:]
复制代码
03-数据对齐

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

04-缺失值处理

DataFrame在处理缺失值的时候与Series有相像的地方,但是在使用dropna()时候,会删除这一行。
所以我们需要一个函数,当这一行全为NaN时候,我们再删除它
  1. # 当一行全为缺失值时,进行删除
  2. test2.dropna(how='all')
  3. # 当一行只要有一个缺失值时,删除
  4. test2.dropna(how='any')
  5. # 当一列只要有一个缺失值是,删除
  6. test2.dropna(axis=1,how='any') #默认axis=0,按行删除,修改axis=1,按列删除
复制代码
05-常用函数
  1. # 对列(行)求平均值 mean(axis=0,skipna=False)
  2. df.mean() #默认按照列求缺失数据
  3. df.mean(axis=1) #按照行求缺失数据
  4. # 对列(行)求和
  5. df.sum()  #默认按照列求缺失数据
  6. df.sum(axis=1) #按照行求缺失数据
  7. # 对列(行)索引排序,有NAN的部分不参与排序,放到最后
  8. df.sort_values(by='列名') #按照某列升序排列
  9. df.sort_values(by='列名',ascending=False) #按照某列降序排列
  10. df.sort_values(by='行名',axis=1) #按照某行升序排列
  11. df.sort_values(by='行名',axis=1,ascending=False) #按照某行降序排列
  12. # 按某一列(行)索引排序
  13. df.sort_index() #按照行索引升序排序
  14. df.sort_index(ascending=False) #按照列索引降序排序
复制代码
时间序列


01-时间对象


  • Python标准库处理时间对象:datetime
  • 灵活处理时间对象:dateutil
  • 成组处理时间对象:pandas:pd.to_datetime()
时间对象转换代码
  1. # 初步的时间对象转换
  2. import datetime
  3. datetime.datetime.strptime('2023-02-06','%Y-%m-%d')
  4. # 忽略格式,自动转换
  5. dateutil.parser.parse('2020-02-01')
  6. dateutil.parser.parse('2020-JAN-01')
  7. dateutil.parser.parse('03/04/2023')
  8. # pands转换方式
  9. pd.to_datetime(['2001-01-02','2020-Feb-03'])
  10. # 输出结果如下
  11. pd.to_datetime(['2001-01-02','2020-Feb-03'])
复制代码
02-生成时间范围
  1. # 默认生成一段时间的时间序列
  2. pd.date_range('2010-01-01','2010-05-01')
  3. # 选择起始节点,按天数生成
  4. pd.date_range('2010-01-01',periods=60)
  5. # 选择起始节点,按小时数生成
  6. pd.date_range('2023-02-01',periods=60,freq='H')
  7. # 选择起始节点,输出工作日
  8. pd.date_range('2023-02-01',periods=60,freq='B') #生成的是时间戳
  9. # 时间范围转化为字符串
  10. tm[0].to_pydatetime()
复制代码
03-时间序列

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

  • 传入年或年月作为切片方式
  • 传入日期范围作为切片方式
  • 丰富的函数支持:resample()、truncate()
  1. # 以B模式生成时间序列
  2. sr = pd.Series(np.arange(100),index=pd.date_range('2023-01-01',periods=100,freq='B'))
  3. sr
  4. # 取时间序列中的值  返回结果为99
  5. sr['2023-04-10']
  6. # 取时间序列之后的值
  7. sr['2023-01-01':]
  8. # 取时间序列一段范围的值
  9. # 返回结果为99
复制代码
根据时间戳求每周的和
  1. sr.resample('W').sum()
复制代码
求和结果如下:

根据时间戳求每月的和
  1. sr.resample('M        ').sum()
复制代码


文件操作


01-CSV文件读取

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

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


01-读取股票数据

get_price():可以得到股票数据,语法格式如下:
  1. 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
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具