Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 时间序列重采样_Clojure_Time Series_Data Analysis - Fatal编程技术网

Clojure 时间序列重采样

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

我有一个dict,类似于
{: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(添加最后一次计数四舍五入的勾号结果最后一次()()())()))

只有在有特定间隔的情况下才有效。如果我有数据记号,我不能使用
分区
。类似地,如果我在数据中有间隙,在这种情况下,您可以使用累加器在
循环/重复中执行。这应该是相当琐碎的。