Gmousse / dataframe-js

No Maintenance Intended
https://gmousse.gitbooks.io/dataframe-js/
MIT License
460 stars 38 forks source link

[BUG] Filtering is not working as expected #131

Open andreyshedko opened 2 years ago

andreyshedko commented 2 years ago

Describe the bug Filtering is not working as expected - sometimes it produces proper results, some time is not. For example, using this function (or any other comparison operator) in the filtering leads to unpredictable results:

const less = (key: string, value: string, row: Row) => {
  console.log(row.get(key) < value, row.get(key), value);
  return row.get(key) < value;
};

In the other place, we are using a filter with our custom function.

df?.filter(less.bind(this, key, value));

Results:

1) Result of comparison 2) Value from the row 3) Value to compare.
false 67.456981 100 // 67.456981 < 100 === false WAT? 
false 105.229483 100
false 18.839348 100
false 79.228270 100
false 75.535063 100
false 112.173642 100
false 16.632894 100
false 17.532905 100
false 18.245026 100
false 94.522464 100
false 174.695347 100
false 122.806919 100
false 189.747314 100
true 0.000000 100
true 0.000000 100
true 0.000000 100
true 0.000000 100
true 0.000000 100
true 0.000000 100
true 0.000000 100
true 0.000000 100
false 123.263836 100
true 0.007850 100
true 0.000000 100
true 0.000000 100
true 0.000000 100
true 0.000000 100
true 0.000000 100

To Reproduce Steps to reproduce the behavior:

  1. Create the dataframe
  2. Use filtering on the dataframe.
  3. See error.

Expected behavior Proper filtering of values.

Desktop (please complete the following information):

Gmousse commented 2 years ago

Hello !

I can't reproduce your issue. I wrote this little script:

const dfjs = require("dataframe-js");

const less = (key, value, row) => {
    console.log(row.get(key) < value, row.get(key), value);
    return row.get(key) < value;
};

const df = new dfjs.DataFrame(
    Array.from(Array(20), (_) => [Math.random() * 300 + 1, 1]),
    ["A", "B"]
);

df.filter(less.bind(null, "A", "100"));

which gives me a coherent result:

false 135.36191545571762 100
false 235.79120556628112 100
false 184.15679375717343 100
true 88.29725309217937 100
false 158.29429647997472 100
true 9.849243976691735 100
false 238.05668318894226 100
true 42.21381998112248 100
false 119.41035658679624 100
false 132.14371883449024 100
true 16.028131873137674 100
true 78.61258347929108 100
false 286.4894545109921 100
false 163.1183359928458 100
false 196.30010960512905 100
true 87.27977594480423 100
true 30.937993159318733 100
false 227.27296092368724 100
true 36.88819885930239 100
true 9.13452659237337 100