- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
电能表不会在月初和月底开始和结束,而是与日历重叠不均匀,这是很常见的。我正在尝试使用加权平均逻辑来排列这些读取日期并计算单个月份的值。我附上了我的代码示例,该示例构建了一个与我正在使用的数据集类似的数据集。每行是一个单独的电能表。每 3 列代表一个开始日期和结束日期,以及该时间段使用的能源值(value)。
我一直在处理数十万行,这个过程需要二十多分钟。我很想能够使用 data.table
但我对它太陌生,我不确定如何获得 seq.Date
在给定数据的列结构的情况下工作。
# Making the Fake Dataset
set.seed(123)
fake_rows = 10
{
testdata <- replicate(fake_rows, {
start_it <- as.Date('2019/01/01') + sample(-20:20, 1, T)
track <- start <- end <- value <- c()
for(i in 1:12){
a <- seq.Date(start_it, length.out = sample(28:34,1), by="day")
start[i] <- a[1]
end[i] <- start_it <- a[length(a)]
value[i] <- sample(1:200,1)
track <- c(track, start[i], end[i], value[i])
}
return(track)
})
testdata <- as.data.frame(t(testdata))
month_labels <- c(paste0("0",1:9), "10","11","12")
start_dates <- sapply(month_labels, function(x) paste0("Start_Date_",x))
end_dates <- sapply(month_labels, function(x) paste0("End_Date_",x))
values <- sapply(month_labels, function(x) paste0("Value_",x))
colnames(testdata) <- c(rbind(start_dates,end_dates,values))
# replace columns with the dates
for(i in c(start_dates, end_dates)){
testdata[,i] <- as.Date(testdata[,i], origin = "1970-01-01")
}
testdata[2, 7:36] <- NA # some are missing dates and values
}
testdata
# Start_Date_01 End_Date_01 Value_01 Start_Date_02 End_Date_02 Value_02
#1 2019-01-11 2019-02-13 179 2019-02-13 2019-03-17 195
#2 2018-12-20 2019-01-21 164 2019-01-21 2019-02-22 81
#3 2019-01-05 2019-02-02 69 2019-02-02 2019-03-04 63
#4 2018-12-28 2019-01-29 50 2019-01-29 2019-02-25 34
#5 2019-01-15 2019-02-16 199 2019-02-16 2019-03-17 151
#6 2019-01-15 2019-02-16 94 2019-02-16 2019-03-21 24
#7 2019-01-05 2019-02-07 54 2019-02-07 2019-03-07 137
#8 2019-01-16 2019-02-15 108 2019-02-15 2019-03-19 177
#9 2018-12-25 2019-01-25 16 2019-01-25 2019-02-27 125
#10 2019-01-09 2019-02-07 10 2019-02-07 2019-03-10 54
library(data.table)
# for each row, determine what monthly values would be
output <- matrix(NA, nrow = nrow(testdata), ncol = 12)
month_cols <- as.character(1:12)
for(i in 1:nrow(testdata)){
x <- y <- vector("list", 12)
for(j in 1:12){
if(!is.na(testdata[i, start_dates[j]])){
# get the counts of days in each month within the meter read period
x[[j]] <- table(month(seq.Date(testdata[i, start_dates[j]], testdata[i, end_dates[j]], "day")))
# multiply the meter read value by days in each month (the numerator of a day wtd avg)
y[[j]] <- testdata[i, values[j]] * x[[j]]
}
months <- names(unlist(y))
# day weighted average = Σ(value x Days) / Σ(Days)
final <- tapply(unlist(y), months, sum) / tapply(unlist(x), months, sum)
output[i,] <- final[match(month_cols, names(final))] # ordered in the case of missing months
}
}
output
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
# [1,] 140.77778 187.82759 127.03125 46.16129 28.50000 81.25806 125.8750 91.00000 91.516129 120.1250 108.80645 32.87500
# [2,] 135.46875 81.00000 NA NA NA NA NA NA NA NA NA 164.00000
# [3,] 80.61290 63.41379 92.75000 91.77419 39.96970 45.74194 87.6875 20.87500 100.838710 196.4375 86.00000 154.43750
# [4,] 48.50000 31.10345 30.81250 130.35484 128.43750 48.70968 117.8125 27.81250 55.322581 137.0312 123.38710 145.65714
# [5,] 142.03571 177.48276 137.40625 106.48387 102.53125 116.00000 86.0000 102.25000 112.032258 153.4375 183.29032 96.50000
# [6,] 88.34286 62.62069 52.53125 126.87097 132.62500 128.19355 157.9688 103.43750 9.612903 30.6250 93.67742 131.09375
# [7,] 62.91429 116.96552 67.46875 72.83871 102.25000 171.32258 178.5000 112.50000 38.645161 131.0000 127.22581 96.43750
# [8,] 86.08696 141.31034 129.06250 35.77419 97.00000 122.93548 146.3125 128.18750 151.161290 199.1250 172.90323 74.75000
# [9,] 39.84375 119.13793 70.00000 180.64516 85.12500 49.64516 116.5000 92.28125 117.225806 46.1250 27.35484 29.16129
#[10,] 37.77143 43.37931 90.43750 51.45161 25.71875 120.22581 111.6562 126.81250 123.193548 46.0625 84.74194 97.53125
最佳答案
这里即 data.table
+ lubridate
方法。
我的输出与您想要的输出不同。但我不确定哪个是正确的 ;-)
library( data.table )
library(lubridate)
#make data.table
setDT( testdata )
#insert row_id
testdata[, row_id := .I ]
#melt
dt <- melt( testdata,
id.vars = "row_id",
measure.vars = patterns(
Start_Date = "^Start",
End_Date = "^End",
Value = "^Value" ) )
#drop the meaningless variable
dt[, variable := NULL ]
#Calculate daily value
dt[, value_day := Value / as.numeric( difftime( End_Date, Start_Date, units = "days") ) ]
#create a table per day over the entire period
dt.days <- data.table( date = seq( min( dt$Start_Date, na.rm = TRUE ),
max( dt$End_Date, na.rm = TRUE ),
by = "1 days" ) )
#left join
answer <- dt[ dt.days, on = .(Start_Date <= date, End_Date >= date ), mult = "all", allow.cartesian = TRUE ]
#and summarise by monthly period
dcast(
answer[,
.(month.total = sum( value_day ) ),
by = .(row_id, month = sprintf( "%02d", lubridate::month( Start_Date ) ) ) ],
row_id ~ month )
# row_id 01 02 03 04 05 06 07 08 09 10 11 12
# 1: 1 115.40909 168.01515 130.37946 47.84375 28.72581 78.94456 131.56250 98.65323 98.550777 142.37037 114.04421 34.49194
# 2: 2 135.46875 55.68750 NA NA NA NA NA NA NA NA NA 61.50000
# 3: 3 85.80844 61.62857 96.01290 103.51613 48.06810 45.21408 85.07879 22.26667 103.366667 196.43750 80.62500 149.92045
# 4: 4 49.09028 33.21481 32.18387 131.71635 141.57241 53.88889 138.18287 27.51420 52.765152 136.45833 116.20833 159.31250
# 5: 5 124.28125 167.18966 145.70474 102.10985 102.34897 117.64627 96.46305 113.35714 120.302381 167.90000 202.06667 107.49537
# 6: 6 99.73750 56.45455 58.86532 131.43098 135.22944 131.92857 156.06061 100.60065 9.714286 31.29032 97.69077 143.41494
# 7: 7 69.83699 119.09740 70.61364 71.99413 108.17419 163.96667 195.71717 120.27778 38.170833 131.30000 127.80000 105.21839
# 8: 8 66.60000 131.43750 132.48661 39.21429 114.31111 131.80208 149.83266 135.40601 149.424569 219.95833 186.07407 81.61905
# 9: 9 39.41838 105.23569 81.37566 200.00000 96.94355 47.00587 115.61039 101.48333 119.333333 44.72727 26.52456 30.92325
# 10: 10 42.05603 40.73637 93.35484 52.61958 27.69195 113.56970 108.27273 131.72121 134.688889 52.06452 82.30242 97.53125
关于r - 如何计算更快的月加权平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58895573/
好吧,我知道这个问题已经被问了无数次了。但是,对于我在谷歌搜索中似乎无法找到的问题,我还有一个小补充。 我当然不是 FFMPEG 的专家……我一直在使用 FFMPEG 的标准加速/减速模板,我正在使用
考虑这三个文档... [ { _id: "...", _rev: "...", title: "Foo", body: "...
我想知道访问我的全局变量的最快方法...它们只会在 Beta 测试阶段发生变化。在我们上线之前。从那时起,它们将永远不会改变。 我认为从 web.config 中获取内容会产生开销,而且编写 App.
这个问题在这里已经有了答案: 11 年前关闭。 Possible Duplicate: Is there a performance difference between BETWEEN and IN
我很想知道对通常作为查询目标的数字列进行分区是否有性能优势。目前我有一个包含约 5000 万条记录的物化 View 。当使用常规 b 树索引并按此数字列搜索时,我得到的成本为 7,查询结果大约需要 0
我需要编写一个库,它执行许多远程 HTTP 调用来获取内容。我可以按照描述做here ,但是有没有更好的方法(在性能方面)如何做到这一点?如果我按照示例中所述进行操作,我总是会创建一个 URL 对象,
该代码非常不言自明。只是有很多我需要独立随机化的范围。例如,范围('W1:W4')不应与范围('W5:W8')混淆,因此我不能只是随机化范围('W1:W80')。任何帮助或建议都会很棒!多谢。目前,代
我正在使用 ADT 模拟器。我在我的模拟器中使用默认的 Android 虚拟设备。我创建了一个版本 4.0.3。 问题 太慢了。有时我在尝试更改 fragment 时会收到加载点击。 我使用的代码是有
我正在尝试获取一个包含三个表中的信息的数组。结果应该是一个数组,我可以在其中循环遍历第一个表、第二个表中的相关行以及第三个表到第二个表中的相关行。目前,我有三个独立的 SQL 查询,然后将它们重组为一
我已经学会了两种在服务器上上传图像的方法(可能还有更多..)。 1) 创建 NSData 并将其添加到请求正文中 2)创建字节数组并像简单数组一样以json形式发送 1) 创建 NSData 并将其添
我有一个 UItextview,我可以在里面写入数据类,我可以在我的 View 中的任何地方提供数据,在 ViewDidAppear 函数中我传递了我的数据,但它有点慢。文本在 0.2-0.3 秒后出
如何为 discoverAllContactUserInfosWithCompletionHandler 创建优先级高于默认值的 CKOperation? 我找不到不使用 [[CKContainer
我在 unix 模块下编写了一个内核级函数,用于对系统负载进行采样。我在 clock.c 下的 clock() 中调用示例函数,以在每个时钟(例如,我的系统上每 10 毫秒)拍摄系统负载的快照。有没有
我正在制作一个应用程序,该应用程序将根据变量的值使用鼠标/键盘(宏)模拟操作。 这里有我制作的 de 扫描代码: void ReadMemory(int value){ DWORD p
我想知道在计算上调用嵌套在对象中的函数的最快方法是什么,所以我做了一个快速的 jsPerf.com 基准测试,其中我考虑了三种可能性——从数组中调用函数,从“核心”中调用函数对象和函数对象: var
我用 php 做了一个图像缩放器。调整图像大小时,它会缓存一个具有新尺寸的新 jpg 文件。下次您调用确切的 img.php?file=hello.jpg&size=400 时,它会检查是否已经创建了
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Which is best for data store Struct/Classes? 考虑我有一个 Em
我正在尝试为多组列自动计算每行的平均分数。例如。一组列可以代表不同比例的项目。这些列也被系统地命名 (scale_itemnumber)。 例如,下面的虚拟数据框包含来自三个不同比例的项目。(可能会出
所以我知道散列图使用桶和散列码等等。根据我的经验,Java 哈希码并不小,但通常很大,所以我假设它没有在内部建立索引。除非哈希码质量很差导致桶长度和桶数量大致相等,否则 HashMap 比名称-> 值
假设我有一个非常缓慢和大的 for 循环。 如何将其拆分为多个线程以使其运行速度更快? for (int a = 0; a { slowMet
我是一名优秀的程序员,十分优秀!