Java 历史贸易数据的时间序列抽样

Java 历史贸易数据的时间序列抽样,java,c++,scala,time-series,resampling,Java,C++,Scala,Time Series,Resampling,我在csv文件中有一些历史交易日期,格式为:unixtime、price、volume,我想分析这些数据 我设法用Python实现了这一点,但速度非常慢(我花了大约2天的时间运行算法进行30天的数据测试) 我试图用c/c++甚至Java或Scala来做,但我的主要问题是我没有办法对数据进行重新采样。 我需要将这些数据重新采样为15分钟间隔的格式:日期时间、打开、高、低、关闭、音量,但我找不到任何方法在c/c中实现这一点++ 在Python中,这就是我想要的(它使用了一个数据帧): 有没有在c/c

我在csv文件中有一些历史交易日期,格式为:unixtime、price、volume,我想分析这些数据

我设法用Python实现了这一点,但速度非常慢(我花了大约2天的时间运行算法进行30天的数据测试)

我试图用c/c++甚至Java或Scala来做,但我的主要问题是我没有办法对数据进行重新采样。 我需要将这些数据重新采样为15分钟间隔的格式:日期时间、打开、高、低、关闭、音量,但我找不到任何方法在c/c中实现这一点++

在Python中,这就是我想要的(它使用了一个数据帧):


有没有在c/c++/Java/scala中实现这一点的想法(或库?

这只是一个简单的示例,说明如何使用标准scala库。此代码可以在Scala REPL中运行:

// not importing external libraries like Joda time and its Scala wrappers
import java.util.Date
import scala.annotation.tailrec

case class Sample(value: Double, timeMillis: Long)
case class SampleAggregate(startTimeMillis: Long, endTimeMillis: Long,
  min: Sample, max: Sample)

val currentMillis = System.currentTimeMillis
val inSec15min = 15 * 60
val inMillis15min = inSec15min * 1000
// sample each second:
val data = (1 to inSec15min * 100).map { i =>
  Sample(i, currentMillis + i*1000) }.toList

@tailrec
def aggregate(xs: List[Sample], intervalDurationMillis: Long,
  accu: List[SampleAggregate]): List[SampleAggregate] =
  xs match {
    case h :: t =>
      val start = h.timeMillis
      val (slice, rest) = xs.span(_.timeMillis < (start + intervalDurationMillis))
      val end = slice.last.timeMillis
      val aggr = SampleAggregate(start, end, slice.minBy(_.value),
        slice.maxBy(_.value))
      aggregate(rest, intervalDurationMillis, aggr :: accu)
    case Nil =>
      accu.reverse
  }

val result = aggregate(data, inMillis15min, Nil)
结果:

result.foreach(println)
SampleAggregate(1388809630677,1388810529677,Sample(1.0,1388809630677),Sample(900.0,1388810529677))
SampleAggregate(1388810530677,1388811429677,Sample(901.0,1388810530677),Sample(1800.0,1388811429677))
SampleAggregate(1388811430677,1388812329677,Sample(1801.0,1388811430677),Sample(2700.0,1388812329677))
SampleAggregate(1388812330677,1388813229677,Sample(2701.0,1388812330677),Sample(3600.0,1388813229677))
SampleAggregate(1388813230677,1388814129677,Sample(3601.0,1388813230677),Sample(4500.0,1388814129677))
SampleAggregate(1388814130677,1388815029677,Sample(4501.0,1388814130677),Sample(5400.0,1388815029677))
SampleAggregate(1388815030677,1388815929677,Sample(5401.0,1388815030677),Sample(6300.0,1388815929677))

我们可以将函数传递到
span
,该函数将定义间隔(小时或天)。当从文件中读取时,也可以将其转换为流。

尝试查看,以便进行数据操作。我自己才刚刚发现这一点,所以我不确定它的全部功能,但它的灵感来自熊猫

如果需要的话,为什么不按日期对数据进行排序,然后按15分钟的时间将数据分成若干块并进行聚合呢。这可以迭代完成,因此您不必在内存中保存太多数据。您可以使用标准的Scala函数。也许你也可以并行运行,问题是手动操作对我来说太容易出错了。考虑到不断变化的小时、天、月、年以15分钟(或不同)的间隔进行检查,这只是需要大量测试来检查所有计算是否正确。最好使用一些已经通过所需质量控制的库(如pandas for Python或Zoo for R)。不幸的是,这不是一个库推荐站点。如果你开始做某件事,我们可以帮助你解决困难。就我个人而言,在处理数据集时,我倾向于使用SQL,特别是当它看起来应该是简单的聚合时;使用日历/一天中的时间表,不同的时间段变得微不足道。否则,准备将数据放入其中的“bucket”应该是可行的,并且可能是可并行的。所需的任何测试分为两部分;基于时差创建存储桶,并将其放入这些存储桶中。我认为您可以定义一个函数,该函数从流数据中生成间隔。若你们处理任何以分、秒、小时表示的事情,你们可以将日期转换成这些单位,然后分割。如果你处理的是几天、几周等等,那么你必须使用类似JodaTime的东西提取这些单位。闰秒可能可以忽略。熊猫有重采样功能。因为您使用的是熊猫数据帧,所以与使用提供的重采样功能相比,您的解决方案非常复杂。但是,尽管它实现了类似熊猫的数据帧,但它没有处理时间序列的重采样功能。非常感谢,我将尝试后者,并让您知道结果。
data.take(10).foreach(println)
Sample(1.0,1388809630677)
Sample(2.0,1388809631677)
Sample(3.0,1388809632677)
Sample(4.0,1388809633677)
Sample(5.0,1388809634677)
Sample(6.0,1388809635677)
Sample(7.0,1388809636677)
Sample(8.0,1388809637677)
Sample(9.0,1388809638677)
Sample(10.0,1388809639677)
result.foreach(println)
SampleAggregate(1388809630677,1388810529677,Sample(1.0,1388809630677),Sample(900.0,1388810529677))
SampleAggregate(1388810530677,1388811429677,Sample(901.0,1388810530677),Sample(1800.0,1388811429677))
SampleAggregate(1388811430677,1388812329677,Sample(1801.0,1388811430677),Sample(2700.0,1388812329677))
SampleAggregate(1388812330677,1388813229677,Sample(2701.0,1388812330677),Sample(3600.0,1388813229677))
SampleAggregate(1388813230677,1388814129677,Sample(3601.0,1388813230677),Sample(4500.0,1388814129677))
SampleAggregate(1388814130677,1388815029677,Sample(4501.0,1388814130677),Sample(5400.0,1388815029677))
SampleAggregate(1388815030677,1388815929677,Sample(5401.0,1388815030677),Sample(6300.0,1388815929677))