【Danfo.js】DataFlame.sampleがうまくいかない

ツール Java script

DataFlame.sampleを実行するとインデックスに関するエラーが発生

「初めてのTensorFlow.js」を読み、Danfo.jsを使ってタイタニックのデータ加工に挑戦しました。
2023年11月に購入したのですが、初版(2022年6月27日)の書物ということもあるのか、
Danfo.jsの仕様がだいぶ変更してしまっているようで、Danfo.jsの公式サイトを見ながら四苦八苦しています。

DataFlameをdropNan(空の列を含む行を削除)した後に、
sample(ランダムにサンプリング)をしたところ下記のようなエラーが出てしまいうまくいかなかったので記録に残します。


Error: Invalid row parameter: Specified index 1109 cannot be bigger than index length 1043

実行したコードは下記”①エラーが出てsampleできないコード”です。
sumple( 800 )と800行をサンプリングしようとしているのに、
「エラー: 行パラメータが無効です: 指定されたインデックス 1109 はインデックス長 1043 より大きくすることはできません」
1109番のインデックスを指定してしまっているとエラー出力されてしまいます。

①エラーが出てsampleできないコード


const dfd = require("./node_modules/danfojs-node");


async function ProcessAndExportData() {

  // 訓練用データとテスト用データの読込
  const df_1 = await dfd.readCSV( "./titanic_data/train.csv" );
  const df_2 = await dfd.readCSV( "./titanic_data/test.csv" );


  // データを結合
  const df_1_2 = dfd.concat( { dfList: [ df_1 , df_2 ] , axis: 0 } );


  // データを加工
  // いくつかの列を削除
  df_1_2.drop( { columns: [ "Name" , "PassengerId" , "Ticket" , "Cabin" ] , inplace: true } );

  // 空の列がある行を削除
  const onlyFull = df_1_2.dropNa();

  // Embarked を数値にエンコード
  const encode = new dfd.LabelEncoder();
  encode.fit( onlyFull["Embarked"] );
  onlyFull["Embarked"] = encode.transform( onlyFull["Embarked"].values );

  // Sex を数値にエンコード
  encode.fit( onlyFull["Sex"] );
  onlyFull["Sex"] = encode.transform( onlyFull["Sex"].values );


  // 結合したデータをチェック
  onlyFull.describe().print();
  console.log( onlyFull.shape[ 0 ] );


  // 新たな訓練用データをランダムに抽出
  const newDf_1 = await onlyFull.sample( 800 );
  // newDf_1に含まれないデータをテスト用データに
  const newDf_2 = onlyFull.drop( { index:newDf_1.index , axis: 0 })
  

  // CSVファイルに書き出す
  dfd.toCSV( newDf_1 , { filePath: "./titanic_data/newTrain.csv" } );
  dfd.toCSV( newDf_2 , { filePath: "./titanic_data/newTest.csv" } );

}

ProcessAndExportData();



dropNa(空行を含む行を削除)した後は、resetIndex(インデックスのリセット)をしないと、
正常にsample(ランダムにサンプリング)できないようでした。

下記”②正しいコード”のように、sampleする前にresetIndexを実行しましょう。

サイト上で使える画像色変更ツール【透過・塗りつぶしもできる】
ブラウザ上にて無料で使えるツールです。画像全体を対象に特定の色を選択し置換。領域内を対象に色の塗りつぶし。透過もできる。近似色も対象に色変換を実行することができます。2023年9月20日、バージョン3リリースしました。

②正しいコード(resetIndexを追記)


const dfd = require("./node_modules/danfojs-node");


async function ProcessAndExportData() {


  // 訓練用データとテスト用データの読込
  const df_1 = await dfd.readCSV( "./titanic_data/train.csv" );
  const df_2 = await dfd.readCSV( "./titanic_data/test.csv" );


  // データを結合
  const df_1_2 = dfd.concat( { dfList: [ df_1 , df_2 ] , axis: 0 } );


  // データを加工
  // いくつかの列を削除
  df_1_2.drop( { columns: [ "Name" , "PassengerId" , "Ticket" , "Cabin" ] , inplace: true } );

  // 空の列がある行を削除
  const onlyFull = df_1_2.dropNa();

  // Embarked を数値にエンコード
  const encode = new dfd.LabelEncoder();
  encode.fit( onlyFull["Embarked"] );
  onlyFull["Embarked"] = encode.transform( onlyFull["Embarked"].values );

  // Sex を数値にエンコード
  encode.fit( onlyFull["Sex"] );
  onlyFull["Sex"] = encode.transform( onlyFull["Sex"].values );


  // 結合したデータをチェック
  onlyFull.describe().print();
  console.log( onlyFull.shape[ 0 ] );



  // インデックスをリセット
  onlyFull.resetIndex( { inplace: true } );



  // 新たな訓練用データをランダムに抽出
  const newDf_1 = await onlyFull.sample( 800 );
  // newDf_1に含まれないデータをテスト用データに
  const newDf_2 = onlyFull.drop( { index:newDf_1.index , axis: 0 })

  // CSVファイルに書き出す
  dfd.toCSV( newDf_1 , { filePath: "./titanic_data/newTrain.csv" } );
  dfd.toCSV( newDf_2 , { filePath: "./titanic_data/newTest.csv" } );

}

ProcessAndExportData();


コメント