python

SASデータセットをpythonで読み込む

最近はSAS単体では実施が難しい解析事例がちょくちょく耳にするようになりました。
特にデータベース研究ですと、データベース操作言語であるSQL、グラフィックス関連や機械学習がらみで必要になるpythonを使う事例が代表的かなと思います。

Rを使う事例もあるようですが、Rでできることは一応SASでもできるのでグラフィックス以外はあまり聞かないかな。

SASはプログラムデータベクトル(PDV)が前提で設計されており、PDVには向かないデータ処理はどうしても他言語との併用が必要になってきます。

私も真面目に勉強しないと・・・

というわけでとりあえずSASデータセットをpythonで読み込み方法を調べてみました。

読み込むデータセット形式

SASデータセットの形式は以下の二つが考えられます。

  • sas7bdat形式
  • xpt形式

どちらもバイナリ形式のファイルなので、デフォルトのpython環境では読み込めません。
必要なパッケージをインストールする必要があります。

sas7bdatは標準のSASデータセット形式ですが、その仕様は完全に公開されているわけではないみたいなので、
SAS Transport 形式(xpt)も試します。xptファイルは仕様が公開されているのでデータの受け渡しはこちらのほうが便利そうです。
実際winnonlinなどのソフトもxptファイルに対応しています。

読み込み方法

今回はsashelpフォルダのclassデータセットをxptファイルに変換し、それをpythonで読み込みます。
以降のデータ加工がしやすいようにpandasのデータフレーム形式に変換します。仕様環境は以下の通り

python: python3.7 (Anaconda)

IDE: jpyter notebook

package:

sas7bdat 2.2.3

pandas 1.2.3

XPTファイルを読み込む

XPTファイルの読み込みはpandasのread_sasメゾットを使用すればそのままデータフレームに変換できます。
現状では書き込みには対応していません。デフォルトのエンコードはISO-8859-1なので、引数でエンコード形式を適宜指定します。

import pandas as pd 
a=pd.read_sas("class.xpt",encoding='UTF-8') 
print(a) print("--変数型-------------------------") 
print(a.dtypes)

実行結果は以下の通りです。

実行結果

SAS7BDATファイルを読み込む

SAS7BDATファイルもpandasでサポートしています。

ただし当然ですがフォーマットは対応していないため、フォーマットを使用している場合はput関数などを使って
新規変数をあらかじめ作成する必要があります。

pd.read_sas("class.sas7bdat" ,encoding="UTF-8")

またSAS7BDATパッケージのto_data_frameメゾットを使用しても同様のことができます。

from sas7bdat import SAS7BDAT as SAS 
b=SAS('class.sas7bdat').to_data_frame() 
print(b) print("--変数型-------------------------") 
print(b.dtypes)

実行結果は以下の通りです。

実行結果

pandasでもsas7bdatでも読み込めましたが、後者はなんか警告が出ますね・・・・
pandasはデータサイエンスのなかでは最も有名なパッケージですので、とりあえずpandasを入れておけばOKのようです。