パイプ区切りの文字列形式のデータベースから取得したデータがあります。 たとえば、「70|71|69|78」です。
それらは非常に長い文字列であり、私はそれらの大規模なデータ セットを持っています。
私がする必要があるのは、文字列を行列 (実際にはベクトル) に変換し、結果のベクトル (最大、95 パーセンタイルなど) に対していくつかの操作を行うことです。
今日のやり方は次のとおりです。
ExampleStr = "70|71|71|72|72|72|72|72|74|74|74|74|74|74|74|74|74|74|75|75|75|75|75|75|75|75|75|75|75|75|75|75|75|75|75|75|75|75|75|76|75|75|76|76|76|75|75|76|76|75|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|77|76|76|76|76|76|76|76|76|76|76|76|76|77|76|76|76|76|76|76|77|76|77|76|77|76|76|77|76|76|76|76|76|76|76|76|77|76|76|76|76|77|77|77|77|76|76|77|77|76|76|76|76|77|76|77|76|76|76|76|76|77|76|76|76|77|77|77|76|76|77|76|76|76|77|76|76|76|76|76|76|77|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|77|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|76|77|76|76|76|76|76|76|76|76|76|77|77|77|77|77|77|77|77|76|77|77|76|76|77|76|76|77|76|77|76|77|76|77|77|77|76|76|76|77|77|76|76|77|76|76|76|76|76|76|76|77|76|76|76|76|76|76|76|77|77|77|76|77|77|76|76|77|76|77|76|77|77|77|77|77|76|76|77|77|77|77|77|77|76|76|77|77|77|77|77|77|76|77|77|77|77|77|77|77|77|77|77|77|76|77|77|77|77|76|77|77|76|76|76|77|77|77|77|77|77|77|77|77|76|76|77|77|77|77|77|77|77|77|77|77|76|76|76|77|77|77|77|77|77|76|77|77|77|76|77|77|77|77|76|76|77|77|77|77|77|77|77|77|77|77|76|77|77|77|77|76|77|77|77|77|77|76|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|76|77|77|76|77|77|77|77|76|77|76|77|77|77|77|77|77|77|77|77|77|76|77|77|77|77|77|77|77|77|77|76|77|77|77|77|77|76|77|77|77|77|77|77|77|77|77|77|77|77|76|77|77|77|77|77|77|77|76|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|76|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|77|76|77|77|77|77|77|77|77|77|77|77|77|77|77|78|78|78|78|78|78|78|78|78|78|77|78|78|77|78|77|77|77|78|78|78|78|78|78|77|78|77|78|78|78|78|78|78|77|78|78|78|77|78|77|78|78|78|77|78|77|78|78|78|78|78|77|78|78|78|78|78|78|78|78|78|77|78|78|78|77|78|78|78|77|77|78|78|78|78|78|78|78|78|78|78|78|78|78|77|77|78|77|77|78|77|78|78|78|78|78|78|78|78|77|77|78|78|78|77|77|78|78|78|78|78|78|78|78|78|78|78|78|77|78|78|78|78|78|78|77|78|78|78|78|77|78|78|78|78|77|77|78|78|78|78|78|78";
t1 = HPTime();
V = parse("["||substitute(ExampleStr,"|",",")||"]") ;
t2 = HPTime();
show((t2-t1)/1000); // takes about 0.9 milliSecそのため、パイプをコンマに置き換えてから、マトリックス ブラケットを前と後ろに付けることで、文字列をマトリックスのように見せます。 その部分は速いです。
ほとんどの時間は Parse() 呼び出しに費やされます。
パイプで区切られた文字列に 775 個の値があるこの例では、上記のコードを実行するのに約 0.9 ミリ秒かかります。
それは非常に短い時間のように思えるかもしれませんが、少なくとも 1 桁短くする必要があります。 私の現在の例では、私のデータ テーブルには 762,000 行のデータがあるからです。
すべての文字列が 775 個の値の長さであるとは限らず、それよりも短いものもあり、すべての反復に 0.9 ミリ秒かかるわけではありませんが、データ テーブルを調べて必要なことを行うのに合計で約 10 分かかりました。これは次のようなものです。
dt << new column("P95_Value");
foreachrow(
V = parse("["||substitute(:StrColumn,"|",",")||"]") ;
:P95_Value = VQuantile(V,0.95);
);VQuantile() 呼び出しは問題ありません。非常に高速です。 ほとんどの時間は parse() 行に費やされます。
この文字列を処理し、理想的には 0.09 ミリ秒以上でベクトルに変換するよりスマートな方法があるのではないかと思いました。
スマートな方法ではないと思いますが、少し高速です。 データが 762,000 行の場合、私のコンピューターでは約 3 分かかります。
Names Default To Here( 1 );
dt = Current Data Table();
t1 = HP Time();
//Subset data table
subset = dt << Subset(
All rows,
Selected columns only( 0 ),
columns( :StrColumn )
);
subset << show window(0);
subset << Begin Data Update;
//Text to Column
subset << Text to Columns( columns( :StrColumn ), Delimiters( "|" ) );
// Change Character to Numeric
subset << delete column(:StrColumn);
col_ref_list = subset << Get Column Reference();
For Each( {col, index}, col_ref_list, col << Data Type( Numeric, Format( "Best", 12 ) ) );
//Get 95% Percentile
mt = subset << get as matrix();
P95_value_mt = Transpose( V Quantile( Transpose( mt ), 0.95 ) );
close(subset,nosave);
//Set Value to Column
dt << New Column( "P95_Value" );
:P95_Value << set values( P95_value_mt );
dt << End Data Update;
t2 = HP Time();
Show( (t2 - t1) / 1000000 );