SPSS Modelerの可変長ファイルノードを、pythonに書き換える


Modelerの可変長ファイルノードを、pythonに書き換えてみます。ここでは、以下の5つのオプションについてフォーカスします。

①ファイルからフィールド名を取得

Modelerでチェックを入れた場合:
入力ファイルの1行目がヘッダーとみなされ、フィールド名として、取得されます。

Modelerでチェックを外した場合:
入力ファイルの1行目もデータとみなされます。フィールド名としては、fieldnが割り当てられます。

注)通常、ヘッダーのないファイルに対してチェックを外しますが、ここでは比較のため、ヘッダーのあるファイルに対してチェックを外しています。

Pythonでの書き換え

pandasの関数read_csv()で、なにも引数を設定しないと、1行目がheaderとして認識され、列名columnsに割り当てられます。

header=Noneとすると、列名columnsに連番が割り当てられます。

列名を明示的に指定したい場合は、namesオプションを使います。0行目は旧列名が入っていますので、その行は読み込まないようにskiprowsオプションを付けました。

②エンコード

Modelerでは、ストリームのデフォルト、システムデフォルト、UTF-8を選択することができます。ストリームのデフォルトでは、以下の画面に示すストリームのオプションで設定したエンコードが利用されます。

ここでは、windows環境で、テスト用にshift_jisのファイルを用意しました。

天気,気温
晴れ,30
曇り,25
雨,20

ストリームのデフォルトでシステムデフォルトを設定した状態で、ストリームのデフォルトを選択した場合、shift_jisのファイルが正しく表示されます。

一方、UTF-8を選択した場合、文字化けが発生します。

次に少し特殊な文字を表示させてみます。

天気,気温
晴れ,30
曇り,25
雨,20
凜,
㌧,
髙,
㈱,
①,

問題なく、出力されました。

注)LinuxやMacのシステムデフォルトはshift_jisではありません。上述の通り、ModelerではシステムデフォルトかUTF-8しか選択できませんので、shift-jisのファイルを扱う際には事前に文字コードの変更などが必要です。

Pythonでの書き換え

エンコーディングは引数encodingで指定します。デフォルトはutf-8で、shift_jisやcp932などを指定できます。

異なるエンコーディングのファイルに対しては、文字化けするのではなく、エラーUnicodeDecodeErrorになります。

encoding="shift_jis" を指定すると、正しく表示されます。

次に、少し特殊な文字ですが、エンコードでshift_jisを指定すると、UnicodeDecodeError となりました。cp932を指定することで、Modeler同様、Pythonでも問題なく出力されることが確認できました。

③フィールド区切り文字

Modelerのデフォルトでは、カンマと改行にチェックが入っています。ここでは、以下のデータを用いて、動作を確認してみます。

天気,気温
晴れ,30
曇り
雨,20

デフォルトの設定では、改行もフィールド区切り文字と設定されているため、フィールド区切り文字として扱われ、以下のように出力されてしまいます。

改行を“行区切り”として扱いたい場合、「行区切り文字は改行文字です」にチェックを入れます。これで、期待通りの出力となりました。

次に、区切り文字として使われることが多い | を使ったデータを試してみます。

天気|気温
晴れ|30
曇り
雨|20

この場合、その他のところに | を入力して、フィールド区切り文字として指定します。期待通りの出力となりました。

Pythonでの書き換え

Pandasの関数read_csv()では、改行は”行区切り”として扱われ、特にオプションの指定はせずに期待通りの出力となりました。

次に区切り文字として | を使ったデータです。read_csv()では、区切り文字の指定は、sepオプションを利用します。

④自動的に日付と時間を認識します

すでに以下の記事で紹介してくださっていますので、ここでの説明は省略します。
SPSS Modelerの日付関連clem関数をPythonで書き換える。

⑤引用符

デフォルトでは、ペアで破棄 が選択されています。この場合、フィールド値は文字列として、引用符なしで保存されます。ここでは、引用符の中に , や改行が含まれるデータで、動作を確認してみます。

天気,気温,コメント
晴れ,30,"すごしやすい 天気,気温 です”
曇り
雨,20,"蒸し暑い
天気です"

一見、期待通りの出力が得られたように見えますが、引用符中の改行が半角スペースとして表示されました。「蒸し暑い 天気です」となっていますが、このデータをそのまま出力させると、改行されて出力されましたので、内部的には改行コードのまま扱われているようです。

Pythonでの書き換え

関数read_csv()でもデフォルト(特にオプションの指定なし)で、引用符は破棄され、引用符なしの文字列として出力されました。ただし、文字列の中で、引用符中の改行は、\r\nとして扱われています。\r\n が不要な場合には、置換する必要があります。ここでは、関数replace()を使用して、\r\nを削除してみました。

(参考にした情報)

pandasでcsv/tsvファイル読み込み(read_csv, read_table)

Python♪Windowsの「Shift JIS」の落とし穴