如何在很长的时间序列中去除假期和周末,并在Python中建模时间序列?
在Python里有没有什么函数可以处理这个问题?Google文档里有一个“星期几”的操作,所以也许Python里也有类似的功能。我觉得肯定有人解决过这个问题,因为在金融和研究等稀疏数据中经常会遇到类似的问题。我主要是想整理一大堆不同大小的向量,这些向量是按天索引的时间序列。我不太确定该怎么处理这些天——是把第一天标记为1,最后一天标记为N,还是用Unix时间戳,或者应该怎么做?我也不确定时间序列是否应该保存成矩阵,这样我可以更容易地建模来计算相关矩阵之类的,有没有现成的工具可以做到这些?
让我们试着解决这个问题,不要被“实际”操作搞得太复杂:
import itertools
seq = range(100000)
criteria = cycle([True]*10 + [False]*801)
list(compress(seq, criteria))
现在我得把它们转换成天,然后把$\mathbb R$转换成$( \mathbb R, \mathbb R)$的元组。所以$V : \mathbb R \mapsto \mathbb R^{2}$还缺少,我在调查中。
[更新]
让我们来玩玩!下面的代码解决了一个子问题——创建一些测试数据来测试这些东西——现在我们需要创建任意的天数和估值,以便尝试在任意时间序列上进行测试。如果我们能创建一个函数$V$,那我们就非常接近解决这个问题了……不过它必须考虑假期和周末,所以可能不太简单(不太确定)。
import itertools as i
import time
import math
import numpy
def createRandomData():
samples=[]
for x in range(5):
seq = range(5)
criteria = i.cycle([True]*x+ [False]*3)
samples += [list(i.compress( seq, criteria ))]
return samples
def createNNtriangularMatrix(data):
N = len(data)
return [aa+[0]*(N-len(aa)) for aa in data]
A= createNNtriangularMatrix(createRandomData())
print numpy.array(A)
print numpy.corrcoef(A)
5 个回答
我觉得这要看你具体的问题是什么。如果是个人日历的话,用“天”来做索引就足够了。
一个人的一生可以长达200年,这大约是73000天。你可以简单地计算并记录下这些天,可能可以用一个字典来存储,比如:
day = {}
# day[0] = [event_a, event_b, ...]
# or you may want to rewrite the __getitem__ method like this: day['09-05-2012']
试试使用pandas这个工具。你可以创建一个DateOffset
,用来处理工作日,并把你的数据放进一个DataFrame
里(具体可以参考:http://pandas.pydata.org/pandas-docs/stable/timeseries.html),这样就能对数据进行分析了。
我觉得你应该想办法确定你想要包含的那些天,然后创建一个(可能是循环的)子程序,利用切片操作来处理你那个大列表。
如果你想要不连续的切片,可以看看这个问题:
或者你也可以把那些你不想要的天设置为空值(零或者 None)。