滚动平均值,标准偏差(单位:dbplyr)
我想用dbplyr中的滚动函数(滚动平均值、stdev…等)设置一个新变量 这是一个数据库滚动平均值,标准偏差(单位: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
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)