Устранение проблем веб-циклов с расчетом и привязкой к таблице сборки R - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь создать таблицу очищенных веб-данных, используя символы числового тикера с помощью запроса, который извлекает данные о цене и скидках за 1 год с веб-сайта хоста для определенного фонда.

У меня правильные страницы запросов, но цикл, который я пытаюсь выполнить, поочередно захватывает ценовую историю каждой компании, а затем выполняет несколько довольно простых вычислений с ней, прежде чем проиндексировать результат для соответствующего тикера, а затем связать каждый из них. результаты последовательного фонда вместе в большую таблицу меня вешают.

Вот мой пример сценария, если кто-то может определить проблему и предложить решение:

library(jsonlite)
library(rvest)
library(dplyr)
library(stringr)
library(PerformanceAnalytics)
library(lubridate)

tickers2 <- c("PMX", "MFM", "CEF", "JLS","CXE","BHV")
tickers2 <- paste0("https://www.cefconnect.com/api/v3/pricinghistory/",tickers2,"/1Y")

lst_scraped_data <- lapply(tickers2, FUN=function(URLLink){
        url <-URLLink 
        page<-html_session(url)
        json3<-readBin(page$response$content, what="json")
        df15 <-fromJSON(json3)
        df15 <- data.frame(df15)

        #  Attempt to Manually Calculate the first tables 52 Week Values
        test4 <- xts(df15[2:4],mdy(df15$Data.PriceHistory.DataDateDisplay))
        colnames(test4) <- c("NAV Price","Discount %","Share Price")
        obs <- dim(test4)[1]

        cur <- tail(test4,n=1)

        WeekMean <- tail(apply(test4, 2, function(x){apply.rolling(x, FUN="mean", width=dim(test4)[1])}),n=1)
        WeekMean <- data.frame(round(WeekMean,digits=2))

        WeekMin <- tail(apply(test4, 2, function(x){apply.rolling(x, FUN="min", width=dim(test4)[1])}),n=1)
        WeekMin <- data.frame(round(WeekMin,digits=2))

        WeekMax <- tail(apply(test4, 2, function(x){apply.rolling(x, FUN="max", width=dim(test4)[1])}),n=1)
        WeekMax <- data.frame(round(WeekMax,digits=2))

        complete <- data.frame(rbind(cur,WeekMean,WeekMax,WeekMin))
        row.names(complete) <- c("Current","Year Avg","Year High","Year Low")

        complete2 <- data.frame(cbind(complete[,3],complete[,1],complete[,2]))
        colnames(complete2) <- c('Share_Price',"NAV","Premium/Discount_%")
        rownames(complete2)[1] <- "Current"

        Ticker <- str_replace_all(URLLink,pattern="https://www.cefconnect.com/api/v3/pricinghistory/",replacement = "")
        Ticker <- str_replace_all(URLLink,pattern="/1Y",replacement = "")
        Checker = data.frame(df15,Ticker)    
})


df13 <- do.call(rbind, lst_scraped_data) 

В идеале конечный результат должен выглядеть примерно так для каждого тикера:

         Share_Price   NAV Premium/Discount_%  Ticker
Current        11.52 10.45              10.24  PMX
WeekMean       11.32 10.66               6.19  PMX
WeekMax        11.78 10.95              11.33  PMX
WeekMin        10.81 10.35               0.65  PMX

Заполненная таблица будет состоять из привязки выходных данных выше для каждого тикера в цикле. Спасибо !!!

1 Ответ

0 голосов
/ 17 января 2019

До сих пор неясно, в чем конкретно проблема, однако, возможно, это поможет.

Данные содержат даты, правильно отформатированные, с помощью format можно указать номер недели для данной даты.

df15 <-fromJSON(json3)
df <- df15$Data$PriceHistory                # (json3 as in your function)
df$week <- as.integer(format(as.Date(df$DataDate), '%V'))

С этого момента становится проще получать еженедельные данные.

# For Example NAV and Discount weekly means, maxs, mins
means <- aggregate(df[, c("NAVData", "DiscountData")], list(df$week), mean)
maxs  <- aggregate(df[, c("NAVData", "DiscountData")], list(df$week), max)
mins  <- aggregate(df[, c("NAVData", "DiscountData")], list(df$week), min)
setNames(merge(merge(means, mins, by = 'Group.1'), maxs, by = 'Group.1'), 
         c('week','NAVMean','DiscountMean','NAVMins','DiscountMins','NAVMaxs','DiscountMaxs'))
#    week NAVMean DiscountMean NAVMins DiscountMins NAVMaxs DiscountMaxs
# 1     1 10.5350       8.2575   10.49         6.20   10.57         9.89
# 2     2 10.5080       9.8980   10.46         8.71   10.56        11.33
# 3     3 10.6540       7.4200   10.45         4.75   10.95        10.24
# ...
# 50   50 10.5300       8.3500   10.49         5.34   10.59         9.92
# 51   51 10.4340       5.5520   10.38         4.39   10.48         6.56
# 52   52 10.4825       6.7975   10.48         6.20   10.49         7.82
...