pandas-js
Version:
Pandas for JavaScript
1,227 lines (1,032 loc) • 43.2 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports._concatDataFrame = exports.mergeDataFrame = undefined;
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _get2 = require('babel-runtime/helpers/get');
var _get3 = _interopRequireDefault(_get2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _typeof2 = require('babel-runtime/helpers/typeof');
var _typeof3 = _interopRequireDefault(_typeof2);
var _immutable = require('immutable');
var _immutable2 = _interopRequireDefault(_immutable);
var _exceptions = require('./exceptions');
var _generic = require('./generic');
var _generic2 = _interopRequireDefault(_generic);
var _series = require('./series');
var _series2 = _interopRequireDefault(_series);
var _utils = require('./utils');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var parseArrayToSeriesMap = function parseArrayToSeriesMap(array, index) {
var dataMap = _immutable2.default.Map({});
array.forEach(function (el) {
if (el instanceof _immutable2.default.Map) {
el.keySeq().forEach(function (k) {
if (dataMap.has(k)) {
dataMap = dataMap.set(k, dataMap.get(k).push(el.get(k)));
} else {
dataMap = dataMap.set(k, _immutable2.default.List.of(el.get(k)));
}
});
} else if ((typeof el === 'undefined' ? 'undefined' : (0, _typeof3.default)(el)) === 'object') {
Object.keys(el).forEach(function (k) {
if (dataMap.has(k)) {
dataMap = dataMap.set(k, dataMap.get(k).push(el[k]));
} else {
dataMap = dataMap.set(k, _immutable2.default.List.of(el[k]));
}
});
}
});
dataMap.keySeq().forEach(function (k) {
dataMap = dataMap.set(k, new _series2.default(dataMap.get(k), { name: k, index: index }));
});
return _immutable2.default.Map(dataMap);
};
var DataFrame = function (_NDFrame) {
(0, _inherits3.default)(DataFrame, _NDFrame);
function DataFrame(data) {
var kwargs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
(0, _classCallCheck3.default)(this, DataFrame);
var _this = (0, _possibleConstructorReturn3.default)(this, (DataFrame.__proto__ || Object.getPrototypeOf(DataFrame)).call(this, data, kwargs));
if (Array.isArray(data)) {
_this.set_axis(0, (0, _utils.parseIndex)(kwargs.index, _immutable2.default.List(data)));
_this._data = parseArrayToSeriesMap(data, _this.index);
_this.set_axis(1, _this._data.keySeq());
} else if (data instanceof _immutable2.default.Map) {
_this._data = _immutable2.default.OrderedMap(data.keySeq().map(function (k) {
if (data instanceof _immutable2.default.Map && !(data.get(k) instanceof _series2.default)) throw new Error('Map must have [column, series] key-value pairs');
if (data instanceof _immutable2.default.Map) return [k, data.get(k).copy()];
throw new Error('Data is not Map');
}));
_this.set_axis(1, _this._data.keySeq());
_this.set_axis(0, _this._data.get(_this.columns.get(0)).index);
} else if (data instanceof _immutable2.default.List) {
var columns = void 0;
if (Array.isArray(kwargs.columns) || kwargs.columns instanceof _immutable2.default.Seq) columns = _immutable2.default.List(kwargs.columns);else if (kwargs.columns instanceof _immutable2.default.List) columns = kwargs.columns;else if (typeof kwargs.columns === 'undefined') columns = _immutable2.default.Range(0, data.get(0).size).toList();else throw new Error('Invalid columns');
_this._values = data;
_this._data = _immutable2.default.OrderedMap(columns.map(function (c, colIdx) {
return [c, new _series2.default(data.map(function (row) {
return row.get(colIdx);
}), { index: kwargs.index })];
}));
_this.set_axis(1, _this._data.keySeq());
_this.set_axis(0, _this._data.get(_this.columns.get(0)).index);
} else if (typeof data === 'undefined') {
_this._data = _immutable2.default.Map({});
_this.set_axis(0, _immutable2.default.List.of());
_this.set_axis(1, _immutable2.default.Seq.of());
}
_this._setup_axes(_immutable2.default.List.of(0, 1));
return _this;
}
(0, _createClass3.default)(DataFrame, [{
key: 'toString',
value: function toString() {
var _this2 = this;
var string = '\t|';
this.columns.forEach(function (k) {
string += ' ' + k + ' |';
});
var headerRow = '-'.repeat(string.length);
string += '\n' + headerRow + '\n';
var stringUpdate = function stringUpdate(idx) {
var s = '';
_this2.columns.forEach(function (k) {
s += ' ' + _this2._data.get(k).iloc(idx) + ' |';
});
return s;
};
for (var idx = 0; idx < this.length; idx += 1) {
string += this.index.get(idx) + '\t|';
string += stringUpdate(idx);
string += '\n';
}
return string;
}
}, {
key: 'copy',
value: function copy() {
return new DataFrame(this._data, { index: this.index });
}
}, {
key: Symbol.iterator,
value: function value() {
var _this3 = this;
var index = -1;
return {
next: function next() {
index += 1;
var done = !(index >= 0 && index < _this3.length);
var value = done ? undefined : _immutable2.default.Map(_this3.columns.map(function (k, idx) {
return [k, _this3.values.get(index).get(idx)];
}));
return { value: value, done: done };
}
};
}
}, {
key: 'iterrows',
value: function iterrows() {
return (0, _utils.enumerate)(this);
}
}, {
key: 'set',
value: function set(column, series) {
if (series instanceof _series2.default) return new DataFrame(this._data.set(column, series), this.kwargs);else if (series instanceof _immutable2.default.List || Array.isArray(series)) return new DataFrame(this._data.set(column, new _series2.default(series, { index: this.index, name: column })), this.kwargs);
throw new TypeError('series must be a Series!');
}
}, {
key: 'reset_index',
value: function reset_index() {
var _this4 = this;
var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { drop: false };
if (typeof args.drop !== 'undefined' && typeof args.drop !== 'boolean') throw new TypeError('drop must be a boolean');
var drop = typeof args.drop === 'undefined' ? false : args.drop;
var indexName = 'index';
if (this.columnExists('index')) {
var i = 0;
while (this.columnExists('level_' + i)) {
i += 1;
}
indexName = 'level_' + i;
}
var data = _immutable2.default.Map(this.columns.map(function (c) {
return [c, new _series2.default(_this4.get(c).values)];
}));
if (!args.drop) data = data.set(indexName, new _series2.default(this.index));
return new DataFrame(data);
}
}, {
key: 'iloc',
value: function iloc(rowIdx, colIdx) {
var _this5 = this;
if (typeof rowIdx === 'number') {
if (typeof colIdx === 'number') {
if (colIdx < 0 || colIdx >= this.shape[1]) throw new Error('colIdx out of bounds');
var getCol = this.columns.get(colIdx);
return new DataFrame(_immutable2.default.Map([[getCol, this.get(getCol).iloc(rowIdx, rowIdx + 1)]]), { index: this.index.slice(rowIdx, rowIdx + 1) });
} else if (Array.isArray(colIdx)) {
if (colIdx.length !== 2) throw new Error('colIdx must be length 2 (start and end positions)');
if (colIdx[1] <= colIdx[0]) throw new Error('colIdx end position cannot be less than or equal tostart position');
if (colIdx[0] < 0 || colIdx[1] > this.shape[1]) throw new Error('colIdx position out of bounds');
return new DataFrame(_immutable2.default.Map(_immutable2.default.Range(colIdx[0], colIdx[1]).map(function (idx) {
var getCol = _this5.columns.get(idx);
return [getCol, _this5.get(getCol).iloc(rowIdx, rowIdx + 1)];
}).toArray()), { index: this.index.slice(rowIdx, rowIdx + 1) });
} else if (typeof colIdx === 'undefined') {
return new DataFrame(_immutable2.default.Map(this.columns.map(function (c) {
return [c, _this5.get(c).iloc(rowIdx, rowIdx + 1)];
}).toArray()), { index: this.index.slice(rowIdx, rowIdx + 1) });
}
throw new TypeError('colIdx must be either integer or Array of integers');
} else if (Array.isArray(rowIdx)) {
if (typeof colIdx === 'number') {
if (colIdx < 0 || colIdx >= this.shape[1]) throw new Error('colIdx out of bounds');
var _getCol = this.columns.get(colIdx);
return new DataFrame(_immutable2.default.Map([[_getCol, this.get(_getCol).iloc(rowIdx[0], rowIdx[1])]]), { index: this.index.slice(rowIdx[0], rowIdx[1]) });
} else if (Array.isArray(colIdx)) {
if (colIdx.length !== 2) throw new Error('colIdx must be length 2 (start and end positions)');
if (colIdx[1] <= colIdx[0]) throw new Error('colIdx end position cannot be less than or equal tostart position');
if (colIdx[0] < 0 || colIdx[1] > this.shape[1]) throw new Error('colIdx position out of bounds');
return new DataFrame(_immutable2.default.Map(_immutable2.default.Range(colIdx[0], colIdx[1]).map(function (idx) {
var getCol = _this5.columns.get(idx);
return [getCol, _this5.get(getCol).iloc(rowIdx[0], rowIdx[1])];
}).toArray()), { index: this.index.slice(rowIdx[0], rowIdx[1]) });
} else if (typeof colIdx === 'undefined') {
return new DataFrame(_immutable2.default.Map(this.columns.map(function (c) {
return [c, _this5.get(c).iloc(rowIdx[0], rowIdx[1])];
}).toArray()), { index: this.index.slice(rowIdx[0], rowIdx[1]) });
}
throw new TypeError('colIdx must be either integer or Array of integers');
}
throw new TypeError('rowIdx must be either integer or Array of integers');
}
}, {
key: 'head',
value: function head() {
var n = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10;
return this.iloc([0, n]);
}
}, {
key: 'tail',
value: function tail() {
var n = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10;
return this.iloc([this.length - n, this.length]);
}
}, {
key: '_assertColumnExists',
value: function _assertColumnExists(col) {
if (!this.columnExists(col)) throw new Error('Column ' + col + ' not in DataFrame');
}
}, {
key: 'columnExists',
value: function columnExists(col) {
return this.columns.indexOf(col) >= 0;
}
}, {
key: 'get',
value: function get(columns) {
var _this6 = this;
if ((typeof columns === 'string' || typeof columns === 'number') && this.columnExists(columns)) return this._data.get(columns);else if (Array.isArray(columns) || columns instanceof _immutable2.default.List || columns instanceof _immutable2.default.Seq) {
columns.forEach(function (c) {
if (!_this6.columnExists(c)) throw new Error('KeyError: ' + c + ' not found');
});
return new DataFrame(_immutable2.default.Map(columns.map(function (c) {
return [c, _this6.get(c)];
})), this.kwargs);
}
throw new Error('KeyError: ' + columns + ' not found');
}
}, {
key: 'where',
value: function where(other, op) {
if (!Array.isArray(other) && !(other instanceof _immutable2.default.List) && !(other instanceof _series2.default) && !(other instanceof DataFrame)) {
return new DataFrame(_immutable2.default.Map(this._data.mapEntries(function (_ref) {
var _ref2 = (0, _slicedToArray3.default)(_ref, 2),
k = _ref2[0],
v = _ref2[1];
return [k, v.where(other, op)];
})));
} else if (Array.isArray(other) || other instanceof _series2.default || other instanceof _immutable2.default.List) {
if ((Array.isArray(other) || other instanceof _series2.default) && other.length !== this.length) throw new Error('Array or Series must be same length as DataFrame');
if (other instanceof _immutable2.default.List && other.size !== this.length) throw new Error('Immutable List must be same size as DataFrame');
return new DataFrame(_immutable2.default.Map(this._data.mapEntries(function (_ref3) {
var _ref4 = (0, _slicedToArray3.default)(_ref3, 2),
k = _ref4[0],
v = _ref4[1];
return [k, v.where(other, op)];
})));
} else if (other instanceof DataFrame) {
if (!other.shape.equals(this.shape)) throw new Error('DataFrame must have the same shape');
return new DataFrame(_immutable2.default.Map(this._data.mapEntries(function (_ref5, idx) {
var _ref6 = (0, _slicedToArray3.default)(_ref5, 2),
k = _ref6[0],
v = _ref6[1];
return [k, v.where(other.get(other.columns.get(idx)), op)];
})));
}
throw new Error('Unsupported comparison value, or non-matching lengths');
}
}, {
key: 'eq',
value: function eq(other) {
return this.where(other, function (a, b) {
return a === b;
});
}
}, {
key: 'gt',
value: function gt(other) {
return this.where(other, function (a, b) {
return a > b;
});
}
}, {
key: 'gte',
value: function gte(other) {
return this.where(other, function (a, b) {
return a >= b;
});
}
}, {
key: 'lt',
value: function lt(other) {
return this.where(other, function (a, b) {
return a < b;
});
}
}, {
key: 'lte',
value: function lte(other) {
return this.where(other, function (a, b) {
return a <= b;
});
}
}, {
key: 'merge',
value: function merge(df, on) {
var how = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'inner';
return mergeDataFrame(this, df, on, how);
}
}, {
key: 'to_csv',
value: function to_csv() {
var _this7 = this;
var csvString = '';
this.columns.forEach(function (k) {
csvString += k + ',';
});
csvString += '\r\n';
var updateString = function updateString(idx) {
var s = '';
_this7.columns.forEach(function (k) {
s += _this7.get(k).iloc(idx) + ',';
});
return s;
};
for (var idx = 0; idx < this.length; idx += 1) {
csvString += updateString(idx);
csvString += '\r\n';
}
return csvString;
}
}, {
key: 'to_excel',
value: function to_excel(excel_writer) {
var sheetName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'Sheet1';
var download = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
var kwargs = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : { index: true };
throw new Error('to_excel not yet implemented');
}
}, {
key: 'to_json',
value: function to_json() {
var _this8 = this;
var kwargs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { orient: 'columns' };
var ALLOWED_ORIENT = ['records', 'split', 'index', 'values', 'columns'];
var orient = 'columns';
if (typeof kwargs.orient !== 'undefined') {
if (ALLOWED_ORIENT.indexOf(kwargs.orient) < 0) throw new TypeError('orient must be in ' + ALLOWED_ORIENT.toString());
orient = kwargs.orient;
}
var json = void 0;
switch (orient) {
case 'records':
return this.values.map(function (row) {
var rowObj = {};
row.forEach(function (val, idx) {
rowObj[_this8.columns.get(idx)] = val;
});
return rowObj;
}).toArray();
case 'split':
return {
index: this.index.toArray(),
columns: this.columns.toArray(),
values: this.values.toJS()
};
case 'index':
json = {};
this.values.forEach(function (row, idx) {
var rowObj = {};
row.forEach(function (val, idx2) {
rowObj[_this8.columns.get(idx2)] = val;
});
json[_this8.index.get(idx)] = rowObj;
});
return json;
case 'values':
return this.values.toJS();
case 'columns':
json = {};
this.columns.forEach(function (c) {
json[c] = _this8.get(c).to_json({ orient: 'index' });
});
return json;
default:
throw new TypeError('orient must be in ' + ALLOWED_ORIENT.toString());
}
}
}, {
key: 'sum',
value: function sum() {
var _this9 = this;
var axis = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
if (axis === 0) {
return new _series2.default(this.columns.toArray().map(function (k) {
return _this9.get(k).sum();
}), { index: this.columns.toArray() });
} else if (axis === 1) {
return new _series2.default(_immutable2.default.Range(0, this.length).map(function (idx) {
return _this9.values.get(idx).reduce(function (s, k) {
return s + k;
}, 0);
}).toList(), { index: this.index });
}
throw new _exceptions.InvalidAxisError();
}
}, {
key: 'mean',
value: function mean() {
var _this10 = this;
var axis = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
if (axis === 0) {
return new _series2.default(this.columns.toArray().map(function (k) {
return _this10.get(k).mean();
}), { index: this.columns.toArray() });
} else if (axis === 1) {
return new _series2.default(_immutable2.default.Range(0, this.length).map(function (idx) {
return _this10.values.get(idx).reduce(function (s, k) {
return s + k / _this10.columns.size;
}, 0);
}).toList(), { index: this.index });
}
throw new _exceptions.InvalidAxisError();
}
}, {
key: 'std',
value: function std() {
var _this11 = this;
var axis = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
if (axis === 0) {
return new _series2.default(this.columns.toArray().map(function (k) {
return _this11.get(k).std();
}), { index: this.columns.toArray() });
} else if (axis === 1) {
return this.variance(axis).map(function (v) {
return Math.sqrt(v);
});
}
throw new _exceptions.InvalidAxisError();
}
}, {
key: 'variance',
value: function variance() {
var _this12 = this;
var axis = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
if (axis === 0) {
return new _series2.default(this.columns.toArray().map(function (k) {
return _this12.get(k).variance();
}), { index: this.columns.toArray() });
} else if (axis === 1) {
var means = this.mean(axis).values;
return new _series2.default(_immutable2.default.Range(0, this.length).map(function (idx) {
return _this12.values.get(idx).reduce(function (s, k) {
var diff = k - means.get(idx);
return s + diff * diff / (_this12.columns.size - 1);
}, 0);
}).toArray(), { index: this.index });
}
throw new _exceptions.InvalidAxisError();
}
}, {
key: '_pairwiseDataFrame',
value: function _pairwiseDataFrame(func) {
var valArray = [];
for (var idx1 = 0; idx1 < this.columns.size; idx1 += 1) {
valArray.push({});
var ds1 = this.get(this.columns.get(idx1));
for (var idx2 = idx1; idx2 < this.columns.size; idx2 += 1) {
var col2 = this.columns.get(idx2);
var ds2 = this.get(col2);
valArray[idx1][col2] = func(ds1, ds2);
}
}
for (var _idx = 0; _idx < this.columns.size; _idx += 1) {
var col1 = this.columns.get(_idx);
for (var _idx2 = _idx + 1; _idx2 < this.columns.size; _idx2 += 1) {
var _col = this.columns.get(_idx2);
valArray[_idx2][col1] = valArray[_idx][_col];
}
}
return new DataFrame(valArray, { index: this.columns.toList() });
}
}, {
key: 'cov',
value: function cov() {
return this._pairwiseDataFrame(function (ds1, ds2) {
return ds1.cov(ds2);
});
}
}, {
key: 'corr',
value: function corr() {
var corrFunc = function corrFunc(ds1, ds2) {
return ds1.values === ds2.values ? 1 : ds1.corr(ds2);
};
return this._pairwiseDataFrame(corrFunc);
}
}, {
key: 'diff',
value: function diff() {
var _this13 = this;
var periods = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
var axis = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
if (typeof periods !== 'number' || !Number.isInteger(periods)) throw new Error('periods must be an integer');
if (periods <= 0) throw new Error('periods must be positive');
if (axis === 0) {
return new DataFrame(_immutable2.default.Map(this.columns.map(function (k) {
return [k, _this13._data.get(k).diff(periods)];
})), { index: this.index });
} else if (axis === 1) {
return new DataFrame(_immutable2.default.Map(this.columns.map(function (k, idx) {
if (idx < periods) return [k, new _series2.default(_immutable2.default.Repeat(null, _this13.length).toList(), { name: k, index: _this13.index })];
var compareCol = _this13.get(_this13.columns.get(idx - periods));
return [k, _this13.get(k).map(function (v, vIdx) {
return v - compareCol.iloc(vIdx);
})];
})), { index: this.index });
}
throw new _exceptions.InvalidAxisError();
}
}, {
key: 'pct_change',
value: function pct_change() {
var _this14 = this;
var periods = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
var axis = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
if (typeof periods !== 'number' || !Number.isInteger(periods)) throw new Error('periods must be an integer');
if (periods <= 0) throw new Error('periods must be positive');
if (axis === 0) {
return new DataFrame(_immutable2.default.Map(this.columns.map(function (k) {
return [k, _this14._data.get(k).pct_change(periods)];
})), { index: this.index });
} else if (axis === 1) {
return new DataFrame(_immutable2.default.Map(this.columns.map(function (k, idx) {
if (idx < periods) return [k, new _series2.default(_immutable2.default.Repeat(null, _this14.length).toList(), { name: k, index: _this14.index })];
var compareCol = _this14.get(_this14.columns.get(idx - periods));
return [k, _this14.get(k).map(function (v, vIdx) {
return v / compareCol.iloc(vIdx) - 1;
})];
})), { index: this.index });
}
throw new _exceptions.InvalidAxisError();
}
}, {
key: 'filter',
value: function filter(iterBool) {
if (!Array.isArray(iterBool) && !(iterBool instanceof _immutable2.default.List) && !(iterBool instanceof _series2.default)) throw new Error('filter must be an Array, List, or Series');
if (Array.isArray(iterBool) && iterBool.length !== this.length) throw new Error('Array must be of equal length to DataFrame');else if (iterBool instanceof _immutable2.default.List && iterBool.size !== this.length) throw new Error('List must be of equal length to DataFrame');else if (iterBool instanceof _series2.default && iterBool.length !== this.length) throw new Error('Series must be of equal length to DataFrame');
return new DataFrame(_immutable2.default.Map(this._data.mapEntries(function (_ref7) {
var _ref8 = (0, _slicedToArray3.default)(_ref7, 2),
k = _ref8[0],
v = _ref8[1];
return [k, v.filter(iterBool)];
})));
}
}, {
key: 'pivot',
value: function pivot(index, columns, values) {
var _this15 = this;
var uniqueVals = _immutable2.default.Map({});
var uniqueCols = _immutable2.default.List([]);
this.index.forEach(function (v, idx) {
var idxVal = _this15.get(index).iloc(idx);
var colVal = _this15.get(columns).iloc(idx);
if (uniqueVals.hasIn([idxVal, colVal])) throw new Error('pivot index and column must be unique');
var val = _this15.get(values).iloc(idx);
uniqueVals = uniqueVals.setIn([idxVal, colVal], val);
if (!uniqueCols.has(colVal)) uniqueCols = uniqueCols.push(colVal);
});
var sortedIndex = uniqueVals.keySeq().sort().toArray();
var sortedColumns = uniqueCols.sort();
var data = _immutable2.default.OrderedMap(sortedColumns.map(function (col) {
return [col, new _series2.default(sortedIndex.map(function (idx) {
var val = uniqueVals.getIn([idx, col]);
return typeof val === 'undefined' ? null : val;
}), { name: col, index: sortedIndex })];
}));
return new DataFrame(data, { index: sortedIndex });
}
}, {
key: 'pivot_table',
value: function pivot_table(index, columns, values) {
var aggfunc = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'sum';
throw new Error('Not implemented');
}
}, {
key: '_cumulativeHelper',
value: function _cumulativeHelper() {
var _this16 = this;
var operation = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _utils.OP_CUMSUM;
var axis = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
if (axis === 0) {
return new DataFrame(_immutable2.default.Map(this.columns.map(function (c) {
return [c, _this16.get(c)._cumulativeHelper(operation)];
})), this.kwargs);
} else if (axis === 1) {
return new DataFrame(this.values.map(function (row) {
return (0, _utils.generateCumulativeFunc)(operation)(row);
}), this.kwargs);
}
throw new Error('invalid axis');
}
}, {
key: 'cumsum',
value: function cumsum() {
var axis = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
return this._cumulativeHelper(_utils.OP_CUMSUM, axis);
}
}, {
key: 'cummul',
value: function cummul() {
var axis = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
return this._cumulativeHelper(_utils.OP_CUMMUL, axis);
}
}, {
key: 'cummax',
value: function cummax() {
var axis = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
return this._cumulativeHelper(_utils.OP_CUMMAX, axis);
}
}, {
key: 'cummin',
value: function cummin() {
var axis = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
return this._cumulativeHelper(_utils.OP_CUMMIN, axis);
}
}, {
key: 'rename',
value: function rename(_ref9) {
var _this17 = this;
var columns = _ref9.columns;
return new DataFrame(_immutable2.default.OrderedMap(this.columns.map(function (prevCol) {
var nextCol = columns.get(prevCol);
if (typeof nextCol === 'undefined') return [prevCol, _this17._data.get(prevCol)];
return [nextCol, _this17._data.get(prevCol).rename(nextCol)];
})), { index: this.index });
}
}, {
key: 'append',
value: function append(other) {
var ignore_index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
return _concatDataFrame([this, other], { ignore_index: ignore_index });
}
}, {
key: 'transpose',
value: function transpose() {
var _this18 = this;
return new DataFrame(_immutable2.default.OrderedMap(this.index.map(function (index, idx) {
return [index, new _series2.default(_this18.values.get(idx), { index: _this18.columns.toList() })];
})));
}
}, {
key: 'kwargs',
get: function get() {
return { index: this.index, columns: this.columns };
}
}, {
key: 'values',
get: function get() {
var _this19 = this;
if (this._values instanceof _immutable2.default.List) return (0, _get3.default)(DataFrame.prototype.__proto__ || Object.getPrototypeOf(DataFrame.prototype), 'values', this);
var valuesList = _immutable2.default.List([]);
var _loop = function _loop(idx) {
valuesList = valuesList.concat([_immutable2.default.List(_this19.columns.map(function (k) {
return _this19._data.get(k).iloc(idx);
}))]);
};
for (var idx = 0; idx < this.length; idx += 1) {
_loop(idx);
}
this._values = valuesList;
return (0, _get3.default)(DataFrame.prototype.__proto__ || Object.getPrototypeOf(DataFrame.prototype), 'values', this);
}
}, {
key: 'columns',
get: function get() {
return this._get_axis(1);
},
set: function set(columns) {
var _this20 = this;
if (!Array.isArray(columns) || columns.length !== this.columns.size) throw new Error('Columns must be array of same dimension');
var nextData = {};
columns.forEach(function (k, idx) {
var prevColumn = _this20.columns.get(idx);
var prevSeries = _this20.get(prevColumn);
nextData[k] = prevSeries.rename(k);
});
this._data = _immutable2.default.Map(nextData);
this.set_axis(1, _immutable2.default.Seq(columns));
}
}, {
key: 'index',
get: function get() {
return this._get_axis(0);
},
set: function set(index) {
var _this21 = this;
this.set_axis(0, (0, _utils.parseIndex)(index, this._data.get(this.columns.get(0)).values));
this._data.mapEntries(function (_ref10) {
var _ref11 = (0, _slicedToArray3.default)(_ref10, 2),
k = _ref11[0],
v = _ref11[1];
v.index = _this21.index;
});
}
}, {
key: 'length',
get: function get() {
var _this22 = this;
return Math.max.apply(Math, [0].concat((0, _toConsumableArray3.default)(this.columns.map(function (k) {
return _this22.get(k).length;
}).toArray())));
}
}]);
return DataFrame;
}(_generic2.default);
exports.default = DataFrame;
var innerMerge = function innerMerge(df1, df2, on) {
var data = [];
var cols1 = (0, _utils.nonMergeColumns)(df1.columns, on);
var cols2 = (0, _utils.nonMergeColumns)(df2.columns, on);
var intersectCols = (0, _utils.intersectingColumns)(cols1, cols2);
intersectCols.count();
var cols1Rename = cols1.map(function (k) {
return intersectCols.size > 0 && intersectCols.indexOf(k) >= 0 ? k + '_x' : k;
});
var cols2Rename = cols2.map(function (k) {
return intersectCols.size > 0 && intersectCols.indexOf(k) >= 0 ? k + '_y' : k;
});
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
var _loop2 = function _loop2() {
var _step$value = (0, _slicedToArray3.default)(_step.value, 2),
row1 = _step$value[0],
_1 = _step$value[1];
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
var _loop3 = function _loop3() {
var _step2$value = (0, _slicedToArray3.default)(_step2.value, 2),
row2 = _step2$value[0],
_2 = _step2$value[1];
var match = true;var _iteratorNormalCompletion3 = true;
var _didIteratorError3 = false;
var _iteratorError3 = undefined;
try {
for (var _iterator3 = on[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
var c = _step3.value;
if (row1.get(c) !== row2.get(c)) {
match = false;
break;
}
}
} catch (err) {
_didIteratorError3 = true;
_iteratorError3 = err;
} finally {
try {
if (!_iteratorNormalCompletion3 && _iterator3.return) {
_iterator3.return();
}
} finally {
if (_didIteratorError3) {
throw _iteratorError3;
}
}
}
if (match) {
var rowData = {};
on.forEach(function (k) {
rowData[k] = row1.get(k);
});
cols1.forEach(function (k, idx) {
rowData[cols1Rename.get(idx)] = row1.get(k);
});
cols2.forEach(function (k, idx) {
rowData[cols2Rename.get(idx)] = row2.get(k);
});
data.push(rowData);
}
};
for (var _iterator2 = df2.iterrows()[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
_loop3();
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
};
for (var _iterator = df1.iterrows()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
_loop2();
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return new DataFrame(data);
};
var outerMerge = function outerMerge(df1, df2, on) {
var data = [];
var cols1 = (0, _utils.nonMergeColumns)(df1.columns, on);
var cols2 = (0, _utils.nonMergeColumns)(df2.columns, on);
var intersectCols = (0, _utils.intersectingColumns)(cols1, cols2);
intersectCols.count();
var matched1 = new Array(df1.length).fill(false);
var matched2 = new Array(df2.length).fill(false);
var _iteratorNormalCompletion4 = true;
var _didIteratorError4 = false;
var _iteratorError4 = undefined;
try {
var _loop4 = function _loop4() {
var _step4$value = (0, _slicedToArray3.default)(_step4.value, 2),
row1 = _step4$value[0],
idx_1 = _step4$value[1];
var _iteratorNormalCompletion5 = true;
var _didIteratorError5 = false;
var _iteratorError5 = undefined;
try {
var _loop5 = function _loop5() {
var _step5$value = (0, _slicedToArray3.default)(_step5.value, 2),
row2 = _step5$value[0],
idx_2 = _step5$value[1];
var match = true;var _iteratorNormalCompletion6 = true;
var _didIteratorError6 = false;
var _iteratorError6 = undefined;
try {
for (var _iterator6 = on[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
var c = _step6.value;
if (row1.get(c) !== row2.get(c)) {
match = false;
break;
}
}
} catch (err) {
_didIteratorError6 = true;
_iteratorError6 = err;
} finally {
try {
if (!_iteratorNormalCompletion6 && _iterator6.return) {
_iterator6.return();
}
} finally {
if (_didIteratorError6) {
throw _iteratorError6;
}
}
}
var rowData = {};
on.forEach(function (k) {
rowData[k] = row1.get(k);
});
cols1.forEach(function (k) {
var nextColName = intersectCols.size > 0 && intersectCols.indexOf(k) >= 0 ? k + '_x' : k;
rowData[nextColName] = row1.get(k);
});
if (match) {
cols2.forEach(function (k) {
var nextColName = intersectCols.size > 0 && intersectCols.indexOf(k) >= 0 ? k + '_y' : k;
rowData[nextColName] = row2.get(k);
});
data.push(rowData);
matched1[idx_1] = true;
matched2[idx_2] = true;
}
};
for (var _iterator5 = df2.iterrows()[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
_loop5();
}
} catch (err) {
_didIteratorError5 = true;
_iteratorError5 = err;
} finally {
try {
if (!_iteratorNormalCompletion5 && _iterator5.return) {
_iterator5.return();
}
} finally {
if (_didIteratorError5) {
throw _iteratorError5;
}
}
}
};
for (var _iterator4 = df1.iterrows()[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
_loop4();
}
} catch (err) {
_didIteratorError4 = true;
_iteratorError4 = err;
} finally {
try {
if (!_iteratorNormalCompletion4 && _iterator4.return) {
_iterator4.return();
}
} finally {
if (_didIteratorError4) {
throw _iteratorError4;
}
}
}
matched1.forEach(function (m, idx) {
if (!m) {
var rowData = {};
on.forEach(function (k) {
rowData[k] = df1.get(k).iloc(idx);
});
cols1.forEach(function (k) {
var nextColName = intersectCols.size > 0 && intersectCols.indexOf(k) >= 0 ? k + '_x' : k;
rowData[nextColName] = df1.get(k).iloc(idx);
});
cols2.forEach(function (k) {
var nextColName = intersectCols.size > 0 && intersectCols.indexOf(k) >= 0 ? k + '_y' : k;
rowData[nextColName] = null;
});
data.push(rowData);
}
});
matched2.forEach(function (m, idx) {
if (!m) {
var rowData = {};
on.forEach(function (k) {
rowData[k] = df2.get(k).iloc(idx);
});
cols1.forEach(function (k) {
var nextColName = intersectCols.size > 0 && intersectCols.indexOf(k) >= 0 ? k + '_x' : k;
rowData[nextColName] = null;
});
cols2.forEach(function (k) {
var nextColName = intersectCols.size > 0 && intersectCols.indexOf(k) >= 0 ? k + '_y' : k;
rowData[nextColName] = df2.get(k).iloc(idx);
});
data.push(rowData);
}
});
return new DataFrame(data);
};
var mergeDataFrame = exports.mergeDataFrame = function mergeDataFrame(df1, df2, on) {
var how = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'inner';
var mergeOn = void 0;
if (typeof on === 'undefined') {
mergeOn = df1.columns.filter(function (c1) {
return df2.columns.filter(function (c2) {
return c1 === c2;
}).size > 0;
});
if (mergeOn.size === 0) throw new Error('No common keys');
} else {
on.forEach(function (col) {
if (!df1.columnExists(col) || !df2.columnExists(col)) throw new Error('KeyError: ' + col + ' not found');
});
mergeOn = on;
}
switch (how) {
case 'inner':
return innerMerge(df1, df2, mergeOn);
case 'outer':
return outerMerge(df1, df2, mergeOn);
default:
throw new Error('MergeError: ' + how + ' not a supported merge type');
}
};
var _concatDataFrame = exports._concatDataFrame = function _concatDataFrame(objs, kwargs) {
if (!(objs instanceof _immutable2.default.List || Array.isArray(objs))) throw new Error('objs must be List or Array');
if (objs instanceof _immutable2.default.List && objs.filter(function (frame) {
return frame instanceof DataFrame;
}).size !== objs.size) throw new Error('Objects must all be DataFrame');else if (Array.isArray(objs) && objs.filter(function (frame) {
return frame instanceof DataFrame;
}).length !== objs.length) throw new Error('Objects must all be DataFrame');
if (Array.isArray(objs) && objs.length === 1) return objs[0];else if (objs instanceof _immutable2.default.List && objs.size === 1) return objs.get(0);
var seriesOrderedMap = _immutable2.default.OrderedMap({});
if (kwargs.axis === 1) {
objs.forEach(function (df) {
df.columns.forEach(function (column) {
var columnExists = seriesOrderedMap.has(column);
seriesOrderedMap = seriesOrderedMap.set(columnExists ? column + '.x' : column, columnExists ? df.get(column).rename(column + '.x') : df.get(column));
});
});
} else {
objs.forEach(function (df) {
var lenSeriesInMap = seriesOrderedMap.keySeq().size === 0 ? 0 : seriesOrderedMap.first().length;
var nextLength = df.length + lenSeriesInMap;
seriesOrderedMap = _immutable2.default.OrderedMap(seriesOrderedMap.entrySeq().map(function (_ref12) {
var _ref13 = (0, _slicedToArray3.default)(_ref12, 2),
column = _ref13[0],
series = _ref13[1];
if (df.columnExists(column)) return [column, (0, _series._concatSeries)([series, df.get(column)], kwargs)];
return [column, (0, _series._concatSeries)([series, new _series2.default(_immutable2.default.Repeat(NaN, df.length).toList(), { index: df.index })], kwargs)];
})).merge(_immutable2.default.OrderedMap(df.columns.filter(function (column) {
return !seriesOrderedMap.has(column);
}).map(function (column) {
return [column, lenSeriesInMap === 0 ? df.get(column) : (0, _series._concatSeries)([new _series2.default(_immutable2.default.Repeat(NaN, nextLength)), df.get(column)], kwargs)];
})));
});
}
return new DataFrame(seriesOrderedMap);
};