public void CouldReadVariantSeries() { var sm = new SortedMap <int, string>(); for (int i = 0; i < 100; i++) { sm.Add(i, (i * 100).ToString()); } var vs = new VariantSeries <int, string>(sm); foreach (var item in vs) { System.Console.WriteLine(item.Key.Get <int>() + ": " + item.Value.Get <string>()); } Assert.AreEqual(Variant.Create(0), vs.First.Key); Assert.AreEqual(Variant.Create("0"), vs.First.Value); Assert.AreEqual(Variant.Create(99), vs.Last.Key); Assert.AreEqual(Variant.Create("9900"), vs.Last.Value); var cursorSeries = new CursorSeries <int, string>(sm); Assert.AreEqual(0, cursorSeries.First.Key); }
public static Series <DateTime, Matrix <double> > MovingRegression(this Series <DateTime, double> y, Series <DateTime, double[]> xs, uint window, uint step = 1) { var xpx = xs.Zip(y, (dt, xrow, yrow) => { // first x row transposed var xt = Matrix <double> .Build.DenseOfColumnArrays(new[] { xrow }); var xpxi = xt.Multiply(xt.Transpose()); var xpy = xt.Multiply(yrow); var tuple = new ValueTuple <Matrix <double>, Matrix <double> >(xpxi, xpy); //return xpxi; return(tuple); }); // then we need to sum xpxi and xpy over a window, make inverse of the first and multiply // - the result is betas var dim = xs.First.Value.Length; var cursorFactory = new Func <ScanLagAllowIncompleteCursor <DateTime, ValueTuple <Matrix <double>, Matrix <double> >, ValueTuple <Matrix <double>, Matrix <double> > > >(() => new ScanLagAllowIncompleteCursor <DateTime, ValueTuple <Matrix <double>, Matrix <double> >, ValueTuple <Matrix <double>, Matrix <double> > >( xpx.GetCursor, window, step, () => new ValueTuple <Matrix <double>, Matrix <double> >(Matrix <double> .Build.Dense(dim, dim), Matrix <double> .Build.Dense(dim, 1)), (st, add, sub, cnt) => { var cov = st.Value1.Add(add.Value.Value1); if (sub.Value.Value1 != null) { cov = cov.Subtract(sub.Value.Value1); } var variance = st.Value2.Add(add.Value.Value2); if (sub.Value.Value2 != null) { variance = variance.Subtract(sub.Value.Value2); } return(new ValueTuple <Matrix <double>, Matrix <double> >(cov, variance)); }, false)); Series <DateTime, Matrix <double> > betas; betas = new CursorSeries <DateTime, ValueTuple <Matrix <double>, Matrix <double> > >(cursorFactory).Map( tpl => { return(tpl.Value1.Inverse().Multiply(tpl.Value2)); }); return(betas); }