Skip to content

Commit 7af31b0

Browse files
authored
Merge pull request #212 from opensource9ja/fix/iloc-slicing
Fix iloc slicing bug
2 parents ffc598e + 08d16c5 commit 7af31b0

File tree

14 files changed

+282
-124
lines changed

14 files changed

+282
-124
lines changed

danfojs-browser/lib/bundle.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

danfojs-browser/lib/bundle.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

danfojs-browser/src/core/indexing.js

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ export const indexLoc = (ndframe, kwargs) => {
1717
if (Array.isArray(kwargs["rows"])) {
1818

1919
if (kwargs["rows"].length == 1 && typeof kwargs["rows"][0] == "string") {
20-
//console.log("here", kwargs["rows"].length)
2120
if (kwargs["rows"][0].includes(":")) {
2221

2322
let column_split = kwargs["rows"][0].split(":");
@@ -93,16 +92,24 @@ export const indexLoc = (ndframe, kwargs) => {
9392
let column_split = kwargs["columns"][0].split(":");
9493
let start, end;
9594

96-
if (kwargs["type"] == "iloc" || (column_split[0] == "")) {
97-
start = parseInt(column_split[0]) || 0;
98-
end = parseInt(column_split[1]) - 1 === 0 ? 0 : parseInt(column_split[1]) - 1;
99-
} else {
95+
if (kwargs["type"] == "iloc") {
96+
if (column_split[0] == "") {
97+
start = 0;
98+
} else {
99+
start = parseInt(column_split[0]) || 0;
100+
}
101+
102+
if (column_split[1] == "") {
103+
end = parseInt(ndframe.columns.length - 1);
104+
} else {
105+
end = parseInt(column_split[1]) - 1 === 0 ? 0 : parseInt(column_split[1]) - 1;
106+
}
100107

108+
} else {
101109
start = parseInt(ndframe.columns.indexOf(column_split[0]));
102110
end = parseInt(ndframe.columns.indexOf(column_split[1])) - 1;
103111
}
104112

105-
106113
if (typeof start == "number" && typeof end == "number") {
107114

108115
columns = utils.__range(start, end);
@@ -136,7 +143,7 @@ export const indexLoc = (ndframe, kwargs) => {
136143
throw new Error(`Specified row index ${row_val} is bigger than maximum row index of ${max_rowIndex}`);
137144
}
138145

139-
if (Array.isArray(data_values[0])){
146+
if (Array.isArray(data_values[0])) {
140147

141148
let value = data_values[row_val];
142149
let row_data = [];

danfojs-browser/src/index.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import NDframe from "./core/generic";
2+
import * as tf from "@tensorflow/tfjs";
23

34
export { Series } from "./core/series";
45
export { DataFrame } from "./core/frame";
56
export { to_datetime } from "./core/timeseries";
6-
export { read_csv, read_json, read_excel } from "./io/reader";
7+
export { read_csv, read_json, read_excel, read } from "./io/reader";
78
export { merge } from "./core/merge";
89
export { concat } from "./core/concat";
910
export { LabelEncoder, OneHotEncoder } from "./preprocessing/encodings";
@@ -14,6 +15,6 @@ export { Configs } from "./config/config";
1415
export { NDframe };
1516
export { Str } from "./core/strings";
1617
export { Utils } from "./core/utils";
17-
export * as tf from "@tensorflow/tfjs";
18+
export { tf };
1819

19-
export const _version = "0.2.5";
20+
export const _version = "0.2.6";

danfojs-browser/tests/core/frame.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,68 @@ describe("DataFrame", function () {
423423

424424
});
425425

426+
it("column slice starting with 0 and returning a single result works", function () {
427+
let data = {
428+
"Name": [ "Apples", "Mango", "Banana", "Pear" ],
429+
"Count": [ 21, 5, 30, 10 ],
430+
"Price": [ 200, 300, 40, 250 ]
431+
};
432+
let df = new dfd.DataFrame(data);
433+
let sub_df = df.iloc({ rows: [ "2:3" ], columns: [ "0:1" ] });
434+
const result = [ [ "Banana" ] ];
435+
assert.deepEqual(sub_df.values, result);
436+
437+
});
438+
it("column slice with format '0:' works", function () {
439+
let data = {
440+
"Name": [ "Apples", "Mango", "Banana", "Pear" ],
441+
"Count": [ 21, 5, 30, 10 ],
442+
"Price": [ 200, 300, 40, 250 ]
443+
};
444+
let df = new dfd.DataFrame(data);
445+
let sub_df = df.iloc({ rows: [ "2:3" ], columns: [ "0:" ] });
446+
const result = [ [ "Banana", 30, 40 ] ];
447+
assert.deepEqual(sub_df.values, result);
448+
449+
});
450+
it("column slice with format ':2' works", function () {
451+
let data = {
452+
"Name": [ "Apples", "Mango", "Banana", "Pear" ],
453+
"Count": [ 21, 5, 30, 10 ],
454+
"Price": [ 200, 300, 40, 250 ]
455+
};
456+
let df = new dfd.DataFrame(data);
457+
let sub_df = df.iloc({ rows: [ "2:3" ], columns: [ ":2" ] });
458+
const result = [ [ "Banana", 30 ] ];
459+
assert.deepEqual(sub_df.values, result);
460+
461+
});
462+
it("row slice with format ':2' works", function () {
463+
let data = {
464+
"Name": [ "Apples", "Mango", "Banana", "Pear" ],
465+
"Count": [ 21, 5, 30, 10 ],
466+
"Price": [ 200, 300, 40, 250 ]
467+
};
468+
let df = new dfd.DataFrame(data);
469+
let sub_df = df.iloc({ rows: [ ":2" ], columns: [ ":1" ] });
470+
const result = [ [ 'Apples' ], [ 'Mango' ] ];
471+
assert.deepEqual(sub_df.values, result);
472+
473+
});
474+
it("row slice with format '1:' works", function () {
475+
let data = {
476+
"Name": [ "Apples", "Mango", "Banana", "Pear" ],
477+
"Count": [ 21, 5, 30, 10 ],
478+
"Price": [ 200, 300, 40, 250 ]
479+
};
480+
let df = new dfd.DataFrame(data);
481+
let sub_df = df.iloc({ rows: [ ":2" ], columns: [ ":2" ] });
482+
const result = [ [ 'Apples', 21 ], [ 'Mango', 5 ] ];
483+
assert.deepEqual(sub_df.values, result);
484+
485+
});
486+
487+
426488
});
427489

428490

danfojs-browser/tests/core/series.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1223,6 +1223,18 @@ describe("Series", function () {
12231223

12241224
assert.deepEqual(sf.iloc([ "1:4" ]).values, expected_val);
12251225
});
1226+
it("indexing by slicing format ':5' works", function () {
1227+
let data = [ 1, 2, 3, 4, "a", "b", "c" ];
1228+
let sf = new dfd.Series(data);
1229+
let expected_val = [ 1, 2, 3, 4, 'a' ];
1230+
assert.deepEqual(sf.iloc([ ":5" ]).values, expected_val);
1231+
});
1232+
it("indexing by slicing format '2:` works", function () {
1233+
let data = [ 1, 2, 3, 4, "a", "b", "c" ];
1234+
let sf = new dfd.Series(data);
1235+
let expected_val = [ 3, 4, "a", "b", "c" ];
1236+
assert.deepEqual(sf.iloc([ "2:" ]).values, expected_val);
1237+
});
12261238
});
12271239

12281240
describe("append", function () {

danfojs-node/dist/core/indexing.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,18 @@ const indexLoc = (ndframe, kwargs) => {
8787
let column_split = kwargs["columns"][0].split(":");
8888
let start, end;
8989

90-
if (kwargs["type"] == "iloc" || column_split[0] == "") {
91-
start = parseInt(column_split[0]) || 0;
92-
end = parseInt(column_split[1]) - 1 === 0 ? 0 : parseInt(column_split[1]) - 1;
93-
console.log(start, end);
90+
if (kwargs["type"] == "iloc") {
91+
if (column_split[0] == "") {
92+
start = 0;
93+
} else {
94+
start = parseInt(column_split[0]) || 0;
95+
}
96+
97+
if (column_split[1] == "") {
98+
end = parseInt(ndframe.columns.length - 1);
99+
} else {
100+
end = parseInt(column_split[1]) - 1 === 0 ? 0 : parseInt(column_split[1]) - 1;
101+
}
94102
} else {
95103
start = parseInt(ndframe.columns.indexOf(column_split[0]));
96104
end = parseInt(ndframe.columns.indexOf(column_split[1])) - 1;

danfojs-node/dist/index.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,10 @@ exports.tf = exports._version = void 0;
125125

126126
var _generic = _interopRequireDefault(require("./core/generic"));
127127

128+
var tf = _interopRequireWildcard(require("@tensorflow/tfjs-node"));
129+
130+
exports.tf = tf;
131+
128132
var _series = require("./core/series");
129133

130134
var _frame = require("./core/frame");
@@ -151,8 +155,5 @@ var _strings = require("./core/strings");
151155

152156
var _utils = require("./core/utils");
153157

154-
var _tf = _interopRequireWildcard(require("@tensorflow/tfjs-node"));
155-
156-
exports.tf = _tf;
157158
const _version = "0.2.6";
158159
exports._version = _version;

danfojs-node/dist/io/reader.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ const read = async (source, configs = {}) => {
7979
let rows, file;
8080

8181
if ((0, _frictionless.isDataset)(source)) {
82-
console.log("datapackage.json found. Loading Dataset package from Datahub.io");
82+
console.info("datapackage.json found. Loading Dataset package from Datahub.io");
8383
const dataset = await _frictionless.Dataset.load(source);
8484
file = dataset.resources[data_num];
8585
rows = await (0, _streamToArray.default)(await file.rows());

danfojs-node/src/core/indexing.js

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ export const indexLoc = (ndframe, kwargs) => {
1717
if (Array.isArray(kwargs["rows"])) {
1818

1919
if (kwargs["rows"].length == 1 && typeof kwargs["rows"][0] == "string") {
20-
//console.log("here", kwargs["rows"].length)
2120
if (kwargs["rows"][0].includes(":")) {
2221

2322
let column_split = kwargs["rows"][0].split(":");
@@ -93,17 +92,24 @@ export const indexLoc = (ndframe, kwargs) => {
9392
let column_split = kwargs["columns"][0].split(":");
9493
let start, end;
9594

96-
if (kwargs["type"] == "iloc" || (column_split[0] == "")) {
97-
start = parseInt(column_split[0]) || 0;
98-
end = parseInt(column_split[1]) - 1 === 0 ? 0 : parseInt(column_split[1]) - 1;
99-
console.log(start, end);
100-
} else {
95+
if (kwargs["type"] == "iloc") {
96+
if (column_split[0] == "") {
97+
start = 0;
98+
} else {
99+
start = parseInt(column_split[0]) || 0;
100+
}
101+
102+
if (column_split[1] == "") {
103+
end = parseInt(ndframe.columns.length - 1);
104+
} else {
105+
end = parseInt(column_split[1]) - 1 === 0 ? 0 : parseInt(column_split[1]) - 1;
106+
}
101107

108+
} else {
102109
start = parseInt(ndframe.columns.indexOf(column_split[0]));
103110
end = parseInt(ndframe.columns.indexOf(column_split[1])) - 1;
104111
}
105112

106-
107113
if (typeof start == "number" && typeof end == "number") {
108114

109115
columns = utils.__range(start, end);
@@ -137,7 +143,7 @@ export const indexLoc = (ndframe, kwargs) => {
137143
throw new Error(`Specified row index ${row_val} is bigger than maximum row index of ${max_rowIndex}`);
138144
}
139145

140-
if (Array.isArray(data_values[0])){
146+
if (Array.isArray(data_values[0])) {
141147

142148
let value = data_values[row_val];
143149
let row_data = [];
@@ -188,5 +194,5 @@ export const indexLoc = (ndframe, kwargs) => {
188194
rows.forEach((i) => {
189195
final_row.push(ndframe.index[i]);
190196
});
191-
return [ new_data, column_names, final_row ];
197+
return [new_data, column_names, final_row];
192198
};

0 commit comments

Comments
 (0)