Как выбрать период времени в в FSharp.Data?
Я написал этот скрипт для построения исторических финансовых данных:
open FSharp.Data
#load "C:\Users\Nick\Documents\Visual Studio 2013\Projects\TryFsharp\packages\FSharp.Charting.0.90.9\FSharp.Charting.fsx"
open FSharp.Charting
open System
let plotprice nasdaqcode =
let url = "http://ichart.finance.yahoo.com/table.csv?s="+nasdaqcode
let company = CsvFile.Load(url)
let companyPrices = [ for r in company.Rows -> r.GetColumn "Date", r.GetColumn "Close" ]
(companyPrices
|> List.sort
|> Chart.Line).WithTitle(nasdaqcode, InsideArea=false)
plotprice "MSFT"
plotprice "ORCL"
plotprice "GOOG"
plotprice "NTES"
Это хорошо работает.
Вопрос:
Некоторые данные начинаются с 1986 года, некоторые с 2000 года. Я хотел бы представить данные с 2000 по 2015 год. Как выбрать этот период времени?
Можно ли отобразить время, когда мышь наводит курсор на график?
2 ответа
Если вы обращаетесь к данным Yahoo, то лучше использовать CsvProvider
вместо того, чтобы использовать CsvFile
из данных F#. Вы можете найти больше о типе провайдера здесь. К сожалению, наименования в стандартной библиотеке данных F# и на TryFSharp.org отличаются, поэтому это немного сбивает с толку.
Поставщик типа CSV автоматически выведет типы:
open FSharp.Data
open FSharp.Charting
open System
// Generate type based on a sample
type Stocks = CsvProvider<"http://ichart.finance.yahoo.com/table.csv?s=FB">
let plotprice nasdaqcode =
let url = "http://ichart.finance.yahoo.com/table.csv?s=" + nasdaqcode
let company = Stocks.Load(url)
// Now you can access the columns in a statically-typed way
// and the types of the columns are inferred from the sample
let companyPrices = [ for r in company.Rows -> r.Date, r.Close ]
// If you want to do filtering, you can now use the `r.Date` property
let companyPrices =
[ for r in company.Rows do
if r.Date > DateTime(2010, 1, 1) && r.Date < DateTime(2011, 1, 1) then
yield r.Date, r.Close ]
// Charting as before
companyPrices |> (...)
Я не уверен, есть ли в библиотеке F# Charting способ отображения цены на основе расположения указателя мыши - он основан на стандартных элементах управления графиками.NET Windows Forms, поэтому вы можете взглянуть на документацию для соответствующей библиотеки.
1) GetColumn получает строку. Вам необходимо сначала преобразовать его в DateTime и просто сравнить. т.е.
let plotprice nasdaqcode =
let url = "http://ichart.finance.yahoo.com/table.csv?s="+nasdaqcode
let company = CsvFile.Load(url)
let companyPrices = [ for r in company.Rows -> DateTime.Parse(r.GetColumn "Date"), r.GetColumn "Close" ]
(companyPrices
|> List.filter (fun (date, _) -> date > DateTime(2000, 1, 1))
|> List.sort
|> Chart.Line).WithTitle(nasdaqcode, InsideArea=false)
2) Вы можете попробовать добавить метки (но не знаете, как это сделать при наведении курсора...)
let plotprice nasdaqcode =
let url = "http://ichart.finance.yahoo.com/table.csv?s="+nasdaqcode
let company = CsvFile.Load(url)
let companyPrices = [ for r in company.Rows -> DateTime.Parse(r.GetColumn "Date"), r.GetColumn "Close" ]
(companyPrices
|> List.filter (fun (date, _) -> date > DateTime(2000, 1, 1))
|> List.sort
|> fun data -> Chart.Line(data, Labels=(Seq.map (fst >> string) data))).WithTitle(nasdaqcode, InsideArea=false)