【问题标题】:How to compute daily average for 15 years?如何计算 15 年的日平均值?
【发布时间】:2015-12-29 10:12:45
【问题描述】:

我有15 years from 1993 to 2008 的每日数据。我想计算文件中变量 Open 的每日平均值,基于以感兴趣的日期为中心的 31 天窗口,一年中的每一天。因此,15⨯31 = 465 dates 贡献了一天的统计数据。

输出只是 15 年中的 365 个值

文件可以从这里下载: http://chart.yahoo.com/table.csv?s=sbux&a=2&b=01&c=1993&d=2&e=01&f=2008&g=d&q=q&y=0&z=sbux&x=.csv 并且可以阅读:

 df = read.csv("C:/data/table.csv", header = TRUE, stringsAsFactors = FALSE)

【问题讨论】:

  • 你知道吗,你也可以从网上阅读read.csv('http://chart.yahoo.com/table.csv?s=sbux&a=2&b=01&c=1993&d=2&e=01&f=2008&g=d&q=q&y=0&z=sbux&x=.csv', header = TRUE, stringsAsFactors = FALSE)
  • 数据已经是每日的..您需要移动平均线吗?我建议使用 xts 库取 31 天的移动平均值并将其滞后 16 天。
  • @Roman Luštrik 我不认为这个问题是重复的。 That question 不是指在以天和几年为单位的时间跨度上进行平均的具体问题。
  • @Roman 您标记为重复的问题不处理缺失值。重新打开这个问题的另一个原因。 ̀zoo::rollapply` 确实处理缺失值according to this question
  • 我已经在这里发布了答案:stackoverflow.com/questions/34514683/…

标签: r


【解决方案1】:
library(data.table)

df <- as.data.table(read.csv('http://chart.yahoo.com/table.csv?s=sbux&a=2&b=01&c=1993&d=2&e=01&f=2008&g=d&q=q&y=0&z=sbux&x=.csv',header = TRUE, stringsAsFactors = FALSE))

df[, MAOpen := filter(Open, rep(1, 31) / 31)]
df[, Date := as.POSIXct(Date)]
df[, YDay := yday(Date)]

df[, mean(MAOpen), by = YDay]

【讨论】:

  • 这是每个日历日的平均值,问题是根据相应日期的 31 天窗口求平均值。
  • 对于日期 2008-02-07,您从 2008-01-16 到 2008-02-29 - 18.76548 平均需要 31 天。你需要所有第 38 年的日子(所有 2 月 7 日)。对于 2007-02-07,您得到移动平均线 33.78355,依此类推。 30.06504 是所有十二个移动平均线的平均值。
  • 好吧,我明白了。我的答案需要 31 次观察而不是几天。
  • 您可以通过与包含所有天数的日历数据框合并来添加缺失天数的 NA 值:calendar &lt;- data.frame(date = ymd("1993-03-01")+ddays(1:(15*365+3)))。使用merge()dplyr::left-join() 按日期与原始数据框合并。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多