|
为了确定能源使用的季节性影响,我需要将计费数据库中的能源使用信息与月温相匹配。- j. S/ o. V- O" {7 l$ R* F
我正在使用一个计费数据集,该数据集具有不同长度的账单以及开始日期和结束日期,我想获取每个月内每个帐户的月平均值。例如,我有一个具有以下特征的计费数据库:! N9 k5 O$ ]6 H& X& Z8 I
acct amount begin end days1 2242 11349 2009-10-06 2009-11-04 22242 12252 2009-11-04 2009-12- 303 242 21774 2009-12-04 2010-01-08 354 242 18293 201000-01-08 2010-02- 2243 27217 2009-10-06 2009-11-04 296 243 117 2009-11-04 2009-12-04 307 243 14543 2009-12-04 2010-01-08 35我想弄清楚如何强制这些不规则的时间序列(对于每个账户)在每个账单中获得每个月的日平均金额,例如:
9 R/ E4 y$ d% p. D2 n acct amount begin end days avgamtpday1 2242 11349 2009-10-01 2009-10-31 31 31 X2 2242 12252 2009-11-01 2009-11-30 30 30 X3 2242 21774 2009-12-01 2010-12-31 31 31 X4 2242 18293 2010-01-01 2010-01-31 31 31 X4 2242 18293 2010-02-01 2010-02- X5 2243 27217 2009-10-01 2009-10-31 31 31 X 2243 117 2009-11-01 2009-11-30 30 30 X7 2243 14543 2009-12-01 2009-12-31 30 30 X7 2243 14543 2010-01-01 2010-01-31 31 31 X我不知道哪个工具可以执行,因为我只需要执行一次。
$ P# n, T( c: r" K& ^8 Y% h7 ?8 ~# w这款手表还有一个额外的折痕,就是大概有1.5万行左右。按照大部分标准,不是很大,但是足够了R循环解决方案变得困难。我已经用过了R中的zoo,xts和tempdisagg软件包进行了调查。我开始编写一个非常丑陋的循环,将每个账单分开,然后每月在现有账单中创建一行,然后使用它tapply()通过accts总结几个月,但说实话,我看不到如何有效地做到这一点。3 w9 c, U0 O, u D- O* J
在MySQL中,我试过:5 b9 g. w# V5 ^
创建或替换视图v3,作为select 1 n union all select 1 union all select 1;
. b1 Z/ y' P! y 创建或替换视图v,作为v3a,v3b所有联合选择1的选择1n;
2 C# K% k; Q0 N. a4 B J 设置@n = 0;
* t/ {0 B2 j' ~% s7 s$ g 如有日历,删除表;创建日历表(dt日期主键); 从va,vb,vc,vd,ve,v中将dt
s. k- q; x. D2 d 插入
4 v- p$ N: u2 _; {) B S/ tdt并插入日历,选择cast(‘2008-1-1’ 间隔@n:= @ n 1天作为日期);9 j; [1 {/ ?2 m! ?# V
选择acct,金额,开始,结束,billAmtPerDay,sum(billAmtPerDay),MonthAmt,count(
! K+ Y) U' F1 h5 I3 x)天,sum(billAmtPerDay)/ count(
* n1 w1 U9 ^+ V8 \4 Y)AverageAmtPerDay,year(dt),month(dt)FROM(选择*,金额/天来自帐单b日历连接日历c上的billAmtPerDay,位于开始和结束之间,以及开始和结束
3 Z' o" E: s$ p0 ~dt)x按acct,金额,开始,结束,billAmtPerDay,year(dt),month(dt)分组;
; R* r2 E/ a! K' a9 {但由于我不明白,我的服务器不喜欢手表,即使在不同的计算中也会挂在内部连接上。我正在调查是否有任何临时内存限制。
- ], b' N7 I( Z! k) H+ u/ d4 C; R- [谢谢!
/ B2 Q0 O( k* W1 A t: |9 S9 h ; H. W3 D+ r' j( D2 e U5 W
解决方案:
9 l5 Z% l6 ]8 }5 r: f9 \4 f# s* u& D 它开始使用data.table:4 j! W. F. F7 f0 e
billdata 首先,变形列begin和end至日期。与data.frame不同的是,整个数据集不会被复制。, G4 H2 \6 U- {! y+ U5 I& M
DT[,begin:=as.Date(begin)]DT[,end:=as.Date(end)]然后找到时间跨度,找到每天的主要账单,并进行总结。
! q8 o6 j& u" O }- z2 s4 e/ Halldays = DT[,seq(min(begin),max(end),by="day")]setkey(DT,acct,begin)DT[CJ(unique(acct),alldays), mean(amount/days,na.rm=TRUE), by=list(acct,month=format(begin,"%Y-%m")),roll=TRUE] acct month V1 1: 2242 2009-10 391.34483 2: 2242 2009-11 406.69448 3: 2242 2009-12 601.43226 4: 2242 2010-01 646.27465 5: 2242 2010-02 653.32143 6: 2243 2009-10 938.51724 7: 2243 2009-11 97.36172 8: 2243 2009-12 375.68065 9: 2243 2010-01 415.5142910: 2243 2010-02 415.51429我想你会发现流行的连接逻辑在于SQL很麻烦,速度慢。
! R4 O i. E9 P7 s' j! o我说这是一个提示,因为它不正确。注意重复行10,因为账户2243不会像账户2242那样延伸到2010-02。要结束该rbind好的,你可以在每个账户的最后一行使用rolltolast代替roll。或alldays创建帐户而不是跨所有帐户。
1 g- m; k% h! a5 E$ j看看上面的速度是否可以接受,我们可以从那里开始。
T3 R& ?- i& |你可能会遇到1.8.2中的错误已经在1中了.8.3.修理。我在用。v1.8.3。7 u' ~! A* f7 r; @0 ~9 O
内部错误消息已修复,合并包括丢失的组和组基础的连接,编号#2162。例如:X [Y,.N,by =5 [7 ?7 e) [0 y( B7 Y
NonJoinColumn]其中Y包含一些与X不匹配的线。这个错误也可能导致段落错误。
& V* z `: w3 q让我知道,我们可以从R-Forge升级到1.8.3。; ]) X" g; V! G+ x) N) z, ]) ?1 q
对了,很好的例子数据。这样可以更快的回答。. f% W, ?7 O9 {) s3 J3 B- b
这是上面提到的完整答案。我不得不承认这有点棘手,因为它结合了多个功能data.table。它应该在1.8.2中正常工作,但我只在1中.8.三中测试。/ l* X# D+ ]& w7 n8 g- g* K
DT[ setkey(DT[,seq(begin[1],last(end),by="day"),by=acct]), mean(amount/days,na.rm=TRUE), by=list(acct,month=format(begin,"%Y-%m")),roll=TRUE] acct month V11: 2242 2009-10 391.344832: 2242 2009-11 406.694483: 2242 2009-12 601.432264: 2242 2010-01 646.274655: 2242 2010-02 653.321436: 2243 2009-10 938.517247: 2243 2009-11 97.361728: 2243 2009-12 375.680659: 2243 2010-01 415.51429 |
|