Python 熊猫:如何在彼此上方绘制年度数据

Python 熊猫:如何在彼此上方绘制年度数据,python,pandas,Python,Pandas,我有一系列由时间值(一个浮点)索引的数据,我想从这些数据中取出一块,然后将它们相互叠加。举个例子,假设我在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 =

我有一系列由时间值(一个浮点)索引的数据,我想从这些数据中取出一块,然后将它们相互叠加。举个例子,假设我在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长的块,然后将它们相互叠加。所以如果数据是20*T长,那么在同一个图中我会有20行


很抱歉造成混乱;我使用股票类比法认为这可能会有所帮助。

让我试着回答这个问题。基本上,我将填充或重新索引完整的工作日,每5天采样一次,同时删除由于假期或暂停而丢失的数据

>coke=DataReader('KO','yahoo',start=datetime(2012,1,1))

>>startd=coke.index[0]-timedelta(coke.index[0].isoweekday()-1)

>rng=array(日期范围(str(startd),句点=90))

>>chunk=[]

范围(18)内的i的
>>:

。。。chunk.append(coke[i*5:(i+1)*5].dropna())


然后您可以循环块来绘制每周数据

让我试着回答这个问题。基本上,我将填充或重新索引完整的工作日,每5天采样一次,同时删除由于假期或暂停而丢失的数据

>coke=DataReader('KO','yahoo',start=datetime(2012,1,1))

>>startd=coke.index[0]-timedelta(coke.index[0].isoweekday()-1)

>rng=array(日期范围(str(startd),句点=90))

>>chunk=[]

范围(18)内的i的
>>:

。。。chunk.append(coke[i*5:(i+1)*5].dropna())


然后,您可以循环块来绘制每周数据

假设一个
pandas.TimeSeries
对象作为起点,您可以分组 按ISO周数和ISO工作日列出的元素 . 以下语句忽略了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
可能有更简洁的方法来执行下一步,但目标是将索引从元组数组更改为多索引对象

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
最后一步是将工作日从 多索引,为每个工作日创建列,并用缩写替换工作日编号,以提高可读性

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()

假设一个
pandas.TimeSeries
对象作为起点,您可以分组 按ISO周数和ISO工作日列出的元素 . 以下语句忽略了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
可能有更简洁的方法来执行下一步,但目标是将索引从元组数组更改为多索引对象

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
最后一步是将工作日从 多索引,为每个工作日创建列,并用缩写替换工作日编号,以提高可读性

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()

谢谢你的帖子。你教了我很多。对我不起作用的部分是策划。我得到错误“ValueError:无法将字符串转换为float:Fri”。我得到了一个使用plt.plot(grid.T)的基本绘图,但是轴标签是错误的。我不懂.groupby命令。我遇到的问题是,我的索引是由间距不相等的浮点组成的…我将更新问题以包含数据集。我认为相同的概念适用于浮点索引。您只需要编写自己的方法,将样本分组到时段组和组内的时间步长中。希望helps@crewburn我试试看。有一件事我搞不懂,那就是如何用值而不是索引号来索引索引。假设我想要得到索引值在x和y之间的所有行。如果序列/数据帧作为问题中的示例数据被索引,那么索引值应该是浮点对象,而不是索引号。您可能需要研究groupby方法,通过该方法传递一个函数,该函数从索引中获取一个对象,在本例中为float,并返回一个可用于哈希的值来对行进行分组。要将浮点值分组到“bucket”中,请查看
numpy.digitalize
。谢谢您的帖子。你教了我很多。对我不起作用的部分是策划。我得到错误“ValueError:无法将字符串转换为float:Fri”。我得到了一个使用plt.plot(grid.T)的基本绘图,但是轴标签是错误的。我不懂.groupby命令。我遇到的问题是,我的索引是由间距不相等的浮点组成的…我将更新问题以包含数据集。我认为相同的概念适用于浮点索引。您只需要编写自己的方法,将样本分组到时段组和组内的时间步长中。希望helps@crewburn我试试看。有一件事我搞不懂,那就是如何用值而不是索引号来索引索引。假设我想要得到索引值在x和y之间的所有行。如果序列/数据帧作为问题中的示例数据被索引,那么索引值应该是浮点对象,而不是索引号。你可能想调查一下格罗