Skip to content

Commit

Permalink
Added static factory methods to DataFrameColumn (dotnet#2808)
Browse files Browse the repository at this point in the history
* Added static factory methods to DataFrameColumn where they make sense (for the overloads where its possible to infer the column's type).

* Remove regions

* Update some parts of the unit tests to use static factory methods to create DataFrameColumns.

* Remove errant {T} on StringDataFrameColumn.

* PR feedback

Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
  • Loading branch information
2 people authored and Prashanth Govindarajan committed Jan 21, 2020
1 parent 430ac09 commit 70bb9e9
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 15 deletions.
38 changes: 38 additions & 0 deletions src/Microsoft.Data.Analysis/DataFrameColumn.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,44 @@ public DataFrameColumn(string name, long length, Type type)
DataType = type;
}

/// <summary>
/// A static factory method to create a <see cref="PrimitiveDataFrameColumn{T}"/>.
/// It allows you to take advantage of type inference based on the type of the values supplied.
/// </summary>
/// <typeparam name="T">The type of the column to create.</typeparam>
/// <param name="name">The name of the column.</param>
/// <param name="values">The initial values to populate in the column.</param>
/// <returns>A <see cref="PrimitiveDataFrameColumn{T}"/> populated with the provided data.</returns>
public static PrimitiveDataFrameColumn<T> Create<T>(string name, IEnumerable<T?> values) where T : unmanaged
{
return new PrimitiveDataFrameColumn<T>(name, values);
}

/// <summary>
/// A static factory method to create a <see cref="PrimitiveDataFrameColumn{T}"/>.
/// It allows you to take advantage of type inference based on the type of the values supplied.
/// </summary>
/// <typeparam name="T">The type of the column to create.</typeparam>
/// <param name="name">The name of the column.</param>
/// <param name="values">The initial values to populate in the column.</param>
/// <returns>A <see cref="PrimitiveDataFrameColumn{T}"/> populated with the provided data.</returns>
public static PrimitiveDataFrameColumn<T> Create<T>(string name, IEnumerable<T> values) where T : unmanaged
{
return new PrimitiveDataFrameColumn<T>(name, values);
}

/// <summary>
/// A static factory method to create a <see cref="StringDataFrameColumn"/>.
/// It allows you to take advantage of type inference based on the type of the values supplied.
/// </summary>
/// <param name="name">The name of the column.</param>
/// <param name="values">The initial values to populate in the column.</param>
/// <returns>A <see cref="StringDataFrameColumn"/> populated with the provided data.</returns>
public static StringDataFrameColumn Create(string name, IEnumerable<string> values)
{
return new StringDataFrameColumn(name, values);
}

private long _length;
public long Length
{
Expand Down
30 changes: 15 additions & 15 deletions tests/Microsoft.Data.Analysis.Tests/DataFrameTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -104,14 +104,14 @@ public static DataFrame MakeDataFrameWithNumericAndBoolColumns(int length)
public static DataFrame MakeDataFrameWithNumericAndStringColumns(int length, bool withNulls = true)
{
DataFrame df = MakeDataFrameWithNumericColumns(length, withNulls);
DataFrameColumn stringColumn = new StringDataFrameColumn("String", Enumerable.Range(0, length).Select(x => x.ToString()));
DataFrameColumn stringColumn = DataFrameColumn.Create("String", Enumerable.Range(0, length).Select(x => x.ToString()));
df.Columns.Insert(df.Columns.Count, stringColumn);
if (withNulls)
{
stringColumn[length / 2] = null;
}

DataFrameColumn charColumn = new PrimitiveDataFrameColumn<char>("Char", Enumerable.Range(0, length).Select(x => (char)(x + 65)));
DataFrameColumn charColumn = DataFrameColumn.Create("Char", Enumerable.Range(0, length).Select(x => (char)(x + 65)));
df.Columns.Insert(df.Columns.Count, charColumn);
if (withNulls)
{
Expand All @@ -122,17 +122,17 @@ public static DataFrame MakeDataFrameWithNumericAndStringColumns(int length, boo

public static DataFrame MakeDataFrameWithNumericColumns(int length, bool withNulls = true)
{
DataFrameColumn byteColumn = new PrimitiveDataFrameColumn<byte>("Byte", Enumerable.Range(0, length).Select(x => (byte)x));
DataFrameColumn decimalColumn = new PrimitiveDataFrameColumn<decimal>("Decimal", Enumerable.Range(0, length).Select(x => (decimal)x));
DataFrameColumn doubleColumn = new PrimitiveDataFrameColumn<double>("Double", Enumerable.Range(0, length).Select(x => (double)x));
DataFrameColumn floatColumn = new PrimitiveDataFrameColumn<float>("Float", Enumerable.Range(0, length).Select(x => (float)x));
DataFrameColumn intColumn = new PrimitiveDataFrameColumn<int>("Int", Enumerable.Range(0, length).Select(x => x));
DataFrameColumn longColumn = new PrimitiveDataFrameColumn<long>("Long", Enumerable.Range(0, length).Select(x => (long)x));
DataFrameColumn sbyteColumn = new PrimitiveDataFrameColumn<sbyte>("Sbyte", Enumerable.Range(0, length).Select(x => (sbyte)x));
DataFrameColumn shortColumn = new PrimitiveDataFrameColumn<short>("Short", Enumerable.Range(0, length).Select(x => (short)x));
DataFrameColumn uintColumn = new PrimitiveDataFrameColumn<uint>("Uint", Enumerable.Range(0, length).Select(x => (uint)x));
DataFrameColumn ulongColumn = new PrimitiveDataFrameColumn<ulong>("Ulong", Enumerable.Range(0, length).Select(x => (ulong)x));
DataFrameColumn ushortColumn = new PrimitiveDataFrameColumn<ushort>("Ushort", Enumerable.Range(0, length).Select(x => (ushort)x));
DataFrameColumn byteColumn = DataFrameColumn.Create("Byte", Enumerable.Range(0, length).Select(x => (byte)x));
DataFrameColumn decimalColumn = DataFrameColumn.Create("Decimal", Enumerable.Range(0, length).Select(x => (decimal)x));
DataFrameColumn doubleColumn = DataFrameColumn.Create("Double", Enumerable.Range(0, length).Select(x => (double)x));
DataFrameColumn floatColumn = DataFrameColumn.Create("Float", Enumerable.Range(0, length).Select(x => (float)x));
DataFrameColumn intColumn = DataFrameColumn.Create("Int", Enumerable.Range(0, length).Select(x => x));
DataFrameColumn longColumn = DataFrameColumn.Create("Long", Enumerable.Range(0, length).Select(x => (long)x));
DataFrameColumn sbyteColumn = DataFrameColumn.Create("Sbyte", Enumerable.Range(0, length).Select(x => (sbyte)x));
DataFrameColumn shortColumn = DataFrameColumn.Create("Short", Enumerable.Range(0, length).Select(x => (short)x));
DataFrameColumn uintColumn = DataFrameColumn.Create("Uint", Enumerable.Range(0, length).Select(x => (uint)x));
DataFrameColumn ulongColumn = DataFrameColumn.Create("Ulong", Enumerable.Range(0, length).Select(x => (ulong)x));
DataFrameColumn ushortColumn = DataFrameColumn.Create("Ushort", Enumerable.Range(0, length).Select(x => (ushort)x));

DataFrame dataFrame = new DataFrame(new List<DataFrameColumn> { byteColumn, decimalColumn, doubleColumn, floatColumn, intColumn, longColumn, sbyteColumn, shortColumn, uintColumn, ulongColumn, ushortColumn });

Expand All @@ -150,8 +150,8 @@ public static DataFrame MakeDataFrame<T1, T2>(int length, bool withNulls = true)
where T1 : unmanaged
where T2 : unmanaged
{
DataFrameColumn baseColumn1 = new PrimitiveDataFrameColumn<T1>("Column1", Enumerable.Range(0, length).Select(x => (T1)Convert.ChangeType(x % 2 == 0 ? 0 : 1, typeof(T1))));
DataFrameColumn baseColumn2 = new PrimitiveDataFrameColumn<T2>("Column2", Enumerable.Range(0, length).Select(x => (T2)Convert.ChangeType(x % 2 == 0 ? 0 : 1, typeof(T2))));
DataFrameColumn baseColumn1 = DataFrameColumn.Create("Column1", Enumerable.Range(0, length).Select(x => (T1)Convert.ChangeType(x % 2 == 0 ? 0 : 1, typeof(T1))));
DataFrameColumn baseColumn2 = DataFrameColumn.Create("Column2", Enumerable.Range(0, length).Select(x => (T2)Convert.ChangeType(x % 2 == 0 ? 0 : 1, typeof(T2))));
DataFrame dataFrame = new DataFrame(new List<DataFrameColumn> { baseColumn1, baseColumn2 });

if (withNulls)
Expand Down

0 comments on commit 70bb9e9

Please sign in to comment.