在多个项目中,我们必须存储,汇总,评估简单的测量值.一行通常由时间戳,值和值的一些属性组成.在某些应用程序中,我们希望每秒存储1000个值以及更多值.这些值不仅必须插入,而且还必须以相同的速率删除,因为值的生命周期限制在一年左右(在不同的聚合步骤中,我们不会存储整年的1000/s).
到目前为止,我们已开发出不同的解决方案.一个基于Firebird,一个基于Oracle,另一个基于一些自制存储机制.但这些都不是非常令人满意的解决方案.
两种RDBMS解决方案都无法处理所需的数据流.除此之外,提供值的应用程序(例如设备驱动程序)不能轻易附加到数据库,插入语句很麻烦.最后,虽然强烈需要具有数据的SQL接口,但典型的评估很难在SQL中制定并且执行速度慢.例如,在上个月的所有测量中,每15分钟找到一个带有时间戳的最大值.
自制的解决方案可以处理插入速率,并且具有客户友好的API,但它没有像查询语言那样,并且不能被其他应用程序通过某些标准接口(例如报告)使用.
我梦想中的最佳解决方案是数据库系统:
您是否知道某些数据库接近这些要求,或者您是否会以不同的方式解决问题?
通过处理时间序列图,我想检测看起来与此类似的模式:
以示例时间序列为例,我希望能够检测到这里标记的模式:
我需要使用什么样的AI算法(我假设的marchine学习技术)才能实现这一目标?有没有我可以使用的库(在C/C++中)?
使用data.table包实现滑动窗口函数的最佳(最快)方法是什么?
我正在尝试计算滚动中位数但每个日期有多行(由于2个额外的因素),我认为这意味着动物园rollapply函数不起作用.以下是使用naive for循环的示例:
library(data.table)
df <- data.frame(
id=30000,
date=rep(as.IDate(as.IDate("2012-01-01")+0:29, origin="1970-01-01"), each=1000),
factor1=rep(1:5, each=200),
factor2=1:5,
value=rnorm(30, 100, 10)
)
dt = data.table(df)
setkeyv(dt, c("date", "factor1", "factor2"))
get_window <- function(date, factor1, factor2) {
criteria <- data.table(
date=as.IDate((date - 7):(date - 1), origin="1970-01-01"),
factor1=as.integer(factor1),
factor2=as.integer(factor2)
)
return(dt[criteria][, value])
}
output <- data.table(unique(dt[, list(date, factor1, factor2)]))[, window_median:=as.numeric(NA)]
for(i in nrow(output):1) {
print(i)
output[i, window_median:=median(get_window(date, factor1, factor2))]
}
Run Code Online (Sandbox Code Playgroud) 有非常好的方法来xts
对象进行子集化.例如,可以获取所有年,月,日的所有数据,但严格地在上午9:30到下午4点之间执行:
my_xts["T09:30/T16:00"]
Run Code Online (Sandbox Code Playgroud)
或者您可以通过以下方式获得两个日期之间的所有观察:
my_xts["2012-01-01/2012-03-31"]
Run Code Online (Sandbox Code Playgroud)
或者在某个特定日期之前/之后的所有日期:
my_xts["/2011"] # from start of data until end of 2011
my_xts["2011/"] # from 2011 until the end of the data
Run Code Online (Sandbox Code Playgroud)
如何获取所有年份的特定月份或所有月份和年份的特定日期的所有数据?是否存在任何其他子集技巧?
我正在尝试使用as.xts()方法将数据帧转换为xts对象.这是我的输入数据帧q:
q
t x
1 2006-01-01 00:00:00 1
2 2006-01-01 01:00:00 2
3 2006-01-01 02:00:00 3
str(q)
'data.frame': 10 obs. of 2 variables:
$ t: POSIXct, format: "2006-01-01 00:00:00" "2006-01-01 01:00:00" "2006-01-01 02:00:00" "2006-01-01 03:00:00" ...
$ x: int 1 2 3 4 5 6 7 8 9 10
Run Code Online (Sandbox Code Playgroud)
结果是:
> as.xts(q)
Error in as.POSIXlt.character(x, tz, ...) :
character string is not in a standard unambiguous format
Run Code Online (Sandbox Code Playgroud)
这是我能想到的最简单的例子,所以没有让它工作是非常令人沮丧的......任何帮助都表示赞赏!
时间序列分解是将时间序列数据集分成三个(或更多)分量的方法.例如:
x(t) = s(t) + m(t) + e(t)
Run Code Online (Sandbox Code Playgroud)
哪里
t is the time coordinate
x is the data
s is the seasonal component
e is the random error term
m is the trend
Run Code Online (Sandbox Code Playgroud)
我试图更多地了解滚动连接的工作方式和一些混乱,我希望有人可以为我澄清这一点.举一个具体的例子:
dt1 <- data.table(id=rep(1:5, 10), t=1:50, val1=1:50, key="id,t")
dt2 <- data.table(id=rep(1:5, 2), t=1:10, val2=1:10, key="id,t")
Run Code Online (Sandbox Code Playgroud)
我希望这会生成一个long data.table
,其中值为dt2
:
dt1[dt2,roll=TRUE]
Run Code Online (Sandbox Code Playgroud)
相反,正确的方法似乎是:
dt2[dt1,roll=TRUE]
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释更多关于如何加入data.table
作品,因为我显然没有正确理解它.我认为这dt1[dt2,roll=TRUE]
对应于sql等价select * from dt1 right join dt2 on (dt1.id = dt2.id and dt1.t = dt2.t)
,除了增加的功能locf.
另外文档说:
X[Y] is a join, looking up X's rows using Y (or Y's key if it has one)
as an index.
Run Code Online (Sandbox Code Playgroud)
这使得似乎只返回X中的内容,正在进行的连接是内连接,而不是外连接.roll=T
那个什么时候但那个特别id
不存在dt1
?多玩一点我无法理解列中放置了什么值.
我有一些分层数据,最终到时间序列数据,看起来像这样:
df = pandas.DataFrame(
{'value_a': values_a, 'value_b': values_b},
index=[states, cities, dates])
df.index.names = ['State', 'City', 'Date']
df
value_a value_b
State City Date
Georgia Atlanta 2012-01-01 0 10
2012-01-02 1 11
2012-01-03 2 12
2012-01-04 3 13
Savanna 2012-01-01 4 14
2012-01-02 5 15
2012-01-03 6 16
2012-01-04 7 17
Alabama Mobile 2012-01-01 8 18
2012-01-02 9 19
2012-01-03 10 20
2012-01-04 11 21
Montgomery 2012-01-01 12 22
2012-01-02 13 23
2012-01-03 14 24
2012-01-04 15 25
Run Code Online (Sandbox Code Playgroud)
我想对每个城市进行时间重新采样,所以就像这样
df.resample("2D", how="sum")
Run Code Online (Sandbox Code Playgroud)
会输出 …
我想用R拟合某种多变量时间序列模型
以下是我的数据示例:
u cci bci cpi gdp dum1 dum2 dum3 dx
16.50 14.00 53.00 45.70 80.63 0 0 1 6.39
17.45 16.00 64.00 46.30 80.90 0 0 0 6.00
18.40 12.00 51.00 47.30 82.40 1 0 0 6.57
19.35 7.00 42.00 48.40 83.38 0 1 0 5.84
20.30 9.00 34.00 49.50 84.38 0 0 1 6.36
20.72 10.00 42.00 50.60 85.17 0 0 0 5.78
21.14 6.00 45.00 51.90 85.60 1 0 0 5.16
21.56 9.00 38.00 52.60 86.14 0 …
Run Code Online (Sandbox Code Playgroud) 我是R的新手但是已经转向它来解决我正在尝试处理的大型数据集的问题.目前我有4列数据(Y值)设置为分钟间隔时间戳(月/日/年小时:分钟)(X值),如下所示:
timestamp tr tt sr st
1 9/1/01 0:00 1.018269e+02 -312.8622 -1959.393 4959.828
2 9/1/01 0:01 1.023567e+02 -313.0002 -1957.755 4958.935
3 9/1/01 0:02 1.018857e+02 -313.9406 -1956.799 4959.938
4 9/1/01 0:03 1.025463e+02 -310.9261 -1957.347 4961.095
5 9/1/01 0:04 1.010228e+02 -311.5469 -1957.786 4959.078
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是缺少一些时间戳值 - 例如,在9/1/01 0:13和9/1/01 0:27之间可能存在间隙,并且这些间隙在数据集中是不规则的.我需要将这些系列中的几个放入同一个数据库中,因为每个系列的缺失值不同,所以日期当前并不对齐每一行.
我想为这些丢失的时间戳生成行,并用空值(没有数据,不是零)填充Y列,这样我就有了一个连续的时间序列.
老实说,我不太确定从哪里开始(在我学习之前没有真正使用过R!)但是任何帮助都会非常感激.到目前为止,我已经安装了chron和zoo,因为看起来它们可能很有用.
谢谢!
time-series ×10
r ×6
data.table ×2
python ×2
xts ×2
coerce ×1
database ×1
dataframe ×1
join ×1
missing-data ×1
pandas ×1
performance ×1
statistics ×1
subset ×1