4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

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

##①ファイルからフィールド名を取得
image.png

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

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

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

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

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

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

##②エンコード
image.png

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

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

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

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

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

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

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

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

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

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

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

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

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

##③フィールド区切り文字
image.png

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

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

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

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

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

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

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

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

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

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

すでに以下の記事で紹介してくださっていますので、ここでの説明は省略します。
[SPSS Modelerの日付関連clem関数をPythonで書き換える。][]
[SPSS Modelerの日付関連clem関数をPythonで書き換える。]:https://qiita.com/kawada2017/items/c41f443e5246d331bea1

##⑤引用符
image.png

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

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

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

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

##(参考にした情報)
[pandasでcsv/tsvファイル読み込み(read_csv, read_table)][]
[pandasでcsv/tsvファイル読み込み(read_csv, read_table)]:https://note.nkmk.me/python-pandas-read-csv-tsv/

[Python♪Windowsの「Shift JIS」の落とし穴][]
[Python♪Windowsの「Shift JIS」の落とし穴]:https://snowtree-injune.com/2020/05/15/codec-py003/

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?