KNIME・EXCEL倉庫

KNIMEやEXCELの備忘録です。

【KNIME】不等号を分離したい

・低分子化合物の生理活性データが纏まっている表で、たまに不等号が入り込んでいることがある。溶解度やアッセイ条件によって濃度の上限または下限が決まっているのが原因なのだけれど、表中に不等号が入り込むと文字列データとして処理されるので、非常に取り扱いが難しくなる。

・そこで、不等号を分離するワークフローを組んでみた。

・サンプルデータは以下の通り。

・事前の条件は以下の通り。

①AIC50とBIC50という二つの数値情報が含まれている。

②単位は別列に分離してあり、それぞれ_unitという名前になっている。

③AIC50とBIC50の列には、不等号・等号があったりなかったり、全角だったり半角だったりする。

④AIC50とBIC50の列を、それぞれ_relation(不等号と等号)と_value(数値情報)という二つの列に分けたい。

⑤不等号と等号は、>、=、<の3種類だけ。≪や≥は想定していない。

・組んだワークフローは以下の通り。窓はそれぞれのTable Creatorノードの出力。どの列が不等号を含む可能性のある(処理対象の)数値データなのか、指定してやる必要がある。

・Futogoメタノードの出力は以下。

・メタノードの中身は以下の通り。

・工程はざっくり以下の通り。

①全部半角に変換。

②処理対象の列から、処理後の列名を作成してLoopとFilterで切り出して変数化。

③String Manipulationで処理しやすいように列名を変更して、処理対象列の最初の一文字を切りだした列と処理対象列から不等号・等号を除いた列を作成。

④処理対象列の最初の一文字が数字の場合は等号に変換。

⑤順番を整えてLoopを返す。

 

終わり。

【KNIME】正規表現を使って文字列を弄りたい

正規表現を使って文字列を弄りたい場面があった。

・例えば、以下の表の数字だけを*に置き換えることを考える。

・String ManipulationノードにregexReplaceという数式がある。regex正規表現のことっぽい。例えば以下のように正規表現で数字を表現することができる。

・出力はこんな感じになった(下図)。

・例えば、11のように2桁の数字を一つの数字として認識させるのであれば、"[0-9]+"と記載すれば良いらしい(下図)。

・正直、正規表現は私のような素人には分かりにくい。よく使う表現(AND、OR、NOTなど)と、よく使う書き方(アルファベット全部は[a-zA-Z]など)を一覧で引っ張ってこれるととても助かるので、参考になりそうなサイトを少し調べてみた。

www.octoparse.jp

 

complesso.jp

 

終わり。

【KNIME】全角と半角を変換したい

・全角と半角が混在している文字列があったとする。

・表記の揺れは小さい方が良いので、KNIMEでこの揺れを半角か全角のどちらかに揃えたいと思ったのだが、やっぱりやり方が分からなかった。

・そこで、Python Scriptノードを使って、Pythonで実装してみた。今回利用したのはmojimojiというPythonライブラリで、詳細は以下を確認して欲しい。

pypi.org

・やることはシンプルで、Pythonの仮想環境中でpip install mojimojiでライブラリをインストールし、KNIMEのPython Scriptノード中でPythonを回した(下図)。

Python Scriptの中身は以下の通り。

#全角を半角にする

import mojimoji

df=input_table_1
df['example']=df['example'].apply(mojimoji.zen_to_han)
output_table_1 = df

 

#半角を全角にする

import mojimoji

df=input_table_1
df['example']=df['example'].apply(mojimoji.han_to_zen)
output_table_1 = df

・カタカナ、数字、アルファベットのそれぞれを変換しないように設定することも可能。

 

・表を丸ごと半角に変換する場合は、以下のような感じで処理すれば良いかも。

import mojimoji

df=input_table_1
for i in range(len(df.columns)):
    df.iloc[:,i]=df.iloc[:,i].apply(mojimoji.zen_to_han)
