dataframe-js
Version:
Immutable and functional data structure for datascientists and developpers
881 lines (769 loc) • 36.7 kB
JavaScript
"use strict";
exports.__esModule = true;
var _from = require("babel-runtime/core-js/array/from");
var _from2 = _interopRequireDefault(_from);
var _is = require("babel-runtime/core-js/object/is");
var _is2 = _interopRequireDefault(_is);
var _typeof2 = require("babel-runtime/helpers/typeof");
var _typeof3 = _interopRequireDefault(_typeof2);
var _stringify = require("babel-runtime/core-js/json/stringify");
var _stringify2 = _interopRequireDefault(_stringify);
var _entries = require("babel-runtime/core-js/object/entries");
var _entries2 = _interopRequireDefault(_entries);
var _values = require("babel-runtime/core-js/object/values");
var _values2 = _interopRequireDefault(_values);
var _set = require("babel-runtime/core-js/set");
var _set2 = _interopRequireDefault(_set);
var _defineProperty2 = require("babel-runtime/helpers/defineProperty");
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
var _keys = require("babel-runtime/core-js/object/keys");
var _keys2 = _interopRequireDefault(_keys);
var _regenerator = require("babel-runtime/regenerator");
var _regenerator2 = _interopRequireDefault(_regenerator);
var _getIterator2 = require("babel-runtime/core-js/get-iterator");
var _getIterator3 = _interopRequireDefault(_getIterator2);
var _iterator3 = require("babel-runtime/core-js/symbol/iterator");
var _iterator4 = _interopRequireDefault(_iterator3);
var _assign = require("babel-runtime/core-js/object/assign");
var _assign2 = _interopRequireDefault(_assign);
var _toConsumableArray2 = require("babel-runtime/helpers/toConsumableArray");
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _slicedToArray2 = require("babel-runtime/helpers/slicedToArray");
var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
var _promise = require("babel-runtime/core-js/promise");
var _promise2 = _interopRequireDefault(_promise);
var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
var _symbol = require("babel-runtime/core-js/symbol");
var _symbol2 = _interopRequireDefault(_symbol);
var _class, _temp;
var _d3Request = require("d3-request");
var _d3Dsv = require("d3-dsv");
var _reusables = require("./reusables");
var _errors = require("./errors");
var _row = require("./row");
var _row2 = _interopRequireDefault(_row);
var _groupedDataframe = require("./groupedDataframe");
var _groupedDataframe2 = _interopRequireDefault(_groupedDataframe);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
var __columns__ = (0, _symbol2["default"])("columns");
var __rows__ = (0, _symbol2["default"])("rows");
var DataFrame = (_temp = _class = function () {
(0, _createClass3["default"])(DataFrame, null, [{
key: "setDefaultModules",
value: function setDefaultModules() {
for (var _len = arguments.length, defaultModules = Array(_len), _key = 0; _key < _len; _key++) {
defaultModules[_key] = arguments[_key];
}
DataFrame.defaultModules = defaultModules;
}
}, {
key: "fromDSV",
value: function fromDSV(pathOrFile) {
var sep = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ";";
var header = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
var parser = (0, _d3Dsv.dsvFormat)(sep);
return new _promise2["default"](function (resolve) {
var parseText = function parseText(fileContent) {
if (fileContent.includes("Error: ENOENT")) return resolve(null);
var data = header ? parser.parse(fileContent) : parser.parseRows(fileContent);
return resolve(data);
};
return typeof pathOrFile === "string" ? (0, _d3Request.text)((0, _reusables.addFileProtocol)(pathOrFile), parseText) : (0, _reusables.loadTextFile)(pathOrFile, parseText);
}).then(function (fileContent) {
if (fileContent === null) {
throw new _errors.FileNotFoundError(pathOrFile);
}
return new DataFrame(fileContent);
});
}
}, {
key: "fromText",
value: function fromText(pathOrFile) {
var sep = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ";";
var header = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
return DataFrame.fromDSV(pathOrFile, sep, header);
}
}, {
key: "fromCSV",
value: function fromCSV(pathOrFile) {
var header = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
return DataFrame.fromDSV(pathOrFile, ",", header);
}
}, {
key: "fromTSV",
value: function fromTSV(pathOrFile) {
var header = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
return DataFrame.fromDSV(pathOrFile, "\t", header);
}
}, {
key: "fromPSV",
value: function fromPSV(pathOrFile) {
var header = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
return DataFrame.fromDSV(pathOrFile, "|", header);
}
}, {
key: "fromJSON",
value: function fromJSON(pathOrFile) {
return new _promise2["default"](function (resolve) {
return typeof pathOrFile === "string" ? (0, _d3Request.json)((0, _reusables.addFileProtocol)(pathOrFile), resolve) : (0, _reusables.loadTextFile)(pathOrFile, function (txt) {
return resolve(JSON.parse(txt));
});
}).then(function (fileContent) {
if (fileContent === null) {
throw new _errors.FileNotFoundError(pathOrFile);
}
return new DataFrame(fileContent);
});
}
}]);
function DataFrame(data, columns) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
(0, _classCallCheck3["default"])(this, DataFrame);
var _build2 = this._build(data, columns);
var _build3 = (0, _slicedToArray3["default"])(_build2, 2);
this[__rows__] = _build3[0];
this[__columns__] = _build3[1];
this.options = options;
this.options.modules = [].concat((0, _toConsumableArray3["default"])(DataFrame.defaultModules), (0, _toConsumableArray3["default"])(this.options.modules || []));
_assign2["default"].apply(Object, [this].concat((0, _toConsumableArray3["default"])(this.__instanciateModules__(this.options.modules))));
}
(0, _createClass3["default"])(DataFrame, [{
key: _iterator4["default"],
value: _regenerator2["default"].mark(function value() {
var _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, row;
return _regenerator2["default"].wrap(function value$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_iteratorNormalCompletion = true;
_didIteratorError = false;
_iteratorError = undefined;
_context.prev = 3;
_iterator = (0, _getIterator3["default"])(this[__rows__]);
case 5:
if (_iteratorNormalCompletion = (_step = _iterator.next()).done) {
_context.next = 12;
break;
}
row = _step.value;
_context.next = 9;
return row;
case 9:
_iteratorNormalCompletion = true;
_context.next = 5;
break;
case 12:
_context.next = 18;
break;
case 14:
_context.prev = 14;
_context.t0 = _context["catch"](3);
_didIteratorError = true;
_iteratorError = _context.t0;
case 18:
_context.prev = 18;
_context.prev = 19;
if (!_iteratorNormalCompletion && _iterator["return"]) {
_iterator["return"]();
}
case 21:
_context.prev = 21;
if (!_didIteratorError) {
_context.next = 24;
break;
}
throw _iteratorError;
case 24:
return _context.finish(21);
case 25:
return _context.finish(18);
case 26:
case "end":
return _context.stop();
}
}
}, value, this, [[3, 14, 18, 26], [19,, 21, 25]]);
})
}, {
key: "_columnsAreEquals",
value: function _columnsAreEquals(columns) {
var columns2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this[__columns__];
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = (0, _getIterator3["default"])((0, _keys2["default"])(columns)), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var key = _step2.value;
if (columns[key] !== columns2[key]) return false;
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2["return"]) {
_iterator2["return"]();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
return true;
}
}, {
key: "__newInstance__",
value: function __newInstance__(data, columns) {
if (!this._columnsAreEquals(columns) || !(data[0] instanceof _row2["default"])) {
return new DataFrame(data, columns, this.options);
}
var firstRowColumns = (0, _keys2["default"])(data[0].toDict());
if (!(0, _reusables.arrayEqual)(firstRowColumns, this[__columns__], true)) {
return new DataFrame(data, firstRowColumns, this.options);
}
var newInstance = new DataFrame([], [], this.options);
newInstance[__rows__] = [].concat((0, _toConsumableArray3["default"])(data));
newInstance[__columns__] = [].concat((0, _toConsumableArray3["default"])(columns));
return newInstance;
}
}, {
key: "__instanciateModules__",
value: function __instanciateModules__(modules) {
var _this = this;
var df = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
return modules.map(function (Plugin) {
var pluginInstance = new Plugin(df ? df : _this);
return (0, _defineProperty3["default"])({}, pluginInstance.name, pluginInstance);
});
}
}, {
key: "_build",
value: function _build(data, columns) {
var _this2 = this;
return (0, _reusables.match)(data, [function (value) {
return value instanceof DataFrame;
}, function () {
return _this2._fromArray([].concat((0, _toConsumableArray3["default"])(data[__rows__])), columns ? columns : data[__columns__]);
}], [function (value) {
return value instanceof Array && value.length !== 0;
}, function () {
return _this2._fromArray(data, columns ? columns : [].concat((0, _toConsumableArray3["default"])(new _set2["default"]([].concat((0, _toConsumableArray3["default"])(data.slice(0, 10)), (0, _toConsumableArray3["default"])(data.slice(-10, -1))).map(function (row) {
return (0, _keys2["default"])(row);
}).reduce(function (p, n) {
return [].concat((0, _toConsumableArray3["default"])(p), (0, _toConsumableArray3["default"])(n));
})))));
}], [function (value) {
return value instanceof Array && value.length === 0;
}, function () {
return _this2._fromArray(data, columns ? columns : []);
}], [function (value) {
return value instanceof Object;
}, function () {
return _this2._fromDict(data, columns ? columns : (0, _keys2["default"])(data));
}], [function () {
return true;
}, function () {
throw new _errors.ArgumentTypeError(data, "DataFrame | Array | Object");
}]);
}
}, {
key: "_fromDict",
value: function _fromDict(dict, columns) {
return [(0, _reusables.transpose)((0, _values2["default"])(dict)).map(function (row) {
return new _row2["default"](row, columns);
}), columns];
}
}, {
key: "_fromArray",
value: function _fromArray(array, columns) {
return [array.map(function (row) {
return new _row2["default"](row, columns);
}), columns];
}
}, {
key: "_joinByType",
value: function _joinByType(gdf1, gdf2, type, newColumns) {
var _this3 = this;
var gdf2Hashs = gdf2.listHashs();
return gdf1.toCollection().map(function (_ref2) {
var group = _ref2.group,
hash = _ref2.hash;
var isContained = gdf2Hashs.includes(hash);
var modifiedGroup = group;
if (gdf2.get(hash)) {
var gdf2Collection = gdf2.get(hash).group.toCollection();
var combinedGroup = group.toCollection().map(function (row) {
return gdf2Collection.map(function (row2) {
return (0, _assign2["default"])({}, row2, row);
});
}).reduce(function (p, n) {
return [].concat((0, _toConsumableArray3["default"])(p), (0, _toConsumableArray3["default"])(n));
}, []);
modifiedGroup = _this3.__newInstance__(combinedGroup, newColumns);
}
var filterCondition = function filterCondition(bool) {
return bool ? modifiedGroup : false;
};
if (type === "full") return modifiedGroup;
return type === "out" ? filterCondition(!isContained) : filterCondition(isContained);
}).filter(function (group) {
return group;
});
}
}, {
key: "_join",
value: function _join(dfToJoin, columnNames, types) {
if (!(dfToJoin instanceof DataFrame)) throw new _errors.ArgumentTypeError(dfToJoin, "DataFrame");
var newColumns = [].concat((0, _toConsumableArray3["default"])(new _set2["default"]([].concat((0, _toConsumableArray3["default"])(this.listColumns()), (0, _toConsumableArray3["default"])(dfToJoin.listColumns())))));
var columns = Array.isArray(columnNames) ? columnNames : [columnNames];
var gdf = this.groupBy.apply(this, (0, _toConsumableArray3["default"])(columns));
var gdfToJoin = dfToJoin.groupBy.apply(dfToJoin, (0, _toConsumableArray3["default"])(columns));
return [this.__newInstance__([], newColumns)].concat((0, _toConsumableArray3["default"])((0, _reusables.iter)([].concat((0, _toConsumableArray3["default"])(types[0] ? this._joinByType(gdf, gdfToJoin, types[0], newColumns) : []), (0, _toConsumableArray3["default"])(types[1] ? this._joinByType(gdfToJoin, gdf, types[1], newColumns) : [])), function (group) {
return group.restructure(newColumns);
}))).reduce(function (p, n) {
return p.union(n);
}).dropDuplicates();
}
}, {
key: "_cleanSavePath",
value: function _cleanSavePath(path) {
return path.replace("file://", "/");
}
}, {
key: "toDict",
value: function toDict() {
var _this4 = this;
return _assign2["default"].apply(Object, [{}].concat((0, _toConsumableArray3["default"])((0, _entries2["default"])(this.transpose().toArray()).map(function (_ref3) {
var _ref4 = (0, _slicedToArray3["default"])(_ref3, 2),
index = _ref4[0],
column = _ref4[1];
return (0, _defineProperty3["default"])({}, _this4[__columns__][index], column);
}))));
}
}, {
key: "toArray",
value: function toArray(columnName) {
return columnName ? [].concat((0, _toConsumableArray3["default"])(this)).map(function (row) {
return row.get(columnName);
}) : [].concat((0, _toConsumableArray3["default"])(this)).map(function (row) {
return row.toArray();
});
}
}, {
key: "toCollection",
value: function toCollection(ofRows) {
return ofRows ? [].concat((0, _toConsumableArray3["default"])(this)) : [].concat((0, _toConsumableArray3["default"])(this)).map(function (row) {
return row.toDict();
});
}
}, {
key: "toDSV",
value: function toDSV() {
var sep = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ";";
var header = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
var path = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
var parser = (0, _d3Dsv.dsvFormat)(sep);
var csvContent = header ? parser.format(this.toCollection(), this[__columns__]) : parser.formatRows(this.toArray());
if (path) {
(0, _reusables.saveFile)(this._cleanSavePath(path), csvContent);
}
return csvContent;
}
}, {
key: "toText",
value: function toText() {
var sep = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ";";
var header = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
var path = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
return this.toDSV(sep, header, path);
}
}, {
key: "toCSV",
value: function toCSV() {
var header = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
return this.toDSV(",", header, path);
}
}, {
key: "toTSV",
value: function toTSV() {
var header = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
return this.toDSV("\t", header, path);
}
}, {
key: "toPSV",
value: function toPSV() {
var header = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
return this.toDSV("|", header, path);
}
}, {
key: "toJSON",
value: function toJSON() {
var asCollection = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
var jsonContent = (0, _stringify2["default"])(asCollection ? this.toCollection() : this.toDict());
if (path) {
(0, _reusables.saveFile)(this._cleanSavePath(path), jsonContent);
}
return jsonContent;
}
}, {
key: "show",
value: function show() {
var rows = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10;
var quiet = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
var makeRow = function makeRow(row) {
return "| " + row.map(function (column) {
var columnAsString = String(column);
return columnAsString.length > 9 ? columnAsString.substring(0, 6) + "..." : columnAsString + Array(10 - columnAsString.length).join(" ");
}).join(" | ") + " |";
};
var header = makeRow(this[__columns__]);
var token = 0;
var toShow = [header, Array(header.length).join("-")].concat((0, _toConsumableArray3["default"])((0, _reusables.iter)(this[__rows__], function (row) {
token++;
return makeRow(row.toArray());
}, function () {
return token >= rows;
}))).join("\n");
if (!quiet) {
console.log(toShow);
}
return toShow;
}
}, {
key: "dim",
value: function dim() {
return [this.count(), this[__columns__].length];
}
}, {
key: "transpose",
value: function transpose(tranposeColumnNames) {
var newColumns = [].concat((0, _toConsumableArray3["default"])(tranposeColumnNames ? ["rowNames"] : []), (0, _toConsumableArray3["default"])([].concat((0, _toConsumableArray3["default"])(Array(this.count()).keys())).reverse()));
var transposedRows = (0, _reusables.transpose)((tranposeColumnNames ? this.push(this[__columns__]) : this).toArray());
return this.__newInstance__(transposedRows, newColumns.reverse()).restructure(newColumns);
}
}, {
key: "count",
value: function count() {
return this[__rows__].length;
}
}, {
key: "countValue",
value: function countValue(valueToCount) {
var columnName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this[__columns__][0];
return this.filter(function (row) {
return row.get(columnName) === valueToCount;
}).count();
}
}, {
key: "push",
value: function push() {
for (var _len2 = arguments.length, rows = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
rows[_key2] = arguments[_key2];
}
return this.union(new DataFrame(rows, this[__columns__]));
}
}, {
key: "replace",
value: function replace(value, replacement, columnNames) {
var _this5 = this;
var columns = (0, _reusables.asArray)(columnNames);
return this.map(function (row) {
return (columns.length > 0 ? columns : _this5[__columns__]).reduce(function (p, n) {
return p.get(n) === value ? p.set(n, replacement) : p;
}, row);
});
}
}, {
key: "distinct",
value: function distinct(columnName) {
return this.__newInstance__((0, _defineProperty3["default"])({}, columnName, [].concat((0, _toConsumableArray3["default"])(new _set2["default"](this.toArray(columnName))))), [columnName]);
}
}, {
key: "unique",
value: function unique(columnName) {
return this.distinct(columnName);
}
}, {
key: "listColumns",
value: function listColumns() {
return [].concat((0, _toConsumableArray3["default"])(this[__columns__]));
}
}, {
key: "select",
value: function select() {
for (var _len3 = arguments.length, columnNames = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
columnNames[_key3] = arguments[_key3];
}
return this.__newInstance__(this[__rows__].map(function (row) {
return row.select.apply(row, columnNames);
}), columnNames);
}
}, {
key: "withColumn",
value: function withColumn(columnName) {
var func = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
return undefined;
};
return this.__newInstance__(this[__rows__].map(function (row, index) {
return row.set(columnName, func(row, index));
}), this[__columns__].includes(columnName) ? this[__columns__] : [].concat((0, _toConsumableArray3["default"])(this[__columns__]), [columnName]));
}
}, {
key: "restructure",
value: function restructure(newColumnNames) {
return this.__newInstance__(this[__rows__], newColumnNames);
}
}, {
key: "renameAll",
value: function renameAll(newColumnNames) {
if (newColumnNames.length !== this[__columns__].length) {
throw new _errors.WrongSchemaError(newColumnNames, this[__columns__]);
}
return this.__newInstance__(this.toArray(), newColumnNames);
}
}, {
key: "rename",
value: function rename(columnName, replacement) {
var newColumnNames = this[__columns__].map(function (column) {
return column === columnName ? replacement : column;
});
return this.renameAll(newColumnNames);
}
}, {
key: "castAll",
value: function castAll(typeFunctions) {
var _this6 = this;
if (typeFunctions.length !== this[__columns__].length) {
throw new _errors.WrongSchemaError(typeFunctions, this[__columns__]);
}
return this.map(function (row) {
return new _row2["default"](row.toArray().map(function (column, index) {
return typeFunctions[index](column);
}), _this6[__columns__]);
});
}
}, {
key: "cast",
value: function cast(columnName, typeFunction) {
return this.withColumn(columnName, function (row) {
return typeFunction(row.get(columnName));
});
}
}, {
key: "drop",
value: function drop(columnName) {
return this.__newInstance__(this[__rows__].map(function (row) {
return row["delete"](columnName);
}), this[__columns__].filter(function (column) {
return column !== columnName;
}));
}
}, {
key: "chain",
value: function chain() {
for (var _len4 = arguments.length, funcs = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
funcs[_key4] = arguments[_key4];
}
return this.__newInstance__([].concat((0, _toConsumableArray3["default"])(_reusables.chain.apply(undefined, [this[__rows__]].concat(funcs)))), this[__columns__]);
}
}, {
key: "filter",
value: function filter(condition) {
var func = (typeof condition === "undefined" ? "undefined" : (0, _typeof3["default"])(condition)) === "object" ? function (row) {
return (0, _entries2["default"])(condition).map(function (_ref6) {
var _ref7 = (0, _slicedToArray3["default"])(_ref6, 2),
column = _ref7[0],
value = _ref7[1];
return (0, _is2["default"])(row.get(column), value);
}).reduce(function (p, n) {
return p && n;
});
} : condition;
var filteredRows = [].concat((0, _toConsumableArray3["default"])((0, _reusables.iter)(this[__rows__], function (row, i) {
return func(row, i) ? row : false;
})));
return filteredRows.length > 0 ? this.__newInstance__(filteredRows, this[__columns__]) : this.__newInstance__([], []);
}
}, {
key: "where",
value: function where(condition) {
return this.filter(condition);
}
}, {
key: "find",
value: function find(condition) {
return this.filter(condition)[__rows__][0];
}
}, {
key: "map",
value: function map(func) {
return this.__newInstance__([].concat((0, _toConsumableArray3["default"])((0, _reusables.iter)(this[__rows__], function (row, i) {
return func(row, i);
}))), this[__columns__]);
}
}, {
key: "reduce",
value: function reduce(func, init) {
return typeof init === "undefined" ? this[__rows__].reduce(function (p, n) {
return func(p, n);
}) : this[__rows__].reduce(function (p, n) {
return func(p, n);
}, init);
}
}, {
key: "reduceRight",
value: function reduceRight(func, init) {
return typeof init === "undefined" ? this[__rows__].reduceRight(function (p, n) {
return func(p, n);
}) : this[__rows__].reduceRight(function (p, n) {
return func(p, n);
}, init);
}
}, {
key: "dropDuplicates",
value: function dropDuplicates() {
for (var _len5 = arguments.length, columnNames = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
columnNames[_key5] = arguments[_key5];
}
var groupCols = columnNames && columnNames.length > 0 ? columnNames : this[__columns__];
return this.groupBy.apply(this, (0, _toConsumableArray3["default"])(groupCols)).filter(function (row, i) {
return i === 0;
});
}
}, {
key: "shuffle",
value: function shuffle() {
return this.__newInstance__(this.reduce(function (p, n) {
var index = Math.floor(Math.random() * (p.length - 1) + 1);
return Array.isArray(p) ? [].concat((0, _toConsumableArray3["default"])(p.slice(index, p.length + 1)), [n], (0, _toConsumableArray3["default"])(p.slice(0, index))) : [p, n];
}), this[__columns__]);
}
}, {
key: "sample",
value: function sample(percentage) {
var nRows = this.count() * percentage;
var token = 0;
return this.__newInstance__([].concat((0, _toConsumableArray3["default"])((0, _reusables.iter)(this.shuffle()[__rows__], function (row) {
token++;
return row;
}, function () {
return token >= nRows;
}))), this[__columns__]);
}
}, {
key: "bisect",
value: function bisect(percentage) {
var nRows = this.count() * percentage;
var token = 0;
var restRows = [];
return [this.__newInstance__([].concat((0, _toConsumableArray3["default"])((0, _reusables.iter)(this.shuffle()[__rows__], function (row) {
if (token < nRows) {
token++;
return row;
}
restRows.push(row);
}))), this[__columns__]), this.__newInstance__(restRows, this[__columns__])];
}
}, {
key: "groupBy",
value: function groupBy() {
for (var _len6 = arguments.length, columnNames = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
columnNames[_key6] = arguments[_key6];
}
return new (Function.prototype.bind.apply(_groupedDataframe2["default"], [null].concat([this], columnNames)))();
}
}, {
key: "sortBy",
value: function sortBy(columnNames) {
var reverse = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
var _columnNames = (0, _from2["default"])(new _set2["default"]((0, _reusables.asArray)(columnNames)));
var sortedRows = this[__rows__].sort(function (p, n) {
return _columnNames.map(function (col) {
var _ref8 = [p.get(col), n.get(col)],
pValue = _ref8[0],
nValue = _ref8[1];
if ((typeof pValue === "undefined" ? "undefined" : (0, _typeof3["default"])(pValue)) !== (typeof nValue === "undefined" ? "undefined" : (0, _typeof3["default"])(nValue))) {
throw new _errors.MixedTypeError();
}
return (0, _reusables.compare)(pValue, nValue, reverse);
}).reduce(function (acc, curr) {
return acc || curr;
});
});
return this.__newInstance__(sortedRows, this[__columns__]);
}
}, {
key: "union",
value: function union(dfToUnion) {
if (!(dfToUnion instanceof DataFrame)) throw new _errors.ArgumentTypeError(dfToUnion, "DataFrame");
if (!(0, _reusables.arrayEqual)(this[__columns__], dfToUnion[__columns__])) {
throw new _errors.WrongSchemaError(dfToUnion[__columns__], this[__columns__]);
}
return this.__newInstance__([].concat((0, _toConsumableArray3["default"])(this), (0, _toConsumableArray3["default"])(dfToUnion.restructure(this[__columns__]))), this[__columns__]);
}
}, {
key: "join",
value: function join(dfToJoin, columnNames) {
var _this7 = this;
var how = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "inner";
var joinMethods = {
inner: function inner() {
return _this7.innerJoin(dfToJoin, columnNames);
},
full: function full() {
return _this7.fullJoin(dfToJoin, columnNames);
},
outer: function outer() {
return _this7.outerJoin(dfToJoin, columnNames);
},
left: function left() {
return _this7.leftJoin(dfToJoin, columnNames);
},
right: function right() {
return _this7.rightJoin(dfToJoin, columnNames);
}
};
return joinMethods[how]();
}
}, {
key: "innerJoin",
value: function innerJoin(dfToJoin, columnNames) {
return this._join(dfToJoin, columnNames, ["in"]);
}
}, {
key: "fullJoin",
value: function fullJoin(dfToJoin, columnNames) {
return this._join(dfToJoin, columnNames, ["full", "full"]);
}
}, {
key: "outerJoin",
value: function outerJoin(dfToJoin, columnNames) {
return this.fullJoin(dfToJoin, columnNames);
}
}, {
key: "leftJoin",
value: function leftJoin(dfToJoin, columnNames) {
return this._join(dfToJoin, columnNames, ["full", "in"]);
}
}, {
key: "rightJoin",
value: function rightJoin(dfToJoin, columnNames) {
return this._join(dfToJoin, columnNames, ["in", "full"]);
}
}, {
key: "diff",
value: function diff(dfToDiff, columnNames) {
return this._join(dfToDiff, columnNames, ["out", "out"]);
}
}]);
return DataFrame;
}(), _class.defaultModules = [], _temp);
exports["default"] = DataFrame;