Python大数据分析6:案例-每天股票涨了多少?

时间序列不仅可以用于前面所说的数据记录中的列表示和索引表示,也广泛应用于各种时间计算等常见操纵中。这次我们准备结合一些时间分析的例子,来看看各种时间序列的操作方法。

为了能够讲清楚这些问题,我们需要一个例子,这里以一家公司的股票信息来做分析。

首先我们需要解决如何读取这个数据文件,在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’))

此时内容没变,但是对应的时间都往前提了一天。

因此还可以同样计算当天数据和前一天数据的差值:

细心的同学可能注意到,这个结果基本和前面是一样的,但是中间多了一些空值,主要原因在于这个时间序列并非连续序列,股票交易只有工作日的记录,周末两天没有记录,移动日期后,序列中间产生了很多无法一一对应的时间,主要就是周末前后两天的错位,从而产生一些空值,而且产生的时间和刚才移动数据会产生不同。

Python大数据分析6:案例-每天股票涨了多少?》有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注