Python3 Series数据详解
Posted 古月书斋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3 Series数据详解相关的知识,希望对你有一定的参考价值。
pandas的Series类型的数据由一列数据及与之对应的标签(索引,位于数据的左侧)两部分组成。 Series对象本质上是一个NumPy数组。因此,NumPy的数组处理函数同样适用于Series对 象。每个Series对象实际上都由两个数组组成,具有index和values两大属性。
一、Series对象的创建
Series对象的创建通过Series类的构造函数Series()函数来实现。在创建Series对象 之前,要先导入pandas包,我们一般使用简写pd来代指pandaso创建一个Series对象时, 可以同时为其index属性和values属性赋值,如果没有对这两个属性赋值,则创建一个空 的Series对象。
import pandas as pd
Sl=pd.Series()
Series对象一般有如下几种创建方式。
1、同时指定index属性和values属性的值
S2=pd.Series([1,3,5,7,9], index=['a','b','c','d','e'])
Series对象创建以后,可以增加新的元素。比如对S2对象增加一个新的元素值11,index 为“f”。
S2['f']=11
2、仅指定values属性的值
如果只制定values的取值,没有设定index属性的取值,则会默认产生从0开始,步长 为1,长度为values值的长度的整数数组。
import pandas as pd
import numpy as np
S3= pd.Series([1, 3, -5, 7])
S4=pd.Series(np.random.randn(5))
二、元素的提取和切片
我们可以通过指定Series对象的位置或者标签来提取数据值。
1、简单查询
Series对象中有head( )、tail()和take()方法用于查询数据,其具体用法如下:
import pandas as pd
import numpy as np
S4=pd.Series(np.arange(0,100,1))
#默认查看时象的前五个数据
S4.head()
#默认查看对象的最后五个数据
S4.tail()
#通过传入索引值列表来提取元素
S4.take([2,4,0])
2、利用位置或标签提取元素
Series对象与一维数组最大的不同在于其可以指定标签作为索引值。数组只能通过元 素所在位置的索引来提取元素,而对Series对象来说,除了位置索引以外,更方便更有特点的是通过标签索引来提取元素。
import pandas as pd
S2=pd.Series([1,3,5,7,9], index=['a','b','c','d','e'])
S2[2]
S2['d']
和NumPy数组一样,Series对象可以使用位置数组或者位置列表进行存取。与NumPy 数组不同的是,Series对象还可以使用标签数组和标签列表
import pandas as pd
S2=pd.Series([1,3,5,7,9], index=['a','b','c','d','e'])
S2[[1,3,4]]
S2[['b','d','e']]
3、利用位置或标签进行切片
Series也支持标签切片和位置切片。两种切片方式有一定的区别: 标签切片同时包括起始标签和结束标签位置; 而位置切片遵循Python的切片规则,即包括起始位置,但不包括结束位置。
import pandas as pd
S2=pd.Series([1,3,5,7,9], index=['a','b','c','d','e'])
S2[0:4]
S2['a':'d']
三、时间序列Time Series
时间序列分析在金融数据分析中占据重要位置,Pandas包中也支持时间序列类型的数 据。时间序列(time series)类型也是一种Series类型,与一般Series对象不同的是,时间序列的index属性取值为时间戳。同时,时间序列之间的算术运算会自动按时间对齐。
1、创建时间序列
(1)、通过Timestamp ( )创建
时间序列的创建方式与一般的Series对象创建方式相同,我们只需要将index设置为 Timestamp 对 象。 Timestamp对象由Pandas包中的Timstamp ( )来创建,Timestamp ( )的传入值可以 为str类型的数据,也可以为datatime类型的数据。
from datetime import datetime
import pandas as pd
date = datetime(2022,5,8)
date = pd.Timestamp(date)
ts=pd.Series(1,index=[date])
(2)、通过 to_datetime()创建
不过,由于Timestamp()并不接受列表等可迭代对象,如果我们想要创建一个Series 对象,则需要对每个日期应用一次Timestamp()函数,这样显然很麻烦。因此,我们一般会先使用to_datetime()来将时间转换为Datetimeindex。
from datetime import datetime
import pandas as pd
dates = ['2022-01-01','2022-01-02','2022-01-03','2022-01-04','2022-01-05','2022-01-06']
S2=pd.Series([1,3,5,7,9,10], index=pd.to_datetime(dates))
(3)、通过datetime对象创建
实际上,对于datetime对象,我们可以直接将其作为index,而Pandas会自动将其转 换成Timestamp对象
dates = [datetime(2022,1,1),datetime(2022,1,2),datetime(2022,1,3)]
ts=pd.Series ([10,20,30],index=dates)
2、截取时间段数据
时间序列只是index比较特殊的Series,因此一般的索引操作对时间序列依然有效。其特别之处在于对时间序列索引的操作优化。如使用各种字符串进行索引:
ts['20220101']
Out[33]: 10
ts['2022-01-01']
Out[34]: 10
ts['01/01/2022']
Out[35]: 10
对于较长的序列,还可以只传入年份或年份加月份来选取切片
ts['2021']
ts['2021-01':'2021-05']
通过truncate进行切片,可以让在切片时使用的字符串时间戳可以不必存在于index之中。
ts.truncate(after="2022-5-1")
3、滞后或者超前操作
滞后操作指的是将t期的数据换成t-a期的数据,而超前操作自然是将t期的数据换成t+ a期的数据。在实际应用中,这样的操作非常常见。比如,在计算收益率的时候,我们就可以简单地将数据滞后1期,然后用原来的数据减去滞后1期的数据,得到每期的价 格变化,然后再除以滞后1期的数据就得到了收益率。 对于滞后或者超前操作,可以使用shift()方法:
ts.shift(1)#正数为滞后
ts.shift(-1)#负数为超前
4、高低频时间数据转换
对于时间序列数据,往往需要在高低频数据之间进行转换,比如,当我们手头的数据为日度数据时,如果需要计算月度的收益率,就可以将日度数据转换成月度数据,然后计 算月度的收益率。 时间序列数据的index的freq属性显示了数据的频率,一般情况下,如果没有指定freq 的值,默认会将freq设为None。
ts.index.freq
可以通过resample。来修改数据的频率,进行高低频数据的转换。
ts.resample('7D').mean()
ts.resample('7D',closed='right',label='left').sum()
结束
以上是关于Python3 Series数据详解的主要内容,如果未能解决你的问题,请参考以下文章