2016-04-30 5 views
0

Ich habe eine Spalte in einem Datenrahmen, der aus Ticker-Codes wie AAPL (für Apple-Aktie), TWTR (für Twitter) und viele mehr besteht. Ich versuche, eine neue Spalte zu erstellen, in der die Anzahl der Aktien für jeden Ticker-Code zurückgegeben wird, die aus den API-Bestandsdaten berechnet wurden.API Call pro Zeile von Datenrahmen in R

Aber als ich den Code unten lief, gab die neue Spalte "Stock Quantity" NA für jede Zeile zurück. Hat jemand die Lösung dafür?

library(Quandl) 

portfolio <- data.frame(Code=c("AAPL", "TWTR", "MSFT"), 
       startingPeriod=c("2015-01-01", "2015-01-01", "2015-01-01"), 
       Investment=c("5000", "10000", "15000"), 
       stringsAsFactors=FALSE) 


numberofStock <- function(pf) { 

API <- Quandl(paste0("WIKI/", pf$Code), type = "raw", 
      start_date = pf$startingPeriod, end_date=Sys.Date()) 

pf["StockQuantity"] <- floor(pf$Investment_01/tail(API$Open,1)) 

return(pf) 
} 


numberofStock(portfolio) 

Antwort

0

Hier ist ein Anfang.

library(dplyr) 

company.initial = 
    portfolio %>% 
    mutate(Investment = as.numeric(Investment)) %>% 
    group_by(Code) %>% 
    summarize(start_date = min(startingPeriod), 
      total_investment = sum(Investment)) 

company__date = 
    company.initial %>% 
    group_by(Code) %>% 
    do(with(., 
    Quandl(paste0("WIKI/", Code), 
      type = "raw", 
      start_date = start_date, 
      end_date = Sys.Date()))) 

company = 
    company__date %>% 
    group_by(Code) %>% 
    summarize(last_open = last(Open)) %>% 
    left_join(company.initial) %>% 
    mutate(StockQuantity = total_investment/last_open) 
+0

Vielen Dank Ihr Code funktioniert und es ist viel einfacher und sauberer. – Fxs7576

+0

Übrigens, können Sie erklären, warum wir für diesen Zweck sowohl "Do" - als auch "With" -Funktionen verwenden müssen? – Fxs7576

+0

Wenn der Code innerhalb einer do-Schleife eva ist luated wird mit ausgewertet. als ein Stück des Datenrahmens. Um Spalten im Chunk zu erhalten, können Sie entweder. $ Code, oder Sie können den Code innerhalb der Umgebung auswerten. – bramtayl

0

Sie könnten damit beginnen wollen portfolio$startingPeriod in dem Datentyp Umwandlung Date von as.Date verwenden. Außerdem übergeben Sie zwei Vektoren, portfolio$Code und portfolio$startingPeriod, an die Funktion Quandl(). Sie können versuchen, eine lapply() Funktion zu verwenden, um jeden Wert dieser zwei Funktionen zu wiederholen.

BEARBEITEN: Sie müssen auch portfolio$Investment zu numeric mit as.numeric() konvertieren. Hier ist, wie der Code aussehen sollte:

portfolio <- data.frame(Code=c("AAPL", "TWTR", "MSFT"), 
         startingPeriod=as.Date(c("2015-01-01", "2015-01-01", "2015-01-01")), 
         Investment=as.numeric(c("5000", "10000", "15000")), 
         stringsAsFactors=FALSE) 


numberofStock <- function(pf) {lapply(seq_along(nrow(portfolio)), function(x){ 
    API <- Quandl(paste0("WIKI/", pf$Code[x]), type = "raw", 
        start_date = pf$startingPeriod[x], end_date=Sys.Date()) 

    pf["StockQuantity"] <- floor(pf$Investment[x]/tail(API$Open,1)) 

    return(pf) 
    }) 
} 

numberofStock(portfolio) 
+0

Vielen Dank. Ich habe Sie Code ausgeführt und es hat erfolgreich die NA aus der Ausgabe entfernt. Ich stelle jedoch fest, dass die neue Spalte "Bestandsmenge" den gleichen Wert von 44 zurückgibt. Das Ergebnis sollte 44, 275 und 321 sein. Was könnte das Problem sein? – Fxs7576

+0

@ Fxs7576 Versuchen Sie 'seq_along (nrow (portfolio))' durch 'seq (1: nrow (pf))' 'zu ersetzen, und ersetzen Sie' return (pf) 'durch' return (pf [x,] '. Die erste Änderung wird erlaube Iteration über alle Zeilen (da die ursprüngliche Iteration nur einmal durchlaufen wurde). Die zweite Änderung gibt die spezifische Zeile zurück, auf die die Schleife angewendet wurde. Ich denke, du kannst dann etwas wie 'plyr :: ldply()' verwenden die Zeilen in einem einzigen Datenrahmen – seasmith

+0

Es funktioniert wie ein Charme.Zusätzlich zu Ihrem Code habe ich "y <- do.call (rbind.data.frame, lapply (seq (1: nrow (pf)), Funktion (x) {...})) return (y)}, um alle Zeilen zu einem einzigen Datenrahmen zusammenzufassen Ich schätze Ihre Hilfe sehr .. – Fxs7576

Verwandte Themen