現在Viyaサーバーに対してpythonを使用してデータ加工やモデリングを行っています。
ライブラリーはswatを使用しています。
モデリング前にデータを加工処理(条件でデータを絞り込む、加工変数を作成するなど)したいのですが、
どのような手順を踏むとよいでしょうか?
①データを一旦Pandasのデータフレームで加工処理した後、CASテーブルにアップロード ⇒ モデリング
②データを一旦SASデータフレームで加工処理した後、CASテーブルにアップロード ⇒ モデリング
③データをCASテーブルにアップロードし、CASテーブル上で加工処理 ⇒ モデリング
③だとローカルデータでの処理が不要で大容量データでも高速で加工処理ができるメリットがあると考えるのですが、
③でうまくできず、悩んでいます。
Viyaのメリットを一番利用できる方法を選択したいと思っています。
②の方法で行ったサンプルpgmを貼っておきます。
***
import swat
import pandas as pd
conn = swat.CAS('xxxx',5570,'xxxx','xxxx,caslib="casuser")
print(conn)
data = pd.read_csv('IRIS.csv')
#データ型を変換SAS DataFrameに変換する
sasData = swat.SASDataFrame(data)
#条件で絞り込む
sasData2 = sasData[sasData['Species'] == 'Versicolor']
#CASサーバー上に保存するときのファイル名
fileNameOnCas = "MyPythonDataSASDemo01"
#CASテーブルにデータをアップロード
conn.upload_frame(sasData2, casout = dict(name = fileNameOnCas, replace = True))
よろしくお願いいたします。
以下のようにqueryメソッドやgtメソッドなどを利用するのはいかがでしょうか。
>>> tbl=conn.read_csv('/home/sas/test.csv',casout={'name':'class','replace':'true'}, names=('sex', 'age', 'name', 'height', 'weight'))
>>> tbl2=tbl.query('sex="男子"')
>>> tbl2['flg']=tbl2.age.gt(12)
>>> tbl2.head()
またはcomputedVarsとcomputedVarsProgramを用いればより複雑な処理が可能になると思われます。
>>> tbl.computedVars=["flg"]
>>> tbl.computedVarsProgram = \
... "if age gt 12 then flg=1; else flg=0;"
>>> tbl.head()
yu_sas様
ご教授ありがとうございます。
頂いた方法で試してみましたが、グローバルテーブルとしてViyaへ保存すると、
せっかく指定した条件や加工変数が消えてしまいます。
原因はお分かりになりますでしょうか?
tbl2=tbl.query('Species="Versicolor"')
tbl2['flg']=tbl2.SepalWidth.gt(30)
tbl2.head()
#グローバルテーブル
promoteTable = conn.table.promote(caslib='CASUSER', drop=True, targetLib = 'CASUSER', name = tbl2)
もっとスマートな方法があるかもしれませんが、一度sashdatなどに保存し再びロードするのが
一案ではないかと思います。
>>> res=conn.table.save(table=tbl2,name='class2')
>>> newtbl=conn.load_path(path='class2.sashdat',casout={'caslib':'CASUSER(sas)','name':'CLASS2','promote':'true'})
yu_sas様
ご教授ありがとうございます。
ひと手間必要であるということですね。
尚、以下のようにappend処理ができない現象は、
プロモートできない現象と何か関係はあるのでしょうか?
check変数を作成しているつもりですが、存在しないと怒られてしまいます。
尚、教えていただいた方法で一度sashdatへ保存、再度CASテーブルにロードし直すと正常にappend処理ができます。
いまいちCASテーブルの仕様について理解できていないようです、、
iris_1のCASテーブルに対してcheck変数が作成できていないということでしょうか?
iris = pd.read_csv('iris.csv')
# No.1
iris_1 = conn.upload_frame(iris, casout = dict(name='iris_1',replace=True))
iris_1.params.where = 'SepalWidth > 33'
iris_1.params.computedVars = ["check"]
iris_1.params.computedVarsProgram = "check = SepalLength + SepalWidth;"
# No.2
iris_2 = conn.upload_frame(iris, casout = dict(name='iris_2',replace=True))
iris_2.params.where = 'SepalWidth <= 33'
iris_2.params.computedVars = ["check"]
iris_2.params.computedVarsProgram = "check = SepalLength + SepalWidth;"
# 結合処理
iris_1.append(iris_2,casout='iris_1')
***
[ ERRORメッセージ ]
ERROR: 列 check はテーブル IRIS_1 に存在しません。
ERROR: エラーのため、アクションを中止しました。
確認してみますので、お待ち頂ければと思います。
yu_sas様
よろしくお願いします。
ご参考情報です。
SWATの使い方に関しての情報源です。
こちらで、SWATを使用した使い方を紹介しています。
また、すでにお持ちかもしれませんが、もう少し網羅的にはこちらの本があります。
https://www.amazon.co.jp/SAS-Viya-Perspective-Kevin-Smith/dp/1629602760
ご参考になれば幸いです。
一つ教えてほしいのですが、chie_sas様は、今回③で実現するに際して、SAS言語を使用することに興味はおありでしょうか?
それともあくまでもpythonのシンタックスで実施したいとお考えでしょうか。
このような質問している背景は以下の通りです。
他のViyaユーザー様の中にも、それまでpythonでデータ加工をしていたが、「分析用データ加工」に特化した場合、pandasがあるものの汎用プログラミング言語を使用するよりも、SASの表形式データ加工専用言語を使用した方が、非常に効率がいいということで、その部分に関しては、pythonではなく、SAS言語を使用しているケースがあります。
よろしくお願いします。
izumi123 様
ご連絡ありがとうございます。
SASコードにあまり詳しくないpythonユーザーがswatを利用してどれほどデータの加工処理ができるか、
pandasのデータフレームのような扱いで加工処理ができるのか、
検証しております。
こういった背景があるので、なるべくSASコードに頼らずに加工処理をしたい次第です。
加工処理が複雑化される、分かりずらい、SASコードに頼らなければいけない部分が多い、などという結果が得られれば、
従来通りpandasのデータフレームにて加工処理となりそうです。
今までの感触としては、
加工処理の部分はCASテーブルをデータフレームのように扱うのは難しく、
CASテーブルの概念や操作知識はどうしても必要になるのではないかと感じています。
お待たせしています。
パラメータComputedVarsやComputedVarsProgramなどは、クライアント側のビューのようなものであり、サーバ上のテーブルには影響していません。そのため、appendを実行しようとするとComputedVarsの変数は実体となるデータがないため、エラーとなるものと考えられます。
上記のことから考えると、先にappendをしてからComputedVarsを作成するか、すでにお試しされているように、作成した変数を持つCASテーブルを実体化する必要があると思われます。以前sashdatとして保存し実体化させる方法をご案内しましたが、partitionアクションを用いることで、直接CASテーブルとして出力が可能でした。こちらもお試し頂ければと思います。
>>> tbl2.partition(casout='class2')
>>> newtbl2=conn.CASTable('class2')
yu_sas様
お返事が遅くなり失礼いたしました。
ご回答ありがとうございます。
partitionアクションで実体化させる方法で行いたいと思います。
色々とご親切にありがとうございました。
@chie_sas 様、
最初にご質問に「Viyaのメリットを一番利用できる方法」とあったため、何か解決したい大規模処理があるものと想定し、その課題解決のための最良と思われる手段の一つとして、SASプログラミングの選択肢をご紹介しましたが、そうではなく、pythonを前提とし、単純に操作機能の確認ということであれば、使い分けの指針として次のようにとらえると良いと思います。
python+swat+casは、例えば、python+sparkと同じようなことになります。
もともとViyaすわなちpython+swat+casは、python+pandasを置き換えるものではなく、最初のご質問にあるように、python+pandasでは現実的でない大規模処理をより高速に、スケーラブルに行いたいときにご利用いただくと良いものになります。ですので、もし大規模処理をするという前提の場合には、python+swat+casとpython+sparkを比較されると良いと思います。
ですので、python+pandasでパフォーマンスやスケーラビリティに課題がないということであれば、従来通りpython+pandasをお使いただければ良いと思います。そうではなく、python+pandasでは実現が困難な大規模処理を行いたいときには、その課題解決を目的として、python+swat+casをご利用いただくと良いと思います。その際には、pythonプログラミングとはいえ、大きくないデータを想定して作られているpandasとは異なり、大規模データを想定したアーキテクチャのため、swat+cas固有の知識が多少なりとも必要になります。
swat+cas利用時の操作方法全般を知りたい場合には、上でもご紹介しましたが、以下を参照していただくと全体像が分かりやすいと思います。
■こちらで、SWATを使用した使い方を、最小機能単位で紹介しています。
■また、すでにお持ちかもしれませんが、網羅的にはこちらの本があります。
https://www.amazon.co.jp/SAS-Viya-Perspective-Kevin-Smith/dp/1629602760
■CASTable vs. DataFrame vs. SASDataFrame
こちらはリファレンスそのものですが、
https://sassoftware.github.io/python-swat/table-vs-dataframe.html
ここにもこのように記載されています。
「CASTable objects support much of the pandas.DataFrame API. However, since CAS tables can contain enormous amounts of data that wouldn’t fit into the memory of a single machine, there are some differences in the way the APIs work. 」
ここからもわかるように、大規模データを扱う際には固有の考慮がされたアーキテクチャーになるため、データの操作の仕方にも固有のものが出てくるということになります。
ご検討のご参考になれば幸いです。
お返事が遅くなり失礼いたしました。
様々な助言ありがとうございます。
既存のpythonコーディングスキルでで加工処理等ができるという前提の元、今回色々と調べてみましたが、
やはり固有の知識はどうしても必要になりそうですね。
そして複雑な加工処理はやはりpandasの方が良いなと感じています。(series単位での処理ができる)
変数追加、条件指定、テーブルマージ、ソート、など簡易的な加工の際にpython+swat+casを利用したいと思います。
とは言うものの、大容量データの処理の際の選択肢としてpython+swat+casがある、という認識で、
場面に応じて使い分けをしたいと思います。
ありがとうございました。
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!