Indexes and Labels in Visual Basic QuickStart Sample

Illustrates how to use indexes to label the rows and columns of a data frame or matrix, or the elements of a vector in Visual Basic.

View this sample in: C# F#

Option Infer On

Imports Numerics.NET.DataAnalysis
Imports Numerics.NET

' Illustrates how to use indexes to label the elements
' of a vector, or the rows and columns of a matrix.
Module IndexesAndLabels

    Sub Main()
        ' The license is verified at runtime. We're using
        ' a 30 day trial key here. For more information, see
        '     https://numerics.net/trial-key
        Numerics.NET.License.Verify("64542-18980-57619-62268")

        '
        ' Indexes
        '

        ' An index Is a set of keys that can be used
        ' to label one Or more dimensions of a vector,
        ' matrix, Or data frame.

        '
        ' Construction
        '

        ' The simplest way to create an index Is from an array
        Dim index1 = Index.Create({"a", "b", "c", "d"})
        ' We can then assign this to the Index property of a vector
        Dim v = Vector.Create({1.0, 2.0, 3.0, 4.0})
        v.Index = index1
        Console.WriteLine(v)

        ' An index by position Is very common, 
        ' And can be created efficiently using the
        ' Default method
        Dim numbers = Index.Default(10) ' 0, 1, ..., 9
        Dim numbers2 = Index.Default(10, 20) ' 10, 11, ..., 19

        ' Various options exist to create indexes over date ranges,
        ' for example
        Dim dateIndex = Index.CreateDateRange(New DateTime(2015, 4, 25), 10)
        ' 2015/4/25, 2015/4/26, ..., 2015/5/4

        ' Finally, for some purposes it may be useful to create
        ' an index of intervals, for example when you want to
        ' categorize people into age groups
        Dim ages = {0, 18, 35, 65}
        Dim ageGroups = Index.CreateBins(ages, SpecialBins.AboveMaximum)

        '
        ' Properties
        '

        ' Indexes have a length
        Console.WriteLine($"# of keys in index: {index1.Length}")
        ' Indexes usually have unique elements.
        Console.WriteLine($"Keys are unique? {index1.IsUnique}")
        ' The elements may be sorted Or Not.
        Console.WriteLine($"Keys are sorted? {index1.IsSorted}")
        Console.WriteLine($"Sort order: {index1.SortOrder}")

        '
        ' Lookup
        '

        ' Once created, you can look up the position of a key
        Dim position = index1.Lookup("c") '= 2
        If index1.TryLookup("e", position) Then
            Console.WriteLine("We shouldn't be here.")
        End If

        ' You can also look up the nearest date. 
        Dim dates = Index.CreateDateRange(DateTime.Today.AddDays(-5), 10)
        Dim rightNow = DateTime.Now
        ' An exact lookup fails in this case
        If Not dates.TryLookup(rightNow, position) Then
            Console.WriteLine("Exact lookup failed.")
        End If
        ' But looking for the nearest key works fine
        position = dates.LookupNearest(rightNow, Direction.Backward) '= 5
        position = dates.LookupNearest(rightNow, Direction.Forward) '= 6

        '
        ' Automatic alignment
        '

        ' One of the useful features of indexes Is that 
        ' values are aligned on key values automatically.
        ' For example, given two vectors
        Dim a = Vector.Create(
                {1.0, 2.0, 3.0, 4.0},
                {"a", "b", "c", "d"})
        Dim b = Vector.Create(
                {10.0, 30.0, 40.0, 50.0},
                {"a", "c", "d", "e"})
        ' We can compute their sum
        Console.WriteLine(a + b)
        ' And we find that elements are added
        ' when they have the same key,
        ' Not when they have the same position.

        ' Indexes also propagate through calculations
        Console.WriteLine($"Exp(a) = " + Environment.NewLine + "{Vector.Exp(a)}")
        Console.WriteLine($"a[a mod 2 = 0] =" + Environment.NewLine + "{a(Function(x) x Mod 2 = 0)}")

        ' Matrices can have a row and/or a column index
        Dim c = Matrix.CreateRandom(100, 4)
        c.ColumnIndex = Index.Create({"a", "b", "c", "d"})
        Dim cTc = c.Transpose() * c
        Console.WriteLine($"C^T*C = " + Environment.NewLine + "{cTc.Summarize()}")

        Console.Write("Press any key to exit.")
        Console.ReadLine()

    End Sub

End Module