SAS Viyaでコードからデータソースを追加する

SAS ViyaはAIプラットフォームです。その元になるデータソースとして、CSVやExcel、HTMLなどを指定できますが、さらに独自のクラス（Pythonのコード）から取り込むこともできます。今回はその手順を紹介します。

## Viyaに接続する

まず SAS Viyaへ接続します。

```py
from swat import *

cashost='localhost'
casport=5570
useremail='dev@sas.com'
userpassword='password'
casauth='~/.authinfo'
conn = CAS(cashost, casport, useremail, userpassword, caslib="casuser")
```

さらにデータハンドリングを行うライブラリを読み込みます。

```python
from swat.cas import datamsghandlers as dmh
```

## クラス（データハンドラー）を用意する

```python
class MyDMH(dmh.CASDataMsgHandler):

    def __init__(self):
        self.data = [
            ('Alfred',  'M', 14, 69,   112.5),
            ('Alice',   'F', 13, 56.5, 84),
            ('Barbara', 'F', 13, 65.3, 98),
            ('Carol',   'F', 14, 62.8, 102.5),
            ('Henry',   'M', 14, 63.5, 102.5),           
        ] 

        vars = [
            dict(name='name', label='Name', type='varchar'),
            dict(name='sex', label='Sex', type='varchar'),
            dict(name='age', label='Age', type='int32'),
            dict(name='height', label='Height', type='double'),
            dict(name='weight', label='Weight', type='double'),
        ]

        super(MyDMH, self).__init__(vars)

    def getrow(self, row):
        try:
            return self.data[row]
        except IndexError:
            return
```

## クラスのインスタンスを作成する

作成したクラスのインスタンスを作成します。

```python
mydmh = MyDMH()
```

## インスタンスを取り込む

作成したインスタンスをSAS Viyaに取り込みます。

```python
conn.addtable(table='myclass', caslib='casuser', replace=True, **mydmh.args.addtable)
```

## データを確認する

取り込んだデータを確認します。

```python
conn.columninfo(table=dict(name='myclass', caslib='casuser'))
```




<div class="cas-results-key"><b>&#167; ColumnInfo</b></div>
<div class="cas-results-body">
<div>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th title=""></th>
      <th title="Column">Column</th>
      <th title="Label">Label</th>
      <th title="ID">ID</th>
      <th title="Type">Type</th>
      <th title="RawLength">RawLength</th>
      <th title="FormattedLength">FormattedLength</th>
      <th title="NFL">NFL</th>
      <th title="NFD">NFD</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>name</td>
      <td>Name</td>
      <td>1</td>
      <td>varchar</td>
      <td>7</td>
      <td>7</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>sex</td>
      <td>Sex</td>
      <td>2</td>
      <td>varchar</td>
      <td>1</td>
      <td>1</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <th>2</th>
      <td>age</td>
      <td>Age</td>
      <td>3</td>
      <td>int32</td>
      <td>4</td>
      <td>12</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <th>3</th>
      <td>height</td>
      <td>Height</td>
      <td>4</td>
      <td>double</td>
      <td>8</td>
      <td>12</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <th>4</th>
      <td>weight</td>
      <td>Weight</td>
      <td>5</td>
      <td>double</td>
      <td>8</td>
      <td>12</td>
      <td>0</td>
      <td>0</td>
    </tr>
  </tbody>
</table>
</div>
</div>
<div class="cas-output-area"></div>
<p class="cas-results-performance"><small><span class="cas-elapsed">elapsed 0.000619s</span> &#183; <span class="cas-memory">mem 0.702MB</span></small></p>




```python
conn.fetch(table=dict(name='myclass', caslib='casuser'), sastypes=False)
```




<div class="cas-results-key"><b>&#167; Fetch</b></div>
<div class="cas-results-body">
<div>
<table border="1" class="dataframe"><caption>Selected Rows from Table MYCLASS</caption>
  <thead>
    <tr style="text-align: right;">
      <th title=""></th>
      <th title="Name">name</th>
      <th title="Sex">sex</th>
      <th title="Age">age</th>
      <th title="Height">height</th>
      <th title="Weight">weight</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>Alfred</td>
      <td>M</td>
      <td>14</td>
      <td>69.0</td>
      <td>112.5</td>
    </tr>
    <tr>
      <th>1</th>
      <td>Alice</td>
      <td>F</td>
      <td>13</td>
      <td>56.5</td>
      <td>84.0</td>
    </tr>
    <tr>
      <th>2</th>
      <td>Barbara</td>
      <td>F</td>
      <td>13</td>
      <td>65.3</td>
      <td>98.0</td>
    </tr>
    <tr>
      <th>3</th>
      <td>Carol</td>
      <td>F</td>
      <td>14</td>
      <td>62.8</td>
      <td>102.5</td>
    </tr>
    <tr>
      <th>4</th>
      <td>Henry</td>
      <td>M</td>
      <td>14</td>
      <td>63.5</td>
      <td>102.5</td>
    </tr>
  </tbody>
</table>
</div>
</div>
<div class="cas-output-area"></div>
<p class="cas-results-performance"><small><span class="cas-elapsed">elapsed 0.00131s</span> &#183; <span class="cas-sys">sys 0.001s</span> &#183; <span class="cas-memory">mem 0.848MB</span></small></p>

## まとめ

この方法を使うと、任意のデータをインスタンスに追加し、SAS Viyaに取り込めます。スクレイピング、社内データ、CSVなどではない不定形データを取り扱う際に使ってみてください。