这是一个非常新的问题,但我说有这样的数据:
test_data <-
data.frame(
var0 = 100 + c(0, cumsum(runif(49, -20, 20))),
var1 = 150 + c(0, cumsum(runif(49, -10, 10))),
date = seq(as.Date("2002-01-01"), by="1 month", length.out=100)
)
Run Code Online (Sandbox Code Playgroud)
如何在x轴上使用?绘制时间序列var0
和var1
同一图表?奖励积分,如果你做和不同的颜色,并且可以包括一个传奇!date
ggplot2
var0
var1
我确信这很简单,但我找不到任何例子.
更新:迄今为止 表现最佳的算法就是这个算法.
该问题探讨了用于检测实时时间序列数据中的突然峰值的稳健算法.
请考虑以下数据集:
p = [1 1 1.1 1 0.9 1 1 1.1 1 0.9 1 1.1 1 1 0.9 1 1 1.1 1 1 1 1 1.1 0.9 1 1.1 1 1 0.9 1, ...
1.1 1 1 1.1 1 0.8 0.9 1 1.2 0.9 1 1 1.1 1.2 1 1.5 1 3 2 5 3 2 1 1 1 0.9 1 1 3, ...
2.6 4 3 3.2 2 1 1 0.8 4 4 …
Run Code Online (Sandbox Code Playgroud) language-agnostic algorithm signal-processing time-series data-analysis
我正在创建一个系统,使用SNMP以(可能)5分钟的间隔轮询设备以获取有关各种指标的数据,例如CPU利用率,磁盘利用率,温度等.最终目标是以时间序列图的形式为系统用户提供可视化.
我已经看过了,在过去使用的RRDTool,但拒绝了它作为存储捕获的数据无限地将我的项目很重要,我想更高层次和更灵活的访问捕获的数据.所以我的问题是:
什么是更好的关系数据库(如MySQL或PostgreSQL)或非关系数据库或NoSQL数据库(如MongoDB或Redis)在查询数据进行图形处理时的性能.
给定一个关系数据库,我将使用一个data_instances
表,其中将存储为所有设备测量的每个度量捕获的每个数据实例,并包含以下字段:
领域: id
fk_to_device
fk_to_metric
metric_value
timestamp
当我想在特定设备上绘制特定指标的图形时,我必须查询此单个表,过滤掉其他设备,以及为此设备分析的其他指标:
SELECT metric_value, timestamp FROM data_instances
WHERE fk_to_device=1 AND fk_to_metric=2
Run Code Online (Sandbox Code Playgroud)
此表中的行数为:
d * m_d * f * t
Run Code Online (Sandbox Code Playgroud)
其中d
是的数量的装置,m_d
是累计度量的数目被记录为所有设备,f
是频率在其中数据被轮询和t
是总量时间系统已收集数据.
对于一年中每5分钟记录3个设备的10个度量标准的用户,我们将有不到500万条记录.
没有索引fk_to_device
并且fk_to_metric
扫描这个不断扩展的表将花费太多时间.因此,索引上述字段以及timestamp
(用于创建具有本地化期间的图表)是必需的.
MongoDB具有集合的概念,与表不同,这些可以在没有设置的情况下以编程方式创建.有了这些,我可以为每个设备划分数据存储,甚至为每个设备记录每个指标.
我没有使用NoSQL的经验,也不知道它们是否提供任何查询性能增强功能,例如索引,但是前一段提出在数据存储在NoSQL下的结构中进行大多数传统的关系查询工作.
具有正确索引的关系解决方案是否会在一年内减少爬行?或者NoSQL方法的基于集合的结构(与我存储的数据的心智模型相匹配)是否提供了明显的好处?
database time-series non-relational-database relational-database nosql
即使我发现哈德利对谷歌的论坛中发帖POSIXct
和geom_vline
,我无法完成它.我有一个时间序列,并希望绘制1998年,2005年和2010年的垂直线.我尝试使用ggplot
和qplot
语法,但我仍然看不到垂直线,或者在第一个垂直网格上绘制垂直线,整个系列在右边有点奇怪地移动.
gg <- ggplot(data=mydata,aes(y=somevalues,x=datefield,color=category)) +
layer(geom="line")
gg + geom_vline(xintercept=mydata$datefield[120],linetype=4)
# returns just the time series plot I had before,
# interestingly the legend contains dotted vertical lines
Run Code Online (Sandbox Code Playgroud)
我的日期字段格式为"1993-07-01",属于班级Date
.
我接受了我的系列并将其强制转换为dtype =的日期时间列datetime64[ns]
(虽然只需要一天的分辨率......不确定如何更改).
import pandas as pd
df = pd.read_csv('somefile.csv')
column = df['date']
column = pd.to_datetime(column, coerce=True)
Run Code Online (Sandbox Code Playgroud)
但绘图不起作用:
ipdb> column.plot(kind='hist')
*** TypeError: ufunc add cannot use operands with types dtype('<M8[ns]') and dtype('float64')
Run Code Online (Sandbox Code Playgroud)
我想绘制一个直方图,只显示按周,月或年的日期计数.
当然有办法做到这一点pandas
?
我如何使用strptime
或任何其他函数来解析R中的毫秒时间戳?
time[1]
# [1] "2010-01-15 13:55:23.975"
strptime(time[1], format="%Y-%m-%d %H:%M:%S.%f")
# [1] NA
strptime(time[1], format="%Y-%m-%d %H:%M:%S")
# [1] "2010-01-15 13:55:23"`
Run Code Online (Sandbox Code Playgroud) 我有这样的查询,很好地生成两个给定日期之间的一系列日期:
select date '2004-03-07' + j - i as AllDate
from generate_series(0, extract(doy from date '2004-03-07')::int - 1) as i,
generate_series(0, extract(doy from date '2004-08-16')::int - 1) as j
Run Code Online (Sandbox Code Playgroud)
它在2004-03-07
和之间生成162个日期2004-08-16
,这就是我想要的.这段代码的问题是,它不会得到正确的答案时,这两个日期都不同年份,例如,当我尝试2007-02-01
和2008-04-01
.
有更好的解决方案吗?
我是Pandas的新手....我有一堆民意调查数据; 我想计算一个滚动均值,以便根据三天的窗口得出每天的估计值.当我从理解这个问题,在rolling_*函数计算基于值指定数量的窗口,而不是具体的日期时间范围.
是否有实现此功能的不同功能?还是我坚持写自己的?
编辑:
样本输入数据:
polls_subset.tail(20)
Out[185]:
favorable unfavorable other
enddate
2012-10-25 0.48 0.49 0.03
2012-10-25 0.51 0.48 0.02
2012-10-27 0.51 0.47 0.02
2012-10-26 0.56 0.40 0.04
2012-10-28 0.48 0.49 0.04
2012-10-28 0.46 0.46 0.09
2012-10-28 0.48 0.49 0.03
2012-10-28 0.49 0.48 0.03
2012-10-30 0.53 0.45 0.02
2012-11-01 0.49 0.49 0.03
2012-11-01 0.47 0.47 0.05
2012-11-01 0.51 0.45 0.04
2012-11-03 0.49 0.45 0.06
2012-11-04 0.53 0.39 0.00
2012-11-04 0.47 0.44 0.08
2012-11-04 0.49 0.48 0.03
2012-11-04 0.52 0.46 …
Run Code Online (Sandbox Code Playgroud) 在多个项目中,我们必须存储,汇总,评估简单的测量值.一行通常由时间戳,值和值的一些属性组成.在某些应用程序中,我们希望每秒存储1000个值以及更多值.这些值不仅必须插入,而且还必须以相同的速率删除,因为值的生命周期限制在一年左右(在不同的聚合步骤中,我们不会存储整年的1000/s).
到目前为止,我们已开发出不同的解决方案.一个基于Firebird,一个基于Oracle,另一个基于一些自制存储机制.但这些都不是非常令人满意的解决方案.
两种RDBMS解决方案都无法处理所需的数据流.除此之外,提供值的应用程序(例如设备驱动程序)不能轻易附加到数据库,插入语句很麻烦.最后,虽然强烈需要具有数据的SQL接口,但典型的评估很难在SQL中制定并且执行速度慢.例如,在上个月的所有测量中,每15分钟找到一个带有时间戳的最大值.
自制的解决方案可以处理插入速率,并且具有客户友好的API,但它没有像查询语言那样,并且不能被其他应用程序通过某些标准接口(例如报告)使用.
我梦想中的最佳解决方案是数据库系统:
您是否知道某些数据库接近这些要求,或者您是否会以不同的方式解决问题?
time-series ×10
python ×3
r ×3
database ×2
date ×2
ggplot2 ×2
pandas ×2
algorithm ×1
datetime ×1
graph ×1
matplotlib ×1
nosql ×1
numpy ×1
performance ×1
postgresql ×1
r-faq ×1
scipy ×1
strptime ×1