public DataPoint GetDataPoint(DateTime point) { if (point <= Maximum && point >= Minimum) { //If theres already a matching value for the time in Series use that Tuple <DateTime, IData> dp = Series.FirstOrDefault(e => e.Item1 == point); if (dp == null) { //Otherwise calculate what the in-between value would be var closestHigher = Series.Aggregate((closest, next) => { var c = closest.Item1.Ticks - point.Ticks; var n = next.Item1.Ticks - point.Ticks; if (n > 0) { if (c > n || c < 0) { return(next); } } return(closest); }); var closestLower = Series.Aggregate((closest, next) => { var c = point.Ticks - closest.Item1.Ticks; var n = point.Ticks - next.Item1.Ticks; if (n > 0) { if (c > n || c < 0) { return(next); } } return(closest); }); // Find the position of our point between the two closest dates. value between 0-1 double pos = (double)(point - closestLower.Item1).Ticks / (closestHigher.Item1 - closestLower.Item1).Ticks; // Calculate the would-be value at the position var value = ((closestHigher.Item2.Value - closestLower.Item2.Value) * pos) + closestLower.Item2.Value; IData idata = (IData)Activator.CreateInstance(Globals.GetTypeFromDataFormat(Format), value); dp = new Tuple <DateTime, IData>(point, idata); } return(new DataPoint(Name, Color, Format, dp)); } throw new ArgumentOutOfRangeException("DateTime outside of Series range"); }
public static Series <K, U> ChunkInto <K, V, U>(this Series <K, V> series, int size, Func <Series <K, V>, U> reduce) { int num1 = size; FSharpFunc <Series <K, V>, U> g = (FSharpFunc <Series <K, V>, U>) new SeriesExtensions.ChunkInto <K, V, U>(reduce); Series <K, V> series1 = series; int num2 = num1; Boundary boundary = Boundary.Skip; FSharpFunc <DataSegment <Series <K, V> >, U> f = (FSharpFunc <DataSegment <Series <K, V> >, U>) new SeriesExtensions.ChunkInto <K, V, U>((FSharpFunc <DataSegment <Series <K, V> >, Series <K, V> >) new SeriesExtensions.ChunkInto <K, V>(), g); Series <K, V> series2 = series1; Tuple <int, Boundary> bounds = new Tuple <int, Boundary>(num2, boundary); Series <K, V> series3 = series2; Tuple <int, Boundary> tuple = bounds; Aggregation <K> aggregation = Aggregation <K> .NewChunkSize(tuple.Item1, tuple.Item2); Func <DataSegment <Series <K, V> >, K> keySelector = new Func <DataSegment <Series <K, V> >, K>(new SeriesExtensions.ChunkInto0 <K, V>(bounds).Invoke); Func <DataSegment <Series <K, V> >, OptionalValue <U> > valueSelector = new Func <DataSegment <Series <K, V> >, OptionalValue <U> >(new SeriesExtensions.ChunkInto3 <K, V, U>(f).Invoke); return(series3.Aggregate <K, U>(aggregation, keySelector, valueSelector)); }
public static Series <K, Series <K, V> > Chunk <K, V>(this Series <K, V> series, int size) { int num1 = size; Series <K, V> series1 = series; int num2 = num1; Boundary boundary = Boundary.Skip; Series <K, V> series2 = series1; Tuple <int, Boundary> tuple1 = new Tuple <int, Boundary>(num2, boundary); FSharpFunc <DataSegment <Series <K, V> >, Series <K, V> > f = (FSharpFunc <DataSegment <Series <K, V> >, Series <K, V> >) new SeriesExtensions.Chunk <K, V>(); Series <K, V> series3 = series2; Tuple <int, Boundary> bounds = new Tuple <int, Boundary>(tuple1.Item1, tuple1.Item2); Series <K, V> series4 = series3; Tuple <int, Boundary> tuple2 = bounds; Aggregation <K> aggregation = Aggregation <K> .NewChunkSize(tuple2.Item1, tuple2.Item2); Func <DataSegment <Series <K, V> >, K> keySelector = new Func <DataSegment <Series <K, V> >, K>(new SeriesExtensions.Chunk <K, V>(bounds).Invoke); Func <DataSegment <Series <K, V> >, OptionalValue <Series <K, V> > > valueSelector = new Func <DataSegment <Series <K, V> >, OptionalValue <Series <K, V> > >(new SeriesExtensions.Chunk <K, V>(f).Invoke); return(series4.Aggregate <K, Series <K, V> >(aggregation, keySelector, valueSelector)); }
public static Series <a, b> ResampleEquivalence <K, V, a, b>(this Series <K, V> series, Func <K, a> keyProj, Func <Series <K, V>, b> aggregate) { FSharpFunc <K, a> fsharpFunc = (FSharpFunc <K, a>) new SeriesExtensions.ResampleEquivalence <K, a>(keyProj); FSharpFunc <Series <K, V>, b> f = (FSharpFunc <Series <K, V>, b>) new SeriesExtensions.ResampleEquivalence <K, V, b>(aggregate); Series <K, V> series1 = series; return(SeriesModule.MapValues <Series <K, V>, b, a>(f, SeriesModule.MapKeys <K, a, Series <K, V> >(fsharpFunc, series1.Aggregate <K, Series <K, V> >(Aggregation <K> .NewChunkWhile((FSharpFunc <K, FSharpFunc <K, bool> >) new SeriesExtensions.ResampleEquivalence <K, a>(fsharpFunc)), new Func <DataSegment <Series <K, V> >, K>(new SeriesExtensions.ResampleEquivalence0 <K, V>().Invoke), new Func <DataSegment <Series <K, V> >, OptionalValue <Series <K, V> > >(new SeriesExtensions.ResampleEquivalence1 <K, V>((FSharpFunc <Series <K, V>, Series <K, V> >) new SeriesExtensions.ResampleEquivalence <K, V>()).Invoke))))); }
public static Series <K2, U> ChunkInto <K1, V, K2, U>(this Series <K1, V> series, int size, Func <Series <K1, V>, KeyValuePair <K2, U> > selector) { return(series.Aggregate <K2, U>(Aggregation <K1> .NewChunkSize(size, Boundary.Skip), new Func <DataSegment <Series <K1, V> >, KeyValuePair <K2, OptionalValue <U> > >(new SeriesExtensions.ChunkInto <K1, V, K2, U>(selector).Invoke))); }