예제 #1
0
        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");
        }
예제 #2
0
        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));
        }
예제 #3
0
        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));
        }
예제 #4
0
        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)))));
        }
예제 #5
0
 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)));
 }