我试图以某种方式“正常化”月度数据。
我的意思是,我需要记录每日价值,并根据另一个月的数据检查每个月的数据。
唯一的问题是,有些月份比其他月份长。所以我想出了一个我想要这样做的方法,但我对于如何做到这一点感到困惑......
基本上,我正在查看这个网站: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 :(得分:4)
不确定问题出在哪里,所以我编写了一些数据
我认为你的算法是正确的,你只需要对x轴进行标准化。
我想出了这个代码(以及一些情节)来展示我认为的答案
定义一些x和y值:
def x = 1..30
def y = [1..15,15..1].flatten()
然后,以[ [ x, y ], [ x, y ], ...
def xy = [x,y].transpose()
如果我们绘制此列表,我们得到:
然后定义一个normalize函数(基本上与你的相同,但它不会触及y值)
def normalize( xylist, days ) {
xylist.collect { x, y -> [ x * ( days / xylist.size() ), y ] }
}
然后我们可以将列表规范化为28天
def normalxy = normalize( xy, 28 )
现在,如果我们绘制这些点,我们得到
如您所见,两个地块的形状相同,只是宽度不同......
我是否错过了这一点?