cheap-pandas
Version:
Not a good pandas library to use
191 lines (182 loc) • 5.44 kB
JavaScript
const { shuffle } = require("shuffle-seed");
const { takeNSpace, toFixed4Digit } = require("./lib");
class DataFrame {
constructor(
columns = [],
data = [],
indexes = [],
options = {
printSpace: 20,
customPrintSpaces: [],
}
) {
this.columns = columns;
this.indexes = indexes;
this.is_single_column;
this.printSpace = options.printSpace;
this.customPrintSpaces = options.customPrintSpaces;
if (this.columns.length > 1) {
let arr = [];
for (let i = 0; i < columns.length; i++) {
let col = [];
for (let j = 0; j < data.length; j++) {
col.push(data[j][i]);
}
arr.push(new DataFrame([columns[i]], col, indexes));
}
this.data = arr;
this.is_single_column = false;
} else {
this.data = data;
this.is_single_column = true;
}
}
describe() {}
min() {
let s = `Min Value${this.is_single_column ? "" : "s"}`;
}
columnByName(name) {
if (!this.columns.includes(name)) throw new Error("Such column not Found!");
let columnIndex = this.columns.findIndex((c) => c === name);
return this.data[columnIndex];
}
print() {
if (this.is_single_column) {
console.log(
"_".repeat((1 + this.columns.length) * (this.printSpace + 1)) + "_"
);
let str =
takeNSpace("index", this.printSpace) +
this.columns.map((c) => takeNSpace(c, this.printSpace)).join("") +
"|\n";
str +=
"|" +
"-".repeat((1 + this.columns.length) * (this.printSpace + 1) - 1) +
"|\n";
for (let i = 0; i < this.indexes.length; i++) {
str +=
takeNSpace(this.indexes[i], this.printSpace) +
takeNSpace(this.data[i], this.printSpace) +
"|\n";
}
console.log(str);
} else {
console.log(
"_".repeat((1 + this.columns.length) * (this.printSpace + 1)) + "_"
);
let str =
takeNSpace("index", this.printSpace) +
this.columns.map((c) => takeNSpace(c, this.printSpace)).join("") +
"|\n";
str +=
"|" +
"-".repeat((1 + this.columns.length) * (this.printSpace + 1) - 1) +
"|\n";
for (let i = 0; i < this.indexes.length; i++) {
str +=
takeNSpace(this.indexes[i], this.printSpace) +
this.data
.map((d) => takeNSpace(d.data[i], this.printSpace))
.join("") +
"|\n";
}
console.log(str);
}
}
shuffle(seed) {
if (!seed) {
seed = Math.random();
}
if (!this.is_single_column) {
this.indexes = shuffle(this.indexes, seed);
this.data.forEach((d) => d.shuffle(seed));
} else {
this.data = shuffle(this.data, seed);
}
}
head(n) {
if (isNaN(n)) {
n = 5;
}
if (!this.is_single_column) {
let newDataFrame = new DataFrame([], [], []);
newDataFrame.columns = this.columns;
newDataFrame.data = this.data.map((d) => d.head(n));
newDataFrame.indexes = this.indexes.slice(0, n);
newDataFrame.is_single_column = false;
return newDataFrame;
} else {
let newDataFrame = new DataFrame(
this.columns,
this.data.slice(0, n),
this.indexes.slice(0, n)
);
return newDataFrame;
}
}
tail(n) {
if (isNaN(n)) {
n = 5;
}
if (!this.is_single_column) {
let newDataFrame = new DataFrame([], [], []);
newDataFrame.columns = this.columns;
newDataFrame.data = this.data.map((d) => d.tail(n));
newDataFrame.indexes = this.indexes.slice(
Math.max(0, this.indexes.length - n),
this.indexes.length
);
newDataFrame.is_single_column = false;
return newDataFrame;
} else {
let newDataFrame = new DataFrame(
this.columns,
this.data.slice(
Math.max(0, this.indexes.length - n),
this.indexes.length
),
this.indexes.slice(
Math.max(0, this.indexes.length - n),
this.indexes.length
)
);
return newDataFrame;
}
}
groupby(column) {
const columnIndex = this.columns.findIndex((c) => c === column);
if (columnIndex === -1) throw new Error("Invalid Column");
let set = new Set();
let data = this.data[columnIndex].data;
for (let i = 0; i < data.length; i++) {
set.add(data[i]);
}
if (set.size > 300) {
throw new Error("There are too many");
}
if (this.is_single_column) {
} else {
let groupObject = {};
for (let i = 0; i < this.indexes.length; i++) {
let element = this.data[columnIndex].data[i];
if (!groupObject[element]) {
groupObject[element] = new DataFrame(this.columns, [], []);
groupObject[element].data = this.head(0).data;
}
groupObject[element].data.forEach((d, index) =>
d.data.push(this.data[index].data[i])
);
groupObject[element].indexes.push(this.indexes[i]);
}
return groupObject;
}
}
getRow(n) {
if (this.is_single_column) {
return this.data[n - 1];
} else {
return this.data.map((d) => d.getRow(n));
}
}
}
module.exports = DataFrame;