GitHub(murata2makoto / 100knocks)に移行した。VS Codeの.NET Interactive Notebooksを使っている。
自作したmergeOnForeignKeyColumnには、転記したカラムのデータ型がすべてobjになってしまうという欠点がある。Deedleのソースを読んで調べてみたが、どうすればこの欠点を直せるのかは分からなかった。
しかし回避する方法はある。一つは、mergeOnForeignKeyColumnの実行後に、カラムのデータ型を設定する方法だ。具体的には、
を実行すればxxの値であるフレームのカラムaのデータ型はobjではなくstringになる。これを繰り返せば、すべてのカラムについてデータ型を設定できる。
もう一つの方法は、一つのカラムだけを転記する関数を設け、その型引数によってカラムのデータ型を指定することだ。この関数を繰り返し実行すれば、すべてのカラムを正しいデータ型で転記できる。具体的には、
は、フレームfr1のカラムfiがforeign keyになっているので、このforeign keyを利用してフレームsfの列を参照し、カラムaからデータ型がstringである値を転記せよという意味だ。データ型がobjではなくstringになっていること、mergeColumnFromFrameOnForeignKeyColumnの最初の型引数でstringと指定されていることに注意。
性能を調べてみると、後者の方がずっと速い。前者はbox/unboxが繰り返し呼ばれているが、後者はその必要がないからだと推測する。
しかし回避する方法はある。一つは、mergeOnForeignKeyColumnの実行後に、カラムのデータ型を設定する方法だ。具体的には、
xx.ReplaceColumn("a", xx.GetColumn<string>("a"))
を実行すればxxの値であるフレームのカラムaのデータ型はobjではなくstringになる。これを繰り返せば、すべてのカラムについてデータ型を設定できる。
もう一つの方法は、一つのカラムだけを転記する関数を設け、その型引数によってカラムのデータ型を指定することだ。この関数を繰り返し実行すれば、すべてのカラムを正しいデータ型で転記できる。具体的には、
mergeColumnFromFrameOnForeignKeyColumn<string,_,_,_> "a" sf "fi" fr1
は、フレームfr1のカラムfiがforeign keyになっているので、このforeign keyを利用してフレームsfの列を参照し、カラムaからデータ型がstringである値を転記せよという意味だ。データ型がobjではなくstringになっていること、mergeColumnFromFrameOnForeignKeyColumnの最初の型引数でstringと指定されていることに注意。
性能を調べてみると、後者の方がずっと速い。前者はbox/unboxが繰り返し呼ばれているが、後者はその必要がないからだと推測する。
let mergeColumnFromFrameOnForeignKeyColumn<'X, 'C, 'R1, 'R2
when 'X : null and 'C: equality and 'R1: equality and 'R2: equality>
(column_to_be_copied: 'C) (indexed_frame: Frame<'R2,'C>)
(key_column: 'C) (primary_frame: Frame<'R1,'C>) =
let srs_references: Series<'R1, 'R2> =
primary_frame |> getCol key_column
let (srs_cols_to_be_merged: Series<_,'X>) =
getCol column_to_be_copied indexed_frame
let new_srs =
srs_references
|> Series.mapValues
(fun x -> if srs_cols_to_be_merged.ContainsKey(x) then
srs_cols_to_be_merged.[x]
else null)
addCol column_to_be_copied new_srs primary_frame
これで一応完了した。読み返して確定稿とするつもり。
#96
#97
#98
#99
#100
#96
let p096() =
use stringWriter = new System.IO.StringWriter()
df_product_full.SaveCsv(stringWriter, includeRowKeys=false)
stringWriter.Close()
use stringReader = new System.IO.StringReader(stringWriter.ToString())
use finalStreamWriter = new System.IO.StreamWriter(new FileStream("h:/home/makoto/100knocks-preprocess/docker/work/data/product_full96Rev.csv", FileMode.Create), Text.Encoding.UTF8)
stringReader.ReadLine() |> ignore
while stringReader.Peek() <> -1 do
finalStreamWriter.WriteLine(stringReader.ReadLine())
#97
Frame.ReadCsv ("h:/home/makoto/100knocks-preprocess/docker/work/data/product_full94.csv", true, true)
|> take 10
#98
Frame.ReadCsv ("h:/home/makoto/100knocks-preprocess/docker/work/data/product_full96Rev.csv", false)
|> take 10
#99
df_product_full.SaveCsv("h:/home/makoto/100knocks-preprocess/docker/work/data/product_full99.tsv", includeRowKeys=false)
#100
Frame.ReadCsv ("h:/home/makoto/100knocks-preprocess/docker/work/data/product_full99.tsv", separators="\t")
|> take 10
記事検索
最新記事
月別アーカイブ
楽天市場