2011-09-28 24 views
1

我试图以某种方式“正常化”每月数据。如何生成拉伸图的X值?

我的意思是,我需要采取每日价值,并检查每个月的数据与另一个月的数据。

唯一的问题是,有些月份比其他月份长。所以我想出了一种方法,我想这样做,但我有点困惑,至于如何做到这一点...

基本上,我在看这个网站:http://paulbourke.net/miscellaneous/interpolation/并试图将每组坐标转换为一个具有31个X和Y值的图(我想使用余弦内插器,但我仍然试图找出如何处理它)。

现在,X值有一个函数。我可以像(1..28)通过,并演变成31个值......很简单的代码,这样的事情对我的作品:

def total = (1..30) 
def days = 28 

def resize = {x, y-> 
    result = [] 
    x.each{ result << (it * (y/x.size())} 
    return result 
} 

resize(total,days) 

它返回的31跨越的Y值的列表0到28.

我的问题是:如何将相应的Y值列表转换为这些值?我真的很难将这个概念包裹起来,并且可以使用一些帮助。

我的第一个想法是简单地通过这个函数运行Y值,但是返回的值都低于原始输入。

我正在寻找的东西,将保留在某些点的价值观,但只是水平拉伸图。

例如,在图形长度(1/3)的x值处,该值需要与原始图形长度(1/3)处的值相同。

任何人都可以帮我解决这个问题吗?这让我很难过。

在此先感谢!

+0

你的x,y数据如何存储?你只在这里显示x数据,我想作为一个例子... –

+0

X数据就是我现在可以操作的所有东西。我的Y数据存储在与“总数”相等的列表中。 (我可以通过做[total,yValues] .transpose()来引用每个坐标对,如果这使得这个问题更容易) –

回答

4

不知道问题出在哪里这个问题,所以我做了一些数据

我觉得你的算法是正确的,你只需要正常化x轴。

我想出了这个代码(和一些地块)证明什么,我相信答案是

定义一些x和y的值:

def x = 1..30 
def y = [1..15,15..1].flatten() 

然后,产生XY值的列表形式:[ [ x, y ], [ x, y ], ...

def xy = [x,y].transpose() 

如果我们绘制这份名单中,我们得到:

a plot of the points from 1 to 30

然后定义一个函数正常化(基本和你的一样,但它并没有触及的y值)

def normalize(xylist, days) { 
    xylist.collect { x, y -> [ x * (days/xylist.size()), y ] } 
} 

然后我们就可以正常化我们的名单到28天

def normalxy = normalize(xy, 28) 

现在,如果我们描绘出这些点,我们得到

a plot of the points from 1 to 28

正如你所看到的,这两个地块有相同的形状,他们只是不同的宽度...

我有没有错过这一点?

+1

你点击它。这非常有用,非常感谢你! –

+1

很高兴帮助:-)祝你好运! –