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数据详解的主要内容,如果未能解决你的问题,请参考以下文章

Python3 DataFrame数据详解

Python3 DataFrame数据详解

Python3 Series数据类型

Pandas的DataFrame & Series详解

Pandas系列-Series详解

将 Python3 中的数据帧写入 Netezza