output_table_1 = df

 

終わり。

 

 

【KNIME】場合分けして処理したい

・先日のワークフローで、条件ごとに処理を変えたい場面があった。

・やり方がよく分からなかったので、Row Splitterで表を条件の数だけカチ割って、それぞれでString ManipulationやMath Formulaで処理させていた。

・調べてみると、Rule Engineというノードひとつでいろいろ条件分けして処理できたので、メモしておく。

・今回やりたいことは、学生がテストで取った点数(下表)をもとに、不可、可、良の判定列を追加するワークフロー。

・表をカチ割って処理するワークフローは以下の通り。

・工程の詳細は省くが、条件を一つ増やすたびにノードを付け加えることになり、どんどんややこしくなる。

・これをRule Engineで実行すると、以下のようになった(右の窓は出力)。

・設定は以下の通り。

・使いこなすと便利そう。

 

終わり。

 

 

 

【KNIME】単位を揃えたい

・化合物の活性情報を弄っていると、単位がmMやμmol/L、mg/Lなど揃っていないことがある。このままでは比較するのに不便なので、単位を揃えるワークフローを組んでみた。

・サンプルデータは以下。ここまでバラバラなことはまずないと思うが、これが一つの単位(nMなど)に揃うと気持ちよさそう。

・手順としては、String ManipulationとMath Formulaを組み合わせて、単位名と数値を変換していくだけ。

・例えば、"μ"と"u"の揺れを"u"に統一したり、全角スペースを半角スペースに変換したり、半角スペースを除去したり、"mol/L"を"M"に変換したり(下図)。

・単位が"g/L"や"g/mL"で終わるものを分離してMに変換したり(下図)。

・"mM"、"uM"、"M"を"nM"に揃えたりしてみた。

・最終的な出力は以下のような感じにした。単位が揃うと気持ちいい。

・ワークフローは以下からダウンロードできると思う。

drive.google.com

 

・動作不良、その他不利益に関して、当方は一切補償しない。

 

終わり。

 

 

 

 

【KNIME】同じ基準でNormalizeしたい

・例えば、学習データでにNormalizeを施してモデルを構築した場合に、テストデータをモデルに適用する前に学習データと同じNormalizeを施したいとする。

・どうすればよいかと調べてみると、Normalizer (Apply)というノードがあった。サンプルのワークフローを組んでみた(下図)。

f:id:choron81:20220410194540p:plain

・左上の窓は「学習ノードなど」の出力、左下の窓は「テストデータなど」の出力、右上の窓は「Normalizeとパラメータの算出」の出力(▲)、右下の窓はNormalizee (Apply)ノードの出力。「テストデータなど」は「学習データなど」の下3つと同じデータなので、同じNormalizeをすると同じ値が返ってくることになる。

・ついでに、Normalizeしたデータをもとに戻すDenormalizerというノードも見つけた(下図)。

f:id:choron81:20220410194833p:plain

 

終わり。

 

【KNIME】アルファベットを含むセルをmissing"?"にしたい

・KNIMEでいろいろ扱っていると、特定の条件を満たすセルのデータを消したくなることがある。例えば、数値データばかりのところに、よくわからないアルファベットを含む文字列が混ざっている場合など。

・こういう場合、文字列を含むセルをmissingにしたいが、KNIMEでのやり方がよく分からなかったので、Python Scriptで実装してみた(下図。左の窓はTable Creatorの出力、右の窓はPython Scriptの出力)。

f:id:choron81:20220409160716p:plain

Python Scriptの中身は以下の通り。Pythonの作法は分からないので、変なところはご容赦いただきたい。

 

df= input_table_1.astype(str)

#アルファベットを含むか否か判別する関数を定義
find_char=lambda x: x.str.contains('[a-zA-Z]' ,na=False)

#アルファベットのTF判別を反転して、表から抽出
output_table_1 = df[~df.apply(find_char)]

 

終わり。