UNPKG

dataframe-js

Version:

Immutable and functional data structure for datascientists and developpers

1,022 lines (867 loc) 35.6 kB
"use strict"; require("core-js/modules/es.symbol"); require("core-js/modules/es.symbol.description"); require("core-js/modules/es.symbol.iterator"); require("core-js/modules/es.array.concat"); require("core-js/modules/es.array.filter"); require("core-js/modules/es.array.for-each"); require("core-js/modules/es.array.from"); require("core-js/modules/es.array.includes"); require("core-js/modules/es.array.iterator"); require("core-js/modules/es.array.join"); require("core-js/modules/es.array.map"); require("core-js/modules/es.array.reduce"); require("core-js/modules/es.array.reduce-right"); require("core-js/modules/es.array.slice"); require("core-js/modules/es.array.sort"); require("core-js/modules/es.date.to-json"); require("core-js/modules/es.date.to-string"); require("core-js/modules/es.function.name"); require("core-js/modules/es.object.assign"); require("core-js/modules/es.object.entries"); require("core-js/modules/es.object.get-own-property-descriptor"); require("core-js/modules/es.object.is"); require("core-js/modules/es.object.keys"); require("core-js/modules/es.object.to-string"); require("core-js/modules/es.object.values"); require("core-js/modules/es.regexp.exec"); require("core-js/modules/es.regexp.to-string"); require("core-js/modules/es.set"); require("core-js/modules/es.string.includes"); require("core-js/modules/es.string.iterator"); require("core-js/modules/es.string.replace"); require("core-js/modules/esnext.set.add-all"); require("core-js/modules/esnext.set.delete-all"); require("core-js/modules/esnext.set.difference"); require("core-js/modules/esnext.set.every"); require("core-js/modules/esnext.set.filter"); require("core-js/modules/esnext.set.find"); require("core-js/modules/esnext.set.intersection"); require("core-js/modules/esnext.set.is-disjoint-from"); require("core-js/modules/esnext.set.is-subset-of"); require("core-js/modules/esnext.set.is-superset-of"); require("core-js/modules/esnext.set.join"); require("core-js/modules/esnext.set.map"); require("core-js/modules/esnext.set.reduce"); require("core-js/modules/esnext.set.some"); require("core-js/modules/esnext.set.symmetric-difference"); require("core-js/modules/esnext.set.union"); require("core-js/modules/web.dom-collections.for-each"); require("core-js/modules/web.dom-collections.iterator"); require("core-js/modules/web.url.to-json"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; require("regenerator-runtime/runtime"); var _reusables = require("./reusables"); var _errors = require("./errors"); var _row = _interopRequireDefault(require("./row")); var _group = require("./group"); var _symbol = require("./symbol"); var io = _interopRequireWildcard(require("./io")); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var DataFrame = function () { _createClass(DataFrame, null, [{ key: "setDefaultModules", value: function setDefaultModules() { for (var _len = arguments.length, defaultModules = new Array(_len), _key = 0; _key < _len; _key++) { defaultModules[_key] = arguments[_key]; } DataFrame.defaultModules = defaultModules; } }, { key: "fromDSV", value: function fromDSV() { return io.fromDSV.apply(io, arguments).then(function (content) { return new DataFrame(content); }); } }, { key: "fromText", value: function fromText() { return io.fromText.apply(io, arguments).then(function (content) { return new DataFrame(content); }); } }, { key: "fromCSV", value: function fromCSV() { return io.fromCSV.apply(io, arguments).then(function (content) { return new DataFrame(content); }); } }, { key: "fromTSV", value: function fromTSV() { return io.fromTSV.apply(io, arguments).then(function (content) { return new DataFrame(content); }); } }, { key: "fromPSV", value: function fromPSV() { return io.fromPSV.apply(io, arguments).then(function (content) { return new DataFrame(content); }); } }, { key: "fromJSON", value: function fromJSON() { return io.fromJSON.apply(io, arguments).then(function (content) { return new DataFrame(content); }); } }]); function DataFrame(data, columns) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; _classCallCheck(this, DataFrame); var _this$_build = this._build(data, columns); var _this$_build2 = _slicedToArray(_this$_build, 2); this[_symbol.__rows__] = _this$_build2[0]; this[_symbol.__columns__] = _this$_build2[1]; this.options = options; this.options.modules = [].concat(_toConsumableArray(DataFrame.defaultModules), _toConsumableArray(this.options.modules || [])); Object.assign.apply(Object, [this].concat(_toConsumableArray(this.__instanciateModules__(this.options.modules)))); } _createClass(DataFrame, [{ key: Symbol.iterator, value: regeneratorRuntime.mark(function value() { var _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, row; return regeneratorRuntime.wrap(function value$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _iteratorNormalCompletion = true; _didIteratorError = false; _iteratorError = undefined; _context.prev = 3; _iterator = this[_symbol.__rows__][Symbol.iterator](); 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 != null) { _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[_symbol.__columns__]; for (var _i2 = 0, _Object$keys = Object.keys(columns); _i2 < _Object$keys.length; _i2++) { var key = _Object$keys[_i2]; if (columns[key] !== columns2[key]) return false; } return true; } }, { key: "__newInstance__", value: function __newInstance__(data, columns) { if (!this._columnsAreEquals(columns) || !(data[0] instanceof _row.default)) { return new DataFrame(data, columns, this.options); } var firstRowColumns = Object.keys(data[0].toDict()); if (!(0, _reusables.arrayEqual)(firstRowColumns, this[_symbol.__columns__], true)) { return new DataFrame(data, firstRowColumns, this.options); } var newInstance = new DataFrame([], [], this.options); newInstance[_symbol.__rows__] = _toConsumableArray(data); newInstance[_symbol.__columns__] = _toConsumableArray(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 _defineProperty({}, pluginInstance.name, pluginInstance); }); } }, { key: "_build", value: function _build(data, columns) { if (data instanceof DataFrame) { return this._fromArray(Array.from(data[_symbol.__rows__]), columns || data[_symbol.__columns__]); } if (data instanceof Array && data.length > 0) { return this._fromArray(data, columns || Array.from(new Set(data.slice(0, 10).concat(data.slice(-10, -1)).map(function (row) { return Object.keys(row); }).reduce(function (p, n) { return p.concat(n); })))); } if (data instanceof Array && data.length === 0) { return this._fromArray(data, columns ? columns : []); } if (data instanceof Object) { return this._fromDict(data, columns || Object.keys(data)); } throw new _errors.ArgumentTypeError(data, "DataFrame | Array | Object"); } }, { key: "_fromDict", value: function _fromDict(dict, columns) { return [(0, _reusables.transpose)(Object.values(dict)).map(function (row) { return new _row.default(row, columns); }), columns]; } }, { key: "_fromArray", value: function _fromArray(array, columns) { return [array.map(function (row) { return new _row.default(row, columns); }), columns]; } }, { key: "_joinByType", value: function _joinByType(gdf1, gdf2, type, newColumns) { var _this2 = 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 Object.assign({}, row2, row); }); }).reduce(function (p, n) { return [].concat(_toConsumableArray(p), _toConsumableArray(n)); }, []); modifiedGroup = _this2.__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 = _toConsumableArray(new Set([].concat(_toConsumableArray(this.listColumns()), _toConsumableArray(dfToJoin.listColumns())))); var columns = Array.isArray(columnNames) ? columnNames : [columnNames]; var gdf = this.groupBy.apply(this, _toConsumableArray(columns)); var gdfToJoin = dfToJoin.groupBy.apply(dfToJoin, _toConsumableArray(columns)); return [this.__newInstance__([], newColumns)].concat(_toConsumableArray((0, _reusables.iter)([].concat(_toConsumableArray(types[0] ? this._joinByType(gdf, gdfToJoin, types[0], newColumns) : []), _toConsumableArray(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: "toDSV", value: function toDSV() { for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } return io.toDSV.apply(io, [this].concat(args)); } }, { key: "toCSV", value: function toCSV() { for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { args[_key3] = arguments[_key3]; } return io.toCSV.apply(io, [this].concat(args)); } }, { key: "toTSV", value: function toTSV() { for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { args[_key4] = arguments[_key4]; } return io.toTSV.apply(io, [this].concat(args)); } }, { key: "toPSV", value: function toPSV() { for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { args[_key5] = arguments[_key5]; } return io.toPSV.apply(io, [this].concat(args)); } }, { key: "toText", value: function toText() { for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) { args[_key6] = arguments[_key6]; } return io.toText.apply(io, [this].concat(args)); } }, { key: "toJSON", value: function toJSON() { for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) { args[_key7] = arguments[_key7]; } return io.toJSON.apply(io, [this].concat(args)); } }, { key: "toDict", value: function toDict() { var _this3 = this; return Object.assign.apply(Object, [{}].concat(_toConsumableArray(Object.entries(this.transpose().toArray()).map(function (_ref3) { var _ref4 = _slicedToArray(_ref3, 2), index = _ref4[0], column = _ref4[1]; return _defineProperty({}, _this3[_symbol.__columns__][index], column); })))); } }, { key: "toArray", value: function toArray(columnName) { return columnName ? Array.from(this).map(function (row) { return row.get(columnName); }) : Array.from(this).map(function (row) { return row.toArray(); }); } }, { key: "toCollection", value: function toCollection(ofRows) { return ofRows ? Array.from(this) : Array.from(this).map(function (row) { return row.toDict(); }); } }, { 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 "| ".concat(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[_symbol.__columns__]); var token = 0; var toShow = [header, Array(header.length).join("-")].concat(_toConsumableArray((0, _reusables.iter)(this[_symbol.__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[_symbol.__columns__].length]; } }, { key: "transpose", value: function transpose(tranposeColumnNames) { var newColumns = [].concat(_toConsumableArray(tranposeColumnNames ? ["rowNames"] : []), _toConsumableArray(_toConsumableArray(Array(this.count()).keys()).reverse())); var transposedRows = (0, _reusables.transpose)((tranposeColumnNames ? this.push(this[_symbol.__columns__]) : this).toArray()); return this.__newInstance__(transposedRows, newColumns.reverse()).restructure(newColumns); } }, { key: "count", value: function count() { return this[_symbol.__rows__].length; } }, { key: "countValue", value: function countValue(valueToCount) { var columnName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this[_symbol.__columns__][0]; return this.filter(function (row) { return row.get(columnName) === valueToCount; }).count(); } }, { key: "push", value: function push() { for (var _len8 = arguments.length, rows = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) { rows[_key8] = arguments[_key8]; } return this.union(new DataFrame(rows, this[_symbol.__columns__])); } }, { key: "replace", value: function replace(value, replacement, columnNames) { var _this4 = this; var columns = columnNames && columnNames.length > 0 ? columnNames : this[_symbol.__columns__]; var values = Array.isArray(value) ? value : [value]; return this.map(function (row) { return (columns.length > 0 ? columns : _this4[_symbol.__columns__]).reduce(function (p, n) { return values.includes(p.get(n)) ? p.set(n, replacement) : p; }, row); }); } }, { key: "distinct", value: function distinct(columnName) { return this.__newInstance__(_defineProperty({}, columnName, _toConsumableArray(new Set(this.toArray(columnName)))), [columnName]); } }, { key: "unique", value: function unique(columnName) { return this.distinct(columnName); } }, { key: "listColumns", value: function listColumns() { return _toConsumableArray(this[_symbol.__columns__]); } }, { key: "select", value: function select() { for (var _len9 = arguments.length, columnNames = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) { columnNames[_key9] = arguments[_key9]; } return this.__newInstance__(this[_symbol.__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[_symbol.__rows__].map(function (row, index) { return row.set(columnName, func(row, index)); }), this[_symbol.__columns__].includes(columnName) ? this[_symbol.__columns__] : [].concat(_toConsumableArray(this[_symbol.__columns__]), [columnName])); } }, { key: "restructure", value: function restructure(newColumnNames) { return this.__newInstance__(this[_symbol.__rows__], newColumnNames); } }, { key: "renameAll", value: function renameAll(newColumnNames) { if (newColumnNames.length !== this[_symbol.__columns__].length) { throw new _errors.WrongSchemaError(newColumnNames, this[_symbol.__columns__]); } return this.__newInstance__(this.toArray(), newColumnNames); } }, { key: "rename", value: function rename(columnName, replacement) { var newColumnNames = this[_symbol.__columns__].map(function (column) { return column === columnName ? replacement : column; }); return this.renameAll(newColumnNames); } }, { key: "castAll", value: function castAll(typeFunctions) { var _this5 = this; if (typeFunctions.length !== this[_symbol.__columns__].length) { throw new _errors.WrongSchemaError(typeFunctions, this[_symbol.__columns__]); } return this.map(function (row) { return new _row.default(row.toArray().map(function (column, index) { return typeFunctions[index](column); }), _this5[_symbol.__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[_symbol.__rows__].map(function (row) { return row.delete(columnName); }), this[_symbol.__columns__].filter(function (column) { return column !== columnName; })); } }, { key: "chain", value: function chain() { for (var _len10 = arguments.length, funcs = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) { funcs[_key10] = arguments[_key10]; } return this.__newInstance__(_toConsumableArray(_reusables.chain.apply(void 0, [this[_symbol.__rows__]].concat(funcs))), this[_symbol.__columns__]); } }, { key: "filter", value: function filter(condition) { var func = _typeof(condition) === "object" ? function (row) { return Object.entries(condition).map(function (_ref6) { var _ref7 = _slicedToArray(_ref6, 2), column = _ref7[0], value = _ref7[1]; return Object.is(row.get(column), value); }).reduce(function (p, n) { return p && n; }); } : condition; var filteredRows = (0, _reusables.iter)(this[_symbol.__rows__], function (row, i) { return func(row, i) ? row : false; }); return this.__newInstance__(filteredRows, this[_symbol.__columns__]); } }, { key: "where", value: function where(condition) { return this.filter(condition); } }, { key: "find", value: function find(condition) { return this.filter(condition)[_symbol.__rows__][0]; } }, { key: "map", value: function map(func) { return this.__newInstance__((0, _reusables.iter)(this[_symbol.__rows__], function (row, i) { return func(row, i); }), this[_symbol.__columns__]); } }, { key: "reduce", value: function reduce(func, init) { return typeof init === "undefined" ? this[_symbol.__rows__].reduce(function (p, n) { return func(p, n); }) : this[_symbol.__rows__].reduce(function (p, n) { return func(p, n); }, init); } }, { key: "reduceRight", value: function reduceRight(func, init) { return typeof init === "undefined" ? this[_symbol.__rows__].reduceRight(function (p, n) { return func(p, n); }) : this[_symbol.__rows__].reduceRight(function (p, n) { return func(p, n); }, init); } }, { key: "dropDuplicates", value: function dropDuplicates() { for (var _len11 = arguments.length, columnNames = new Array(_len11), _key11 = 0; _key11 < _len11; _key11++) { columnNames[_key11] = arguments[_key11]; } var groupCols = columnNames && columnNames.length > 0 ? columnNames : this[_symbol.__columns__]; return this.groupBy.apply(this, _toConsumableArray(groupCols)).filter(function (row, i) { return i === 0; }); } }, { key: "dropMissingValues", value: function dropMissingValues(columnNames) { var cols = columnNames && columnNames.length > 0 ? columnNames : this[_symbol.__columns__]; return this.filter(function (row) { var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = cols[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var col = _step2.value; if ([NaN, undefined, null].includes(row.get(col))) { return false; } } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return != null) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } return true; }); } }, { key: "fillMissingValues", value: function fillMissingValues(replacement, columnNames) { return this.replace([NaN, undefined, null], replacement, columnNames); } }, { key: "shuffle", value: function shuffle() { if (this.count() < 2) return this; return this.__newInstance__(this.reduce(function (p, n) { var index = Math.floor(Math.random() * (p.length - 1) + 1); return Array.isArray(p) ? [].concat(_toConsumableArray(p.slice(index, p.length + 1)), [n], _toConsumableArray(p.slice(0, index))) : [p, n]; }), this[_symbol.__columns__]); } }, { key: "sample", value: function sample(percentage) { var nRows = this.count() * percentage; var token = 0; return this.__newInstance__((0, _reusables.iter)(this.shuffle()[_symbol.__rows__], function (row) { token++; return row; }, function () { return token >= nRows; }), this[_symbol.__columns__]); } }, { key: "bisect", value: function bisect(percentage) { var nRows = this.count() * percentage; var token = 0; var restRows = []; return [this.__newInstance__((0, _reusables.iter)(this.shuffle()[_symbol.__rows__], function (row) { if (token < nRows) { token++; return row; } restRows.push(row); }), this[_symbol.__columns__]), this.__newInstance__(restRows, this[_symbol.__columns__])]; } }, { key: "groupBy", value: function groupBy() { for (var _len12 = arguments.length, args = new Array(_len12), _key12 = 0; _key12 < _len12; _key12++) { args[_key12] = arguments[_key12]; } return (0, _group.groupBy)(this, args); } }, { key: "sortBy", value: function sortBy(columnNames) { var reverse = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var missingValuesPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "first"; if (!Array.isArray(columnNames)) { columnNames = [columnNames]; } var _columnNames = columnNames; var _missingValuesPosition = ["first", "last"].includes(missingValuesPosition) ? missingValuesPosition : "first"; var _checkMissingValue = function _checkMissingValue(v) { return [NaN, null, undefined].includes(v); }; var sortedRows = this[_symbol.__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 (_checkMissingValue(pValue)) { return _missingValuesPosition === "last" ? 1 : -1; } else if (_checkMissingValue(nValue)) { return _missingValuesPosition === "last" ? -1 : 1; } else if (_typeof(pValue) !== _typeof(nValue)) { throw new _errors.MixedTypeError([_typeof(pValue), _typeof(nValue)]); } else if (pValue > nValue) { return reverse ? -1 : 1; } else if (pValue < nValue) { return reverse ? 1 : -1; } return 0; }).reduce(function (acc, curr) { return acc || curr; }); }); if (_columnNames.length > 1) { var sortedRowsWithMissingValues = []; var sortedRowsWithoutMissingValues = []; sortedRows.forEach(function (row) { var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { for (var _iterator3 = _columnNames[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { var col = _step3.value; if (_checkMissingValue(row.get(col))) { sortedRowsWithMissingValues.push(row); return; } } } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3.return != null) { _iterator3.return(); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } sortedRowsWithoutMissingValues.push(row); }); return this.__newInstance__(missingValuesPosition === "last" ? sortedRowsWithoutMissingValues.concat(sortedRowsWithMissingValues) : sortedRowsWithMissingValues.concat(sortedRowsWithoutMissingValues), this[_symbol.__columns__]); } return this.__newInstance__(sortedRows, this[_symbol.__columns__]); } }, { key: "union", value: function union(dfToUnion) { if (!(dfToUnion instanceof DataFrame)) throw new _errors.ArgumentTypeError(dfToUnion, "DataFrame"); if (!(0, _reusables.arrayEqual)(this[_symbol.__columns__], dfToUnion[_symbol.__columns__])) { throw new _errors.WrongSchemaError(dfToUnion[_symbol.__columns__], this[_symbol.__columns__]); } return this.__newInstance__([].concat(_toConsumableArray(this), _toConsumableArray(dfToUnion.restructure(this[_symbol.__columns__]))), this[_symbol.__columns__]); } }, { key: "join", value: function join(dfToJoin, columnNames) { var _this6 = this; var how = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "inner"; var joinMethods = { inner: function inner() { return _this6.innerJoin(dfToJoin, columnNames); }, full: function full() { return _this6.fullJoin(dfToJoin, columnNames); }, outer: function outer() { return _this6.outerJoin(dfToJoin, columnNames); }, left: function left() { return _this6.leftJoin(dfToJoin, columnNames); }, right: function right() { return _this6.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"]); } }, { key: "head", value: function head() { var nRows = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10; return this.slice(0, nRows); } }, { key: "tail", value: function tail() { var nRows = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10; return this.slice(-nRows); } }, { key: "slice", value: function slice(startIndex, endIndex) { return this.__newInstance__(this[_symbol.__rows__].slice(startIndex || undefined, endIndex || undefined), this[_symbol.__columns__]); } }, { key: "getRow", value: function getRow(index) { return this[_symbol.__rows__][index]; } }, { key: "setRow", value: function setRow(index) { var func = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (row) { return row; }; var newRows = Array.from(this[_symbol.__rows__]); newRows[index] = func(newRows[index]); return this.__newInstance__(newRows, this[_symbol.__columns__]); } }]); return DataFrame; }(); DataFrame.defaultModules = []; var _default = DataFrame; exports.default = _default;