>

Pandas库

Pandas库

Pandas是python环境下有名的数据统计包,它是集于Numpy构建的含有更高级数据结构和数据分析库。Pandas会涉及与Numpy相近的机制和方法

使用Numpy创建一个同时包含字符串,浮点数和整数的数组,用于存储股票行情数据时,需要按一下方式定义dtype

 

  • Series和DataFrame
创建方式:
deftype = ([('date',np.str_,10),('close',np.float32),('vol',np.uint32)])
stock = np.array([('2019-01-11',11.01,13000),('2019-01-12',12.11,12000),('2019-01-14',13.01,16000)],dtype=deftype)
print(stock)

创建方式类型1:
#字典对应列,index对应行
pd = pd.DataFrame({'one':[1,2,3],'two':['a','b','c']},index=['001','002','003'])
 
创建方式类型2:测试时候用,一般不用
dataframe = pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([1,2,3,4],index=['a','b','c','d'])})


import numpy as np
import pandas as pd
#pandas.Series(data=None,index=None,dtype=None,name=None,copy=False,fastpath=False)
s_ndarry = pd.Series(np.arange(4),index = ['201901','201902','201903','201904'])
print(s_ndarry)  #201901 1 201902 2 201903 3 201904 4

#字典形式创建Series对象,那么索引index就是字典里面key
s_dict = pd.Series({'001':1,'002':2,'003':3}) #当同时有字典KEY 和index时候,index索引为NaN

 

  • Series的访问
series.value  #全部元素值,
series.index  #全部元素索引
series['1']  #访问索引下的元素
series[:2]  #访问前2行元素

 

  • DataFrame的生成和访问
#pandas.DataFrame(data=None,index=None,columns=None,dtype=None,copy=False)
data=pd.DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('ABCD'))
df_lise_dict = pd.DataFrame({'close':[1,2,3],'open':[1,2,3]},index=['A','B','C'])
print(df_lise_dict)  #index横向key,close 为纵向key(columns栏目)

 

  • DataFrame常用属性及方法
df_lise_dict.index  #访问所有索引
df_lise_dict.columns  #访问所有栏目
df_lise_dict.axes  #访问所有行和列索引
df_lise_dict.value  #访问所有值
#访问series数据结构
df_lise_dict.close  #df_lise_dict['close']效果相同
df_lise_dict[0:1]  #访问第一行的行和列元素
#访问指定元素级的方法
df_lise_dict.loc[[某行],[某列,某列]]  #loc[['B'],['open']]通过标签方式选取元素B行的2(B 2)
df_lise_dict.iloc  #iloc[0,2]通过位置方法选取第1行和第3行元素


T        #转置,行列转换
describe()  #获取快速统计


df.mean(axis=0,skipna=false)       #所有列平均统计
df['open'].mean()  #列平均统计

dsum(axis=1)       #加
sort_index(axis,...,ascending)      #默认按照 列 排序  
ascending=True升序排序
sort_values(bu,axis,asceding)      #值排序
sort_values('open')            #按照open 列 的值排序
sort_values(['open','close'])      #按照第一第二关键字顺序排序,如果open一样话按照close排序
sort_values(0,axis=1)           #按照0行,行排序 0行 10 11 12 13 15


Numpy的通用函数同样适用于pandas
函数的赋值元运算
df.apply(func函数,axis=0)          #将自定义函数用在各行,各列上
df.apply(lambda x:x.sum())         #应用在一列元素上,返回列相加的和


df.applymap(lambda x:x+1)       #相当于把所有元素传入,返回+1,结果是把所有元素的值加上1
applymap()                #把一个函数应用到DataFrame所有元素上
#Series对象用map(),DataFrame()对象用applymap()



分组运算
df.groupby('close')      #将close下面相同标签,元素分成一组
df.groupby('close').sum()   #分组后求和
df.groupby('close').mean()  #分组后求平均
聚合方法size()和count()
df.groupby('close').size()    #size计数时包含NaN
df.groupby('close').count()    #count计数时不包含Nan
df.groupby('close').get_group('foo')    #查看组下面的所有foo元素
df.groupby(['close','open']).sum      #多层分组求和


对象合并 merge, join 和 concatenate 的拼接方法的与之相似。
df.merge('表1','表2',on='想要加入索引的一列')

 

 

  • DataFrame索引和切片
#通过标签获取:单列使用相当于Series功能,双列最后使用[0],表示Series的索引[行],如果双列使用都使用标签则表示[列],[行]
df['A']      #显示A列
df[['A','B']]   #A,B两列
df['A'][0]    #显示A列第1个单独元素(不带索引)

#如果前面用切片的话,解释为行,后面可以用列表是
df[0:10]['A','C']    #前10行,A列和C列(带索引)


