 1 people like it.

# Processing Prices & Charting (Demo)

Sample code using a simple library for downloading Yahoo stock prices. The demo shows how to process sequences and so on (to run this, load & run previous snippet).

 ``` 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: ``` ``````// -------------------------------------------------------- // Downlaod Facebook stock prices & draw line chart let fb = Yahoo.GetPrices("FB") Plot.Line(fb) Plot.Clear() // TASK #1: Download 'AAPL' data and draw the chart // (...) // -------------------------------------------------------- // Do some calculations with Facebook stock prices let count = Seq.length fb let sum = Seq.sum fb let avg = sum / float count // Declare a function that calculates the average let average data = let count = Seq.length data let sum = Seq.sum data sum / float count average fb // Simple function with multiple arguments and type annotations let triangle (a:float) (b:float) = sqrt ((pown a 2) + (pown b 2)) triangle 3.0 4.0 // Using F# sequence expressions to work with data let diffs = [ for v in fb -> v - avg ] // -------------------------------------------------------- // TASK #2a: Calculate the standard deviation of FB prices // TASK #2b: Write a function 'sdv' that takes a parameter // (...) // -------------------------------------------------------- // More advanced sequence expressions let avg = Seq.average aapl // More explicit way of writin the previous // (a lot more powerful - we can filter, etc.) let diffs = [ for v in aapl do yield v - avg ] // Count number of days when price is above average let more = [ for v in aapl do if v > avg then yield v ] Seq.length more // TASK #3: Compare the days when price is above/below avg // -------------------------------------------------------- // More functions for processing sequences // Sort & reverse the sequence let sorted = Seq.rev (Seq.sort fb) Plot.Line(sorted, name="Sorted") Plot.Line(fb, name="Normal") Plot.Clear() // Take first and last elements Seq.nth 0 fb Seq.nth ((Seq.length fb) - 1) fb // TASK #4a: Calculate the median of the Facebook prices // TASK #4b: Write a function & use it on Apple data too! // (...) // Get values as sequence of pairs (previous and next day price) let pairs = Seq.pairwise fb [ for (prev, next) in pairs do yield (prev + next) / 2.0 ] // TASK #5: Calculate how many times did the price // go up/down between the two consequent days // -------------------------------------------------------- // Using functions that take other functions as parameter let avg = Seq.average fb let diff value = value - avg // Apply 'diff' to all values of the 'fb' sequence Seq.map diff fb // Same thing, more elegantly, using lambda function Seq.map (fun value -> value - avg) fb // Count values greater than the average Seq.length (Seq.filter (fun value -> value > avg) fb) // Nicer way using the pipelining operator fb |> Seq.filter (fun value -> value > avg) |> Seq.length // TASK #6: Rewrite the calculation of SDV (or other // previous examples) using Seq.filter/map and lambdas // (...) // -------------------------------------------------------- // Download MSFT and YHOO prices & draw them in a single chart let yhoo = Yahoo.GetPrices("YHOO", from = DateTime(2012, 1, 1)) let msft = Yahoo.GetPrices("MSFT", from = DateTime(2012, 1, 1)) Plot.Line(yhoo, name="Yhoo", range=(10.0, 35.0)) Plot.Line(msft, name="Msft", range=(10.0, 35.0)) Plot.Clear() // TASK #7 (BONUS): The Seq.windowed function generalizes // Seq.pairwise and returns windows of any given size // (As sequences - so you get sequence of sequences!) // TASK #7a: Use the function to calculate floating average // over 10 days and plot that together with the origianl values // TASK #7b: Use the function & your previous 'sdv' to // show the price with two more lines showing value +/- sdv ``````
val fb : seq<float>

Full name: Script.fb
val count : int

Full name: Script.count
module Seq

from Microsoft.FSharp.Collections
val length : source:seq<'T> -> int

Full name: Microsoft.FSharp.Collections.Seq.length
val sum : float

Full name: Script.sum
val sum : source:seq<'T> -> 'T (requires member ( + ) and member get_Zero)

Full name: Microsoft.FSharp.Collections.Seq.sum
val avg : float

Full name: Script.avg
Multiple items
val float : value:'T -> float (requires member op_Explicit)

Full name: Microsoft.FSharp.Core.Operators.float

--------------------
type float = System.Double

Full name: Microsoft.FSharp.Core.float

--------------------
type float<'Measure> = float

Full name: Microsoft.FSharp.Core.float<_>
val average : data:seq<float> -> float

Full name: Script.average
val data : seq<float>
val count : int
val sum : float
val triangle : a:float -> b:float -> float

Full name: Script.triangle
val a : float
val b : float
val sqrt : value:'T -> 'U (requires member Sqrt)

Full name: Microsoft.FSharp.Core.Operators.sqrt
val pown : x:'T -> n:int -> 'T (requires member get_One and member ( * ) and member ( / ))

Full name: Microsoft.FSharp.Core.Operators.pown
val diffs : float list

Full name: Script.diffs
val v : float
val avg : int

Full name: Script.avg
val average : source:seq<'T> -> 'T (requires member ( + ) and member DivideByInt and member get_Zero)

Full name: Microsoft.FSharp.Collections.Seq.average
val diffs : int list

Full name: Script.diffs
val v : int
val more : int list

Full name: Script.more
val sorted : obj

Full name: Script.sorted
val sort : source:seq<'T> -> seq<'T> (requires comparison)

Full name: Microsoft.FSharp.Collections.Seq.sort
val nth : index:int -> source:seq<'T> -> 'T

Full name: Microsoft.FSharp.Collections.Seq.nth
val pairs : seq<float * float>

Full name: Script.pairs
val pairwise : source:seq<'T> -> seq<'T * 'T>

Full name: Microsoft.FSharp.Collections.Seq.pairwise
val prev : float
val next : float
val diff : value:float -> float

Full name: Script.diff
val value : float
val map : mapping:('T -> 'U) -> source:seq<'T> -> seq<'U>

Full name: Microsoft.FSharp.Collections.Seq.map
val filter : predicate:('T -> bool) -> source:seq<'T> -> seq<'T>

Full name: Microsoft.FSharp.Collections.Seq.filter
val yhoo : obj

Full name: Script.yhoo
val msft : obj

Full name: Script.msft