C# Apply Transform Example

[TOC]

using System;

using CenterSpace.NMath.Core;
using CenterSpace.NMath.Stats;

namespace CenterSpace.NMath.Stats.Examples.CSharp
{
  /// <summary>
  /// A .NET example in C# showing how to use the Apply and Transform methods on 
  /// a DataFrame and its columns.
  /// </summary>
  class ApplyTransformExample
  {
    private static DataFrame data;

    static void Main(string[] args)
    {
      Console.WriteLine();

      data = new DataFrame();
      data.AddColumn(new DFStringColumn("first"));
      data.AddColumn(new DFStringColumn("last"));
      data.AddColumn(new DFDateTimeColumn("birthdate"));
      data.AddColumn(new DFNumericColumn("test1"));
      data.AddColumn(new DFNumericColumn("test2"));
      InitializeData();

      Console.WriteLine();
      Console.WriteLine("Original data...");
      Console.WriteLine();
      Console.WriteLine(data);

      // Combine first name and last name columns into a new 
      // column and then add it to the data frame.
      NMathFunctions.StringBinaryFunction concatenate = new NMathFunctions.StringBinaryFunction(CombineNames);
      DFStringColumn fullNames = ((DFStringColumn)data["first"]).Apply("full names", concatenate, (DFStringColumn)data["last"]);
      data.InsertColumn(0, fullNames);

      // Remove first name, last name columns
      data.RemoveColumn("first");
      data.RemoveColumn("last");

      Console.WriteLine();
      Console.WriteLine("Concatenate first and last names...");
      Console.WriteLine();
      Console.WriteLine(data);

      /// Scale all test2 scores up by 10 points
      ((DFNumericColumn)data["test2"]).Transform(new NMathFunctions.DoubleUnaryFunction(Scale));

      Console.WriteLine();
      Console.WriteLine("Scale test2 up by 10%...");
      Console.WriteLine();
      Console.WriteLine(data);

      // Cap all grades at 95
      ((DFNumericColumn)data["test1"]).Transform(new NMathFunctions.DoubleUnaryFunction(Cap));
      ((DFNumericColumn)data["test2"]).Transform(new NMathFunctions.DoubleUnaryFunction(Cap));

      Console.WriteLine();
      Console.WriteLine("Cap grades at 95%...");
      Console.WriteLine();
      Console.WriteLine(data);

      // Add a new column which is the weighted average of the two tests
      NMathFunctions.DoubleBinaryFunction weighted = new NMathFunctions.DoubleBinaryFunction(Weighted);
      DFNumericColumn final = ((DFNumericColumn)data["test1"]).Apply("final", weighted, (DFNumericColumn)data["test2"]);
      data.AddColumn(final);

      Console.WriteLine();
      Console.WriteLine("Final weighted average...");
      Console.WriteLine();
      Console.WriteLine(data);

      // Round all numeric values to the nearest whole number
      ((DFNumericColumn)data["test1"]).Transform(new NMathFunctions.DoubleIntFunction(System.Math.Round), 1);
      ((DFNumericColumn)data["test1"]).NumericFormat = "F1";

      ((DFNumericColumn)data["test2"]).Transform(new NMathFunctions.DoubleIntFunction(System.Math.Round), 1);
      ((DFNumericColumn)data["test2"]).NumericFormat = "F1";

      ((DFNumericColumn)data["final"]).Transform(new NMathFunctions.DoubleIntFunction(System.Math.Round), 1);
      ((DFNumericColumn)data["final"]).NumericFormat = "F1";

      Console.WriteLine();
      Console.WriteLine("Round to one decimal place...");
      Console.WriteLine();
      Console.WriteLine(data);

      Console.WriteLine();
      Console.WriteLine("Press Enter Key");
      Console.Read();
    }

    private static void InitializeData()
    {
      data.AddRow(1, "Jack", "Cooper", "1/29/1968", 55.4, 63.3);
      data.AddRow(2, "Henri", "Robert", "12/4/1978", 85.6, 90.2);
      data.AddRow(3, "Sasha", "Klein", "5/7/1947", 65.4, 64.3);
      data.AddRow(4, "Gail", "Blake", "8/4/1985", 75.1, 48.2);
      data.AddRow(5, "Paul", "Norton", "9/21/1981", 55.4, 62.3);
      data.AddRow(6, "Harry", "Liu", "10/12/1972", 85.6, 87.3);
      data.AddRow(7, "Roberto", "Ortiz", "11/3/1978", 59.2, 93.3);
      data.AddRow(8, "Marie", "Flint", "4/5/1972", 66.7, 38.2);
    }

    private static string CombineNames(string first, string last)
    {
      return first + " " + last;
    }

    private static double Scale(double score)
    {
      return score + 10.0;
    }

    private static double Cap(double score)
    {
      return score > 95.0 ? 95.0 : score;
    }

    private static double Weighted(double test1, double test2)
    {
      return (0.4 * test1) + (0.6 * test2);
    }

    // private static bool 

  }  // class

}  // namespace


[TOC]