滚动平均值,标准偏差(单位:dbplyr)

滚动平均值,标准偏差(单位:dbplyr),r,mean,rolling-computation,dbplyr,R,Mean,Rolling Computation,Dbplyr,我想用dbplyr中的滚动函数(滚动平均值、stdev…等)设置一个新变量 这是一个数据库 library(odbc) library(DBI) library(tidyverse) library(zoo) con <- DBI::dbConnect(odbc::odbc(), Driver = "SQL Server", Server = "xx.xxx

我想用dbplyr中的滚动函数(滚动平均值、stdev…等)设置一个新变量

这是一个数据库

library(odbc)
library(DBI)
library(tidyverse)
library(zoo)

con <- DBI::dbConnect(odbc::odbc(),
                      Driver    = "SQL Server", 
                      Server    = "xx.xxx.xxx.xxx",
                      Database  = "stock",
                      UID       = "userid",
                      PWD       = "userpassword")

startday = 20150101
day = tbl(con, in_schema("dbo", "LogDay")) 
库(odbc)
图书馆(DBI)
图书馆(tidyverse)
图书馆(动物园)
con%
突变(ma5=rollmean(价格接近,k=5,填充=NA))
错误:nanodbc/nanodbc.cpp:1655:42000:[Microsoft][ODBC SQL Server驱动程序][SQL Server]키워드 '正如근처의 구문이  [Microsoft][ODBC SQL Server驱动程序][SQL Server]문을 준비할 수 
选择前11名“logNo”、“stockCode”、“logDate”、“priceOpen”、“priceHigh”、“priceLow”、“priceClose”、“adjRate”、“volume”、“amount”、“numListed”、“remark”、“marketCap”、“foreignRate”、“personetbuy”、“foreignNetbuy”、“instNetbuy”、“financeNetbuy”、“insuranceNetbuy”、“toosinetbuy”、“bankNetbuy”、“gitaFinanceNetbuy”、“pennetbuy”、“养老金购买”、“gitainstnstnetbuy”,“gitafoundebuy”、“samoNetbuy”、“nationNetbuy”、rollmean(“价格关闭”,5.0为“k”,NULL为“fill”)为“ma5”
从“dbo”,“LogDay”
其中(“日志日期”>20150101.0)
按“股票代码”订购
警告:
已忽略SQL rollmean的命名参数

发生错误的原因是
rollmean
没有定义dbplyr转换,也不是可以不转换而使用的SQL命令。这并不奇怪,因为
rollmean
是data.table库的一部分,dbplyr专注于翻译dplyr和base R命令

你所追求的部分是一个窗口函数。dplyr和SQL都有一系列的功能,但它们之间的转换并不总是有效的。但是有一些方法可以使用定义了翻译的命令来实现这一点

可考虑的两种方法:

(1)结合滞后和超前

df%>%
变异(prev2_价格=滞后(priceClose,2,order_by=日期),
prev1_价格=滞后(价格关闭,1,订单日期=日期),
next1\u价格=潜在客户(价格结束,1,订单截止日期=日期),
next2\u价格=潜在客户(价格结束,2,订单日期))%>%
变异(ma5=(上一个价格+上一个价格+priceClose+下一个价格+下一个价格)/5)
这种方法不能很好地扩展,但它简单明了,易于推理。如果您想在组内工作(例如,每个股票的单独移动平均数),请在使用
lag
lead
之前应用
groupby

(2)加入并过滤掉不需要的记录

df2=df%>%
选择(股票代码、日期、价格结束)
df%>%
内部联接(df2,by=“stockCode”,后缀=c(“,“_2”)%>%
过滤器(abs(日期-日期2)%#两侧的两条记录=宽度为5的窗口
分组依据(股票代码、日期、价格结束)%>%
总结(ma5=平均值(价格接近2)

这种方法更通用,但可能更难推理。

再次感谢您,Simon。我感谢您的帮助。由于dbplyr中不支持滚动函数,我将表转换为data.table,应用了滚动函数,它就工作了
day = tbl(con, in_schema("dbo", "LogDay")) %>% filter(logDate > startday) %>% lazy_dt()

dayt = day %>% 
   group_by(stockCode) %>% 
   arrange(logDate) %>% 
   mutate(rise = (priceClose/lag(priceClose,1)-1)*100,
          candle = ifelse(priceClose > priceOpen, 1, 0),
          middle = ifelse(priceClose > (priceHigh + priceLow)/2, 1, 0),
          ma5 = rollmean(priceClose, k = 5, fill = NA, align = 'right'), 
          ovnprofit = lead(priceOpen,1)/priceClose,
          disparity = priceClose/ma5*100)
day = tbl(con, in_schema("dbo", "LogDay")) %>% filter(logDate > startday) %>% lazy_dt()

dayt = day %>% 
   group_by(stockCode) %>% 
   arrange(logDate) %>% 
   mutate(rise = (priceClose/lag(priceClose,1)-1)*100,
          candle = ifelse(priceClose > priceOpen, 1, 0),
          middle = ifelse(priceClose > (priceHigh + priceLow)/2, 1, 0),
          ma5 = rollmean(priceClose, k = 5, fill = NA, align = 'right'), 
          ovnprofit = lead(priceOpen,1)/priceClose,
          disparity = priceClose/ma5*100)