Skip to content

Commit 70bb9e9

Browse files
MgSameerhardt
authored andcommitted
Added static factory methods to DataFrameColumn (dotnet#2808)
* 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>
1 parent 430ac09 commit 70bb9e9

2 files changed

Lines changed: 53 additions & 15 deletions

File tree

src/Microsoft.Data.Analysis/DataFrameColumn.cs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,44 @@ public DataFrameColumn(string name, long length, Type type)
2424
DataType = type;
2525
}
2626

27+
/// <summary>
28+
/// A static factory method to create a <see cref="PrimitiveDataFrameColumn{T}"/>.
29+
/// It allows you to take advantage of type inference based on the type of the values supplied.
30+
/// </summary>
31+
/// <typeparam name="T">The type of the column to create.</typeparam>
32+
/// <param name="name">The name of the column.</param>
33+
/// <param name="values">The initial values to populate in the column.</param>
34+
/// <returns>A <see cref="PrimitiveDataFrameColumn{T}"/> populated with the provided data.</returns>
35+
public static PrimitiveDataFrameColumn<T> Create<T>(string name, IEnumerable<T?> values) where T : unmanaged
36+
{
37+
return new PrimitiveDataFrameColumn<T>(name, values);
38+
}
39+
40+
/// <summary>
41+
/// A static factory method to create a <see cref="PrimitiveDataFrameColumn{T}"/>.
42+
/// It allows you to take advantage of type inference based on the type of the values supplied.
43+
/// </summary>
44+
/// <typeparam name="T">The type of the column to create.</typeparam>
45+
/// <param name="name">The name of the column.</param>
46+
/// <param name="values">The initial values to populate in the column.</param>
47+
/// <returns>A <see cref="PrimitiveDataFrameColumn{T}"/> populated with the provided data.</returns>
48+
public static PrimitiveDataFrameColumn<T> Create<T>(string name, IEnumerable<T> values) where T : unmanaged
49+
{
50+
return new PrimitiveDataFrameColumn<T>(name, values);
51+
}
52+
53+
/// <summary>
54+
/// A static factory method to create a <see cref="StringDataFrameColumn"/>.
55+
/// It allows you to take advantage of type inference based on the type of the values supplied.
56+
/// </summary>
57+
/// <param name="name">The name of the column.</param>
58+
/// <param name="values">The initial values to populate in the column.</param>
59+
/// <returns>A <see cref="StringDataFrameColumn"/> populated with the provided data.</returns>
60+
public static StringDataFrameColumn Create(string name, IEnumerable<string> values)
61+
{
62+
return new StringDataFrameColumn(name, values);
63+
}
64+
2765
private long _length;
2866
public long Length
2967
{

tests/Microsoft.Data.Analysis.Tests/DataFrameTests.cs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -104,14 +104,14 @@ public static DataFrame MakeDataFrameWithNumericAndBoolColumns(int length)
104104
public static DataFrame MakeDataFrameWithNumericAndStringColumns(int length, bool withNulls = true)
105105
{
106106
DataFrame df = MakeDataFrameWithNumericColumns(length, withNulls);
107-
DataFrameColumn stringColumn = new StringDataFrameColumn("String", Enumerable.Range(0, length).Select(x => x.ToString()));
107+
DataFrameColumn stringColumn = DataFrameColumn.Create("String", Enumerable.Range(0, length).Select(x => x.ToString()));
108108
df.Columns.Insert(df.Columns.Count, stringColumn);
109109
if (withNulls)
110110
{
111111
stringColumn[length / 2] = null;
112112
}
113113

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

123123
public static DataFrame MakeDataFrameWithNumericColumns(int length, bool withNulls = true)
124124
{
125-
DataFrameColumn byteColumn = new PrimitiveDataFrameColumn<byte>("Byte", Enumerable.Range(0, length).Select(x => (byte)x));
126-
DataFrameColumn decimalColumn = new PrimitiveDataFrameColumn<decimal>("Decimal", Enumerable.Range(0, length).Select(x => (decimal)x));
127-
DataFrameColumn doubleColumn = new PrimitiveDataFrameColumn<double>("Double", Enumerable.Range(0, length).Select(x => (double)x));
128-
DataFrameColumn floatColumn = new PrimitiveDataFrameColumn<float>("Float", Enumerable.Range(0, length).Select(x => (float)x));
129-
DataFrameColumn intColumn = new PrimitiveDataFrameColumn<int>("Int", Enumerable.Range(0, length).Select(x => x));
130-
DataFrameColumn longColumn = new PrimitiveDataFrameColumn<long>("Long", Enumerable.Range(0, length).Select(x => (long)x));
131-
DataFrameColumn sbyteColumn = new PrimitiveDataFrameColumn<sbyte>("Sbyte", Enumerable.Range(0, length).Select(x => (sbyte)x));
132-
DataFrameColumn shortColumn = new PrimitiveDataFrameColumn<short>("Short", Enumerable.Range(0, length).Select(x => (short)x));
133-
DataFrameColumn uintColumn = new PrimitiveDataFrameColumn<uint>("Uint", Enumerable.Range(0, length).Select(x => (uint)x));
134-
DataFrameColumn ulongColumn = new PrimitiveDataFrameColumn<ulong>("Ulong", Enumerable.Range(0, length).Select(x => (ulong)x));
135-
DataFrameColumn ushortColumn = new PrimitiveDataFrameColumn<ushort>("Ushort", Enumerable.Range(0, length).Select(x => (ushort)x));
125+
DataFrameColumn byteColumn = DataFrameColumn.Create("Byte", Enumerable.Range(0, length).Select(x => (byte)x));
126+
DataFrameColumn decimalColumn = DataFrameColumn.Create("Decimal", Enumerable.Range(0, length).Select(x => (decimal)x));
127+
DataFrameColumn doubleColumn = DataFrameColumn.Create("Double", Enumerable.Range(0, length).Select(x => (double)x));
128+
DataFrameColumn floatColumn = DataFrameColumn.Create("Float", Enumerable.Range(0, length).Select(x => (float)x));
129+
DataFrameColumn intColumn = DataFrameColumn.Create("Int", Enumerable.Range(0, length).Select(x => x));
130+
DataFrameColumn longColumn = DataFrameColumn.Create("Long", Enumerable.Range(0, length).Select(x => (long)x));
131+
DataFrameColumn sbyteColumn = DataFrameColumn.Create("Sbyte", Enumerable.Range(0, length).Select(x => (sbyte)x));
132+
DataFrameColumn shortColumn = DataFrameColumn.Create("Short", Enumerable.Range(0, length).Select(x => (short)x));
133+
DataFrameColumn uintColumn = DataFrameColumn.Create("Uint", Enumerable.Range(0, length).Select(x => (uint)x));
134+
DataFrameColumn ulongColumn = DataFrameColumn.Create("Ulong", Enumerable.Range(0, length).Select(x => (ulong)x));
135+
DataFrameColumn ushortColumn = DataFrameColumn.Create("Ushort", Enumerable.Range(0, length).Select(x => (ushort)x));
136136

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

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

157157
if (withNulls)

0 commit comments

Comments
 (0)