Самый быстрый и гибкий способ диаграмма более 2 миллионов строк данных плоского файла?

Добавить к ответу pauliephonic:

Помощник : функции для создания создания представления легче. Например, если Вы всегда выполняете итерации по списку виджетов для отображения их цены, поместите ее в помощника (наряду с частичным для фактического дисплея). Или если у Вас есть часть RJS, что Вы не хотите загромождать представление, помещаете его в помощника.

29
задан JD Long 25 February 2011 в 18:04
поделиться

2 ответа

1115 Это действительно хороший вопрос. Я рад, что некоторые ребята из R взвешиваются. Я тоже думаю, что R - правильный инструмент для работы, хотя это мой главный молот, так что все выглядит для меня как гвоздь.

Существует несколько концепций R, необходимых для решения этой проблемы. На мой взгляд, вам нужно следующее (ссылки в скобках):

  1. Импорт данных в R. ( Руководство по импорту R экспорта )
  2. Получить данные в соответствующую структуру временных рядов. ( XTS Vignette PDF )
  3. Немного прорисовки. ( Краткое введение в графику )

Вот пример кода с использованием точек 2 мм. Если вы заметили, я не иллюстрирую нанесение всех точек 2 мм. Это медленно и не очень информативно. Но это должно дать вам несколько идей по началу работы. Не стесняйтесь возвращаться с более конкретными вопросами, если вы решите прыгнуть в кроличью нору R!

require( xts )
require( lubridate )

## set up some example data
dataLength <- 2e6
startTime <- ymd_hms("2011-02-01-13-29-53")
fistFullOfSeconds <- 1:dataLength
date <- startTime + fistFullOfSeconds
DD1 <- rnorm( dataLength )
DD2 <- DD1 + rnorm(dataLength, 0, .1 )
DD3 <- rnorm( dataLength, 10, 2)
DD4 <- rnorm( dataLength )

myXts <- xts(matrix( c( DD1, DD2, DD3, DD4 ), ncol=4 ), date)

## now all the data are in the myXts object so let's do some
## summarizing and visualization

## grabbing just a single day from the data
## converted to data.frame to illustrate default data frame plotting
oneDay <- data.frame( myXts["2011-02-02"] ) 
plot( oneDay )

Отношения между DD1 и DD2 вроде как выпрыгивают
enter image description here

boxplot( oneDay )

Boxplot - это круговая диаграмма статистической графики. Сюжет, который вы любите ненавидеть. Можно также ссылаться на этот , пока мы здесь. enter image description here

## look at the max value of each variable every minute
par(mfrow=c(4,1)) ## partitions the graph window
ep <- endpoints(myXts,'minutes')
plot(period.apply(myXts[,1],INDEX=ep,FUN=max))
plot(period.apply(myXts[,2],INDEX=ep,FUN=max))
plot(period.apply(myXts[,3],INDEX=ep,FUN=max))
plot(period.apply(myXts[,4],INDEX=ep,FUN=max))

Даже при одноминутном разрешении я не уверен, что это информативно. Должно быть подмножество. enter image description here

26
ответ дан 28 November 2019 в 01:50
поделиться

Ниже приведен пример данных, загруженных в R, агрегированных и т. Д. ...

Во-первых, некоторые фиктивные данные для записи в файл:

stime <- as.POSIXct("2011-01-01-00:00:00", format = "%Y-%d-%m-%H:%M:%S")
## dummy data
dat <- data.frame(Timestamp = seq(from = stime, by = 5, length = 2000000),
                  DD1 = sample(1:1000, replace = TRUE),
                  DD2 = sample(1:1000, replace = TRUE),
                  DD3 = sample(1:1000, replace = TRUE),
                  DD4 = sample(1:1000, replace = TRUE))
## write it out
write.csv(dat, file = "timestamp_data.txt", row.names = FALSE)

Затем мы можем отсчитывать время в 2 миллиона строк. Чтобы ускорить это, мы сообщаем R классы столбцов в файле: "POSIXct" - это один из способов в R хранить ваши временные метки.

## read it in:
system.time({
             tsdat <- read.csv("timestamp_data.txt", header = TRUE,
                                 colClasses = c("POSIXct",rep("integer", 4)))
            })

, что, занимает около 13 секунд, чтобы прочитать и отформатировать во внутреннем Unix раз на моем скромном ноутбуке.

   user  system elapsed 
 13.698   5.827  19.643 

Агрегация может быть осуществлена ​​множеством способов, один из которых использует aggregate(). Скажем, агрегирование по среднему / среднему часу:

## Generate some indexes that we'll use the aggregate over
tsdat <- transform(tsdat,
                   hours   = factor(strftime(tsdat$Timestamp, format = "%H")),
                   jday    = factor(strftime(tsdat$Timestamp, format = "%j")))
## compute the mean of the 4 variables for each minute
out <- aggregate(cbind(Timestamp, DD1, DD2, DD3, DD4) ~ hours + jday, 
                 data = tsdat, FUN = mean)
## convert average Timestamp to a POSIX time
out <- transform(out,
                 Timestamp = as.POSIXct(Timestamp, 
                                        origin = ISOdatetime(1970,1,1,0,0,0)))

То, что (создание строки out) занимает на моем ноутбуке ~ 16 секунд, и дает следующий вывод:

> head(out)
  hours jday           Timestamp      DD1      DD2      DD3      DD4
1    00  001 2010-12-31 23:29:57 500.2125 491.4333 510.7181 500.4833
2    01  001 2011-01-01 00:29:57 516.0472 506.1264 519.0931 494.2847
3    02  001 2011-01-01 01:29:57 507.5653 499.4972 498.9653 509.1389
4    03  001 2011-01-01 02:29:57 520.4111 500.8708 514.1514 491.0236
5    04  001 2011-01-01 03:29:57 498.3222 500.9139 513.3194 502.6514
6    05  001 2011-01-01 04:29:57 515.5792 497.1194 510.2431 496.8056

Простое построение графика может быть достигнуто с помощью функции plot():

plot(DD1 ~ Timestamp, data = out, type = "l")

Мы можем наложить больше переменных, например:

ylim <- with(out, range(DD1, DD2))
plot(DD1 ~ Timestamp, data = out, type = "l", ylim = ylim)
lines(DD2 ~ Timestamp, data = out, type = "l", col = "red")

или через несколько панелей:

layout(1:2)
plot(DD1 ~ Timestamp, data = out, type = "l", col = "blue")
plot(DD2 ~ Timestamp, data = out, type = "l", col = "red")
layout(1)

Все это было сделано с функциональностью базы R. Другие показали, как пакеты надстроек могут упростить работу с датами.

5
ответ дан 28 November 2019 в 01:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: