Clojure 时间序列重采样
我有一个dict,类似于Clojure 时间序列重采样,clojure,time-series,data-analysis,Clojure,Time Series,Data Analysis,我有一个dict,类似于{:datetime[unix timestamp]:count[longs]} 在:datetime和:count中有相同数量的内容 :datetime没有指定的时间间隔,通常是刻度数据。我想对数据进行重新采样,以便它们有一个定义的间隔,例如5分钟,并对范围的计数进行汇总 例如: { :datetime [timestamp every minute] :count [1 1 1 1 1. . .] } 将其重新采样到 { :datetime
{:datetime[unix timestamp]:count[longs]}
在:datetime
和:count
中有相同数量的内容
:datetime
没有指定的时间间隔,通常是刻度数据。我想对数据进行重新采样,以便它们有一个定义的间隔,例如5分钟,并对范围的计数进行汇总
例如:
{
:datetime [timestamp every minute]
:count [1 1 1 1 1. . .]
}
将其重新采样到
{
:datetime [timestamp every 5 minutes]
:count [5 5 5 5 5 ...]
}
您希望从时间戳向量中提取五分之一的元素,并从计数向量中添加五个计数的组。像这样的东西可以做到:
(defn resample [m]
(let [{dt :datetime ct :count} m
newdt (map first (partition 5 dt))
newct (map (partial apply +) (partition 5 ct))]
{:datetime newdt
:count newct}))
这里有一些花哨但可能效率低下的东西:
(defn重采样-5[{:keys[datetime count]}]
(letfn[(楼层-5[dt](-dt(mod dt(*5 60 1000)))
(总和计数[[时间对]]
[时间(减少+(映射第二对))]
(let[对(分区2(交织日期时间计数))
成对分组(按#分组(五楼(第一%))成对)
求和(映射求和计数对组)]
{:datetime(映射第一个和)
:count(映射二次和)})
请注意它对集合执行了多少操作:interleave
、partition
、groupby
、map
+reduce
,然后再map
两次
这里有一个更高效的方法,只扫描一次收集:
(defn重采样-5[{:keys[datetime count]}]
(letfn[(添加勾号[结果dt c]
(如果dt
(->结果
(在[:datetime]conj dt中更新)
(在[:count]conj c中更新)
结果]]
(循环[日期时间日期时间
计数
最后四舍五入零
最后数到0
结果{:datetime[]:count[]}]
(如果(空?日期时间)
(添加最后一次计数四舍五入的勾选结果)
(让[dt(首次日期时间)
c(第一次计数)
四舍五入(-dt(mod dt(*5 60 1000))]
(如果(=最后四舍五入)
(重复(rest日期时间)(rest计数)四舍五入(+count last c)结果)
(重复(rest datetimes)(rest计数)四舍五入c(添加最后一次计数四舍五入的勾号结果最后一次()()())()))
只有在有特定间隔的情况下才有效。如果我有数据记号,我不能使用分区
。类似地,如果我在数据中有间隙,在这种情况下,您可以使用累加器在循环/重复中执行。这应该是相当琐碎的。