parseAsListOfMaps method
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,
// );
}