Я написал функцию, которая загружает данные из службы и сохраняет их в кадре данных Deedle:
/// Downloads data from EOD Historical Data for one stock.
let downloadFromEOD (storageDataPath: string) (symbol: string) : unit =
// Token for the EOD service
let apiToken = "9999999999999"
let endStr = "?api_token=" + apiToken + "&period=d&order=d"
printfn "Downloading symbol %s" symbol
let url = @"http://eodhistoricaldata.com/api/eod/" + symbol + endStr
// The data is saved in a temporary file
let lines : HttpResponseWithStream = Http.RequestStream(url)
let tempPath : string = storageDataPath + @"temp\" + symbol + ".csv"
let fileStream : FileStream = File.Create(tempPath)
lines.ResponseStream.CopyTo(fileStream)
fileStream.Close()
let df : Frame<DateTime,string> =
File.ReadLines(tempPath)
|> List.ofSeq
|> List.tail
|> List.filter (fun str -> str.Contains ",")
|> List.map eODRowFoo // not relevant for this SO question
|> Frame.ofRows
let path = storageDataPath + symbol + ".csv"
FrameExtensions.SaveCsv(df, path, includeRowKeys=true, keyNames=["Date"])
Функция вызывает Http.RequestStream
для вычисления lines
, копирует lines
в путь изатем читает файл и преобразует данные в Deedle DataFrame
.
. Интересно, есть ли способ избежать записи данных в файл и последующего чтения.Можно ли создать какой-то объект, начиная с HttpResponseWithStream
, который можно каким-то образом преобразовать в DataFrame
менее надуманным способом?