时间序列不仅可以用于前面所说的数据记录中的列表示和索引表示,也广泛应用于各种时间计算等常见操纵中。这次我们准备结合一些时间分析的例子,来看看各种时间序列的操作方法。
为了能够讲清楚这些问题,我们需要一个例子,这里以一家公司的股票信息来做分析。
首先我们需要解决如何读取这个数据文件,在pandas中,读取文件很简单,可以利用pandas的read_csv函数即可,比如:
frame= pd.read_csv(‘macrodata.csv’)
这就表示读取macrodata.csv文件,将其中的所有数据直接生成DataFrame变量,一般CSV文件就是以列表示各种字段、每行一个记录的数据块,可以直接保存到DataFrame变量中。
请注意,当前这个数据文件是放在项目中,因此可以直接读取。
但是在实际操作中,数据文件往往位于其他地方,而且可能含有汉字信息。比如我们这个股票数据文件是“股票数据.csv”,位于C盘temp目录下。直接使用上述方法:
frame= pd.read_csv(‘C:\\temp\\股票数据.csv’)
说明下,这里分隔C盘和目录的反斜杠应该写成两个。了解Python的同学应该知道这是转义字符,不太清楚的同学也应该知道这就表示分隔符。
不过此时会出现错误,主要原因在于这个文件含有汉字信息。
正确的处理方式应该是增加解析汉字所需的字符集,即使用encoding参数:
frame= pd.read_csv(‘C:\\temp\\股票数据.csv’, encoding=’GBK’)
一般而言,大家可以尝试使用诸如“GBK”、“UTF-8”、“GB2312″等字符集中的一个,由于大家使用的电脑环境都各不一样,很难说哪一个有效,不过,一般而言,上述三个中的一个总可以满足要求。
如果我们直接输出DataFrame内容,由于数据很大,所以导致我们无法看到所有数据,这里面有两种方法可以供大家参考:
第一是无需读取全部记录,避免加载数据很多导致的速度过慢,方法是只读取部分记录:
print(frame.head(5))
这里的head就表示取得前面若干行记录。
第二是即使数据很少,但是如果列很多的话,也会有省略的显示内容,因此可以设置下默认的显示方式,即通过pandas的set_option函数设置下一些常见的显示参数,比如:
pd.set_option(‘display.max_columns’, None)
就表示将全部的列都显示出来。
但是,由于横轴宽度太窄,因此需要再次加宽下整体显示宽度:
pd.set_option(‘display.width’, 500)
其实在很多情况下,我们都可以借助这两个参数设定来调整显示。
最后一步常见的操作就是将时间信息设置为当前数据的索引。方法很简单,通过DataFrame的set_index方法即可实现:
frame = frame.set_index(‘日期’)
frame.index = pd.to_datetime(frame.index)
在结果中我们可以看到,一旦将一列设置为索引,则此列就自动从正式列中被除去。同时,为了时间处理方便,我们再次将索引转换为时间类型。
好了,到此为止,我们完成了一些时间分析中最为常见的基本数据准备工作。
接下来我们想结合一些基本操作方法来看看它们的实际应用价值。
比如我们想看看每天比前一天变化多少,既可能增长也可能下降,只需把当天的收盘价减去前一天的收盘价即可计算。为此我们需要按照日期来对齐两种数据:
这里我们使用了shift方法,它表示移动,我们可以先观察下:
print(frame.head(5).shift(1))
从结果看的出来,第一行全部移到了第二行,第二行再全部移动了第三行,以此类推,同时,第一行全部被空值填充。
由于此时索引并没有变化,因此我们可以按照索引对全部数据对齐,进行直接计算:
print(frame[‘收盘价’] – frame[‘收盘价’].shift(1))
其中,虽然是按照每天时间对齐数据,但是其实计算的是当天数据和前一天数据的差值,正好满足了我们的要求。
不过,由于记录行太多,依然无法看到全部内容,此时可以再次设置参数来调节下:
pd.set_option(‘display.max_rows’, None)
当然这个参数一般尽量不要设置,避免返回的数据过多导致显示速度太慢。
除了可以移动内容外,也可以移动索引本身,比如我们为了计算同样的内容,可以将现有索引往前移动一天,方法是:
print(frame[‘收盘价’].shift(-1, freq=’D’))
此时内容没变,但是对应的时间都往前提了一天。
因此还可以同样计算当天数据和前一天数据的差值:
细心的同学可能注意到,这个结果基本和前面是一样的,但是中间多了一些空值,主要原因在于这个时间序列并非连续序列,股票交易只有工作日的记录,周末两天没有记录,移动日期后,序列中间产生了很多无法一一对应的时间,主要就是周末前后两天的错位,从而产生一些空值,而且产生的时间和刚才移动数据会产生不同。
股票数据文件下载:https://www.njcie.com/python/mooc-data/3/股票数据.csv