DataFrame.fromListOfMaps constructor

DataFrame.fromListOfMaps(
  1. List<Map<String, Object>> data, {
  2. Map<String, ColumnType>? types,
})

A data frame built from a list of maps.

Example:

final d = DataFrame.fromListOfMaps([
  {"a": 1, "b": 5.1, "c": "red"},
  {"a": 3, "b": 2.7, "c": "green"},
  {"a": 5, "b": -0.9, "c": "red"},
]);
print(d);

.-.----.-------.
|a|b   |c      |
:-+----+-------:
|1|5.1 |red    |
|3|2.7 |green  |
|5|-0.9|red    |
'-'----'-------'

Implementation

factory DataFrame.fromListOfMaps(
  List<Map<String, Object>> data, {
  Map<String, ColumnType>? types,
}) {
  types = types ?? {};
  final numericColumns = <String, NumericColumn>{},
      categoricColumns = <String, CategoricColumn>{};
  for (final key in data.first.keys) {
    if (types.containsKey(key)) {
      switch (types[key]!) {
        case ColumnType.numeric:
          numericColumns[key] = NumericColumn([]);
        case ColumnType.categoric:
          categoricColumns[key] = CategoricColumn([]);
      }
    } else {
      final firstParsedValue = num.tryParse(data.first[key]!.toString());
      if (firstParsedValue == null) {
        types[key] = ColumnType.categoric;
        categoricColumns[key] = CategoricColumn([]);
      } else {
        types[key] = ColumnType.numeric;
        numericColumns[key] = NumericColumn([]);
      }
    }
  }
  for (final datum in data) {
    for (final key in datum.keys) {
      switch (types[key]!) {
        case ColumnType.numeric:
          numericColumns[key]!.add(
            num.tryParse(datum[key]!.toString()) ?? double.nan,
          );
        case ColumnType.categoric:
          categoricColumns[key]!.add(datum[key]!.toString());
      }
    }
  }
  return DataFrame(
    numericColumns: numericColumns,
    categoricColumns: categoricColumns,
  );
}