我有一系列由时间值(浮点数)索引的数据,我想要获取系列的块并将它们绘制在一起。例如,假设我在20周内每隔10分钟拍卖一次股票价格,我希望通过绘制20行股票价格来看每周模式。所以我的X轴是一周,我有20行(对应于本周的价格)。
更新
索引不是均匀间隔的值,而是浮点数。它类似于:
t = np.arange(0,12e-9,12e-9/1000.0)
noise = np.random.randn(1000)/1e12
cn = noise.cumsum()
t_noise = t+cn
y = sin(2*math.pi*36e7*t_noise) + noise
df = DataFrame(y,index=t_noise,columns=["A"])
df.plot(marker='.')
plt.axis([0,0.2e-8,0,1])
因此索引的间隔不均匀。我正在处理来自模拟器的电压与时间数据。我想知道如何创建一个时间窗口T,并将df拆分为T long的块并将它们绘制在彼此之上。因此,如果数据长度为20 * T,那么在同一图中我将有20行。
抱歉这个混乱;我使用股票类比认为它可能有所帮助。
答案 0 :(得分:4)
假设pandas.TimeSeries
个对象为起点,您可以进行分组
ISO周数和ISO工作日的元素
datetime.date.isocalendar()
。以下语句忽略了ISO年份,汇总了每一天的最后一个样本。
In [95]: daily = ts.groupby(lambda x: x.isocalendar()[1:]).agg(lambda s: s[-1])
In [96]: daily
Out[96]:
key_0
(1, 1) 63
(1, 2) 91
(1, 3) 73
...
(20, 5) 82
(20, 6) 53
(20, 7) 63
Length: 140
可能有更简洁的方法来执行下一步,但目标是将索引从元组数组更改为MultiIndex对象。
In [97]: daily.index = pandas.MultiIndex.from_tuples(daily.index, names=['W', 'D'])
In [98]: daily
Out[98]:
W D
1 1 63
2 91
3 73
4 88
5 84
6 95
7 72
...
20 1 81
2 53
3 78
4 64
5 82
6 53
7 63
Length: 140
最后一步是从工作日“卸下” MultiIndex,为每个工作日创建列,并用缩写替换工作日数字,以提高可读性。
In [102]: dofw = "Mon Tue Wed Thu Fri Sat Sun".split()
In [103]: grid = daily.unstack('D').rename(columns=lambda x: dofw[x-1])
In [104]: grid
Out[104]:
Mon Tue Wed Thu Fri Sat Sun
W
1 63 91 73 88 84 95 72
2 66 77 96 72 56 80 66
...
19 56 69 89 69 96 73 80
20 81 53 78 64 82 53 63
要为每周创建一个折线图,请调换数据框,因此列是周数,行是工作日(请注意,可以通过在上一步中取消工作日的周数来代替工作日来避免此步骤),以及致电plot
。
grid.T.plot()
答案 1 :(得分:0)
让我试着回答这个问题。基本上我将填写或重新索引完整的工作日并每5天采样一次,同时因假期或暂停而丢失数据
>>> coke = DataReader('KO', 'yahoo', start=datetime(2012,1,1))
>>> startd=coke.index[0]-timedelta(coke.index[0].isoweekday()-1)
>>> rng = array(DateRange(str(startd), periods=90))
>>> chunk=[]
>>> for i in range(18):
... chunk.append(coke[i*5:(i+1)*5].dropna())
...
然后你可以循环块来绘制每周数据