parseAsListOfMaps method

DataFrame parseAsListOfMaps({
  1. Map<String, ColumnType>? types,
})

Creates a data frame from a json string representing a list of maps.

Example:

final d = """
  [
    {"a": 1, "b": 3.2, "c": "apple"},
    {"a": 2, "b": -5.6, "c": "ball"},
    {"a": 3, "b": 0.0, "c": "cat"}
  ]
""".parseAsListOfMaps();
print(d);

.-.----.-------.
|a|b   |c      |
:-+----+-------:
|1|3.2 |apple  |
|2|-5.6|ball   |
|3|0.0 |cat    |
'-'----'-------'

Implementation

DataFrame parseAsListOfMaps({Map<String, ColumnType>? types}) {
  types = types ?? {};
  final data = json.decode(this),
      firstDatum = data.first,
      columnNames = <String>[...firstDatum.keys],
      numericColumns = <String, NumericColumn>{},
      categoricColumns = <String, CategoricColumn>{};

  for (final column in columnNames) {
    if (!types.containsKey(column)) {
      final parseFirst = num.tryParse(firstDatum[column]!.toString());
      types[column] =
          parseFirst == null ? ColumnType.categoric : ColumnType.numeric;
    }
    if (types[column]! == ColumnType.numeric) {
      numericColumns[column] = NumericColumn([]);
    } else {
      categoricColumns[column] = CategoricColumn([]);
    }
  }

  for (final datum in data) {
    for (final column in numericColumns.keys) {
      final value = datum.containsKey(column)
          ? num.tryParse(datum[column]!.toString()) ?? double.nan
          : double.nan;
      numericColumns[column]!.add(value);
    }
    for (final column in categoricColumns.keys) {
      final value = datum.containsKey(column)
          ? datum[column]!.toString()
          : CategoricColumn.missingValueMarker;
      categoricColumns[column]!.add(value);
    }
  }

  return DataFrame(
    numericColumns: numericColumns,
    categoricColumns: categoricColumns,
  );
  // if only...
  // return DataFrame.fromListOfMaps(
  //   List<Map<String, Object>>.from(json.decode(this)),
  //   types: types,
  // );
}