#通过loc使用,表示[行][列]
df.loc[:,['A','B']]
df.loc[:,'A':'C']
df.loc[0,'A']
df.loc[0:10,['A','C']]

 

  • DataFrame多层次化索引

 

#层次化索引是pandas 重要功能,能够在一个轴上拥有多个索引级别
se = pd.Series(np.random.rand(9),index=[['a','a','a','b','b','b','c','c','c'],[1,2,3,1,2,3,1,2,3]]

 

  • 元素标签和位置的转换
#通过索引获取标签,通过标签获取元素
df_lise_dict.index[0,2]  #获取1行和3行的索引
df_lise_dict.loc[df_lise_dict.index[0,2],'open']  #通过索引获取open栏目下的元素

#通过columns.get_indexer获取栏目(列)位置,通过位置获取元素,通过index.get_loc()获取索引(行)的位置
df_lise_dict.columns.get_indexer(['close'])  #获取close栏目位置[0],第0列
df_lise_dict.iloc[[0,2],df_lise_dict.columns.get_indexer(['close'])]  #第0列close下的第1行和第三行

df_lise_dict.index.get_loc('C')  #获取索引 C 所在的位置3
df_lise_dict.iloc[df_lise_dict.index.get_loc('C'),[0,2]]  #获取3行所在的第1和第3列

 

  • 条件表达式访问元素
#选取条件 'open'列大于该列平均值
df_lise_dict.open > df_lise_dict.open.mean()  #获得布尔型bool运算值Flase,True

#通过运算条件传入行,获取当前满足该条件的所有行

df_lise_dict(df_lise_dict.open > df_lise_dict.open.mean())

#加入列标签,可以获取满足条件下的具体行下的具体列
df_lise_dict.loc[df_lise_dict.open > df_lise_dict.open.mean(),'close']


#通过布尔值过滤
df['open']<20    #Series对象返回bool所有元素,满足为True,不满足为False
df[df['open']<20]  #只显示满足条件的
df<20          #返回所有元素的bool
df[df<20]       #返回所有元素,满足条件为显示值,不满足为NaN

df[df<20]=0      #返回所有元素,满足条件的所有元素都设置为0


#isin() 数据过滤
#两种条件过滤用下方为传统选取方式,还可以用更简便的isin()进行多条件过滤,dataframe['open'].isin([1,3])
df = dataframe[dataframe['open']==1]                 #选取满足条件的一整行
df = dataframe[(dataframe['open']==1)|(dataframe['open']==3)]  #选取满足条件的一整行

#如果过滤对象包含字符串和数据对象,无法整体过滤,可以进行条件过滤,拷贝一个新的对象,再过滤
df2 = df.loc[:,'close':'open'].copy()  #过滤1级
df2[df2<2]=0                 #过滤2级


 

  • DataFrame处理缺失数据的方法
dropna(axis=0,where='any',....)#把缺失数据丢掉
fillna()  #fillna(0)把缺失数据填充为0
isnull()  #array.isnull()判断是否为空,返回False,True,array[array.isnull()]找到为空的元素
notnull()
fill_value=0  #把缺失值设置为0,以便于继续保留原数据
灵活的算术方法: add,sub,div,mul加减乘除
#如何在两个Series对象相加时将缺失值设为0?
#处理人员流动缺失值相加
sr1 = pd.Series([1,2,3],index=['li','wang','zhao'])
sr2 = pd.Series([5,5,5],index=['he','li','wang'])
print(sr1.add(sr2,fill_value=0))
#结果

he 5.0
li 6.0
wang 7.0
zhao 3.0
dtype: float64

 

 

#dropna(axis=0,where='any',....)#详解  axis=0 以行为轴

dropna(how='any')  #有any任何,一行有NaN就删除
dropna(how='all')  #有all所有,一行有NaN就删除
 

 

  • DataFrame行和列改名
#通过直接columns传值的方式可以改名,但是必须传入完整的元素就是所有的列
dataframe = pd.DataFrame({'open':[1,2,3],'close':[9,9,9]},index=['2018','2019','2020'])
dataframe.columns = {'open':'new_open','close':'new_close'}

#标准用法rename()
DataFrame.rename(mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False, level=None)

参数:
映射器,索引和列:字典值,键表示旧名称,值表示新名称。这些参数只能一次使用。
axis:int或字符串值,“ 0”表示行,“ 1”表示列。
copy:如果为True,则复制基础数据。
inplace:如果为True,则在原始 DataFrame 中进行更改。
level:用于在数据帧具有多个级别索引的情况下指定级别。

返回类型:具有新名称的 DataFrame

new_DataFrame = DataFrame.rename(columns={'open':'new_open'},index={'2018':'555'})

 

  • pandas:从文件读取
#读取文件:从文件名,URL,文件对象中加载数据

read_csv    默认分隔符为逗号
read_table   默认分隔符为\t



#读取文件函数主要参数
pd.read_table('601318.csv',sep=',')

sep       指定分隔符,可用正则表达式如'\s+'


#默认会把第一行解释为列名,如果第一行为空写header=None自动编号

header=None   指定文件无列名(自动编号0,1,2)

names       指定列名abcd  pd.read_csv('601318.csv',header=None,names=['a','b','c','d'])

index_col    指定某列作为索引pd.read_csv('601318.csv',header=None,index_col=['open'])

skiprow     指定跳过某些行pd.read_csv('601318.csv',header=None,name=['a','b','c','d'],skiprow=[1,2,3])

na_values    指定某些字符串表示缺失值  pd.read_csv('601318.csv',na_values=['NaN','None','nan'])
         #备注:::当一整列的第一个字符为字符串时候,下面出现的数字都会被解析成字符串类型,而不是数字类型,除非表示缺失NaN

parse_dates   指定某些列是否被解释为日期,布尔,或者列表  pd.read_csv('601318.csv',parse_dates=['date那列'])

nrows      指定读取几行文件

chunksize    分块读取文件,指定块大小

 

  • pandas:写入文件

 

写入到文件:一定加index=False,不然会重复输出索引
to_csv

写入到文件的主要参数:
sep          #
na_rep        #指定缺失值转换字符串,默认为空字符串  设置na_rep='None'那么缺失值就会存成None
header=False     #不输出列名一行
index=False     #不输出列的索引一行
cols         #指定输出的列,传入列表

其它文件类型:  json,XML,HTML,数据库

 

 

  • 时间序列的生成和转换

from datetime import date,time,datetime,timedelta
#date 处理年月日
#time 处理时,分,秒,微妙
#datetime 结合
#date,time最大和最小单位
print(f'date.max:{date.max} and date.min:{date.min}')
print(f'time.max:{time.max} and time.min:{time.min}')

 

#构造datetime(year,month.day[,hour[,minute[,second[,microsecond[,tzinfo]]]]])

datetima_obj = datetime(2016,10,26,10,23,15,1)  #2016-10-26 10:23:15 000001

 

datetime方法和属性

replace()  #用参数指定年月日代替原有的对象

re_datetime_obj = datetime_obj.replace(day = 27,hour = 20)

datetima_obj.isoformat()  #返回固定格式的时间字符串,YYY-MM-DD HH:MM:SS,符合ISO 8601标准时间

datetima_obj.strftime((%Y-%m-%d%x)  #自定义格式化时间%Y-%m-%d%X,%年%月%日%时间,strftime((%Y-%m-%d%x)

 

 #把一个字符串转换为时间对象  st='2017-01-02'

st='2017-01-02'
dt = datetime.datetime.strptime(st,'%Y-%m-%d')  #strptime()把字符串转换成时间对象
dt1 = dt.strftime('%Y-%m-%d')            #strftime()把时间对象转换成字符串
print(dt1)

 

  • 时间序列类型:
时间戳:特定时刻
固定时期:如2017年7月
时间间隔:起始时间-结束时间
  • python标准库:datetime
date time datetime timedelta
strftime()
strptime()
  • 第三方包dateutil

dateutil.parser.parse()

  • 成组处理日期:pandas

pd.to_datetime(['2010-10-11','2020-10-13'])

pandas:时间对象处理

#产生时间索引对象数组 range 范围:date_range 
start     #开始时间
end      #结束时间
periods   #时间长度
freq     #时间频率,默认为'D',可选
H(our)天,W(eek)周,B(usiness)商业日,M(onth)月,S(emi-)M(onth)半月,(min)T(es)分钟,S(econd)秒,A()year)年,....

pd.date_range('2017-10-10','2017-10-20')  #生成的频率范围,默认每天一个单位 10,11...20
pd.date_range('2017-10-10','2017-10-20',frep='B')  #只生成工作日的天数  
pd.date_range('2017-10-10','2017-10-20',frep='W-MON')  #只生成每周一  
pd.date_range('2017-10-10','2017-10-20',frep='W-TUE')  #只生成每周二  

pd.date_range('2017-10-10',periods='100')  #往后周期长度一百,这里生成100天
pd.date_range('2017-10-10',periods='100',freq='W')  #往后周期长度一百,这里生成100周
 

#打开文件把时间栏目设置为索引,再把时间栏目设置成时间类型
df = pd.read_csv('601318.csv',index_col=['date'],parse_dates=['date'])
print(type(df.index[0]))  #检索index 就可以查询type
df['2011':'2013']      #时间类型可以进行切片检索,年份检索df['2011']


 

  • DataFrame的生成和访问

 

  • DataFrame的生成和访问

 

  • DataFrame的生成和访问

 

  • DataFrame的生成和访问

 

 

  • DataFrame的生成和访问
posted @ 2020-11-08 19:06  仕杰资本  阅读(100)  评论(0)    收藏  举报
>