【SQL Server 2017 による In-Database Python 分析 チュートリアル】Step 2: PowerShellを使用したSQL Serverへのデータインポート

#### チュートリアルのはじめから
[SQL開発者のための In-Database Python 分析](http://qiita.com/qio9o9/items/2a521f5ac8afe39e1721)

#### 前のステップ
[Step 1: サンプルデータのダウンロード](http://qiita.com/qio9o9/items/d7e38143c19943573882)

#### 次のステップ
[Step 3: データの探索と可視化](http://qiita.com/qio9o9/items/6f08ffab3e0522044445)

# Step 2: PowerShellを使用したSQL Serverへのデータインポート

このステップでは、ダウンロードしたスクリプト`RunSQL_SQL_Walkthrough.ps1`を実行して、チュートリアルに必要なデータベースオブジェクトを作成とサンプルデータのインポートを行います。

## オブジェクト作成とデータロード

ダウンロードしたファイル群の中のPowerShellスクリプト`RunSQL_SQL_Walkthrough.ps1`を実行し、チュートリアル環境を準備します。このスクリプトは次のアクションを実行します：

- SQL Native ClientおよびSQLコマンドラインユーティリティがインストールされていない場合はインストールします。これらは、bcpを使用してデータをバルクロードするために必要です。

- SQL Serverインスタンスにデータベースとテーブルを作成し、そこへデータをバルクロードします。

- さらに複数の関数とストアドプロシージャを作成します。

## スクリプトの実行

1. 管理者としてPowerShellコマンドプロンプトを開き、次のコマンドを実行します。
  
    ```PowerShell:PowerShell
    .\RunSQL_SQL_Walkthrough.ps1
    ```
   次の情報を入力するよう求められます。
    - Machine Learning Services（Python）がインストールされているサーバ名またはアドレス。
    - 作成するデータベースの名前
    - 対象のSQL Serverのユーザー名とパスワード。このユーザは、データベース、テーブル、ストアドプロシージャ、関数の作成権限、およびテーブルへのデータロード権限が必要です。ユーザー名とパスワードを省略した場合は現在のWindowsユーザによってログインします。
    - ダウンロードしたファイル群の中のサンプルデータファイル`nyctaxi1pct.csv`のパス。例えば、`C:\tempPythonSQL\nyctaxi1pct.csv`です。
    
    ![sqldev-python-ps-1-gho9o9.png](https://qiita-image-store.s3.amazonaws.com/0/195839/db34c97d-167e-b897-1bdc-299d6feeed71.png)

    ![sqldev-python-ps-2-gho9o9.png](https://qiita-image-store.s3.amazonaws.com/0/195839/92d4987c-d3f6-ea5f-db2d-6e5c63b64346.png)

2. 上記手順の一環で指定したデータベース名とユーザー名をプレースホルダに置き換えるように、すべてのT-SQLスクリプトが変更されています。
  
3. T-SQLスクリプトによって作成されるストアドプロシージャと関数がデータベース内に作成されていることを確認します。
     
    |**T-SQLスクリプトファイル**|**ストアドプロシージャ／関数**|
    |------|------|
    |create-db-tb-upload-data.sql|データベースと4つのテーブルを作成します。<br /><br />テーブル`nyctaxi_sample`: メインとなるNYC Taxiデータセットが登録されます。ロードされるデータはNYC Taxiデータセットの1％のサンプルです。クラスタ化カラムストアインデックスの定義によってストレージ効率とクエリパフォーマンスを向上させています。<br /><br />テーブル`nyc_taxi_models`: 訓練された高度な分析モデルが登録されます。<br /><br />テーブル`nyctaxi_sample_training`:モデルのトレーニングに使用するデータセットが登録されます。<br /><br />テーブル`nyctaxi_sample_testing`: モデルのテストに使用するデータセットが登録されます。|
    |fnCalculateDistance.sql|乗車位置と降車位置の間の直接距離を計算するスカラー値関数`fnCalculateDistance`を作成します。|
    |fnEngineerFeatures.sql|モデルトレーニング用の特徴値セットを返すテーブル値関数`fnEngineerFeatures`を作成します。|
    |TrainingTestingSplit.sql|nyctaxi_sampleテーブルのデータを、nyctaxi_sample_trainingとnyctaxi_sample_testingの2つに分割するプロシージャ`TrainingTestingSplit`を作成します。|
    |PredictTipSciKitPy.sql|モデルを使用した予測のために、scikit-learnで作成した訓練されたモデルを呼び出すプロシージャ`PredictTipSciKitPy`を作成します。プロシージャは、入力パラメータとしてクエリを受け入れ、入力行に対するスコアを含む数値の列を戻します。|
    |PredictTipRxPy.sql|モデルを使用した予測のために、RevoScalePyで作成した訓練されたモデルを呼び出すプロシージャ`PredictTipRxPy`を作成します。プロシージャは、入力パラメータとしてクエリを受け入れ、入力行に対するスコアを含む数値の列を戻します。|
    |PredictTipSingleModeSciKitPy.sql|モデルを使用した予測のために、scikit-learnで作成した訓練されたモデルを呼び出すプロシージャ`PredictTipSingleModeSciKitPy`を作成します。このストアドプロシージャは新しい観測値を入力として、個々の特徴値はインラインパラメータとして受け取り、新しい観測値に対する予測値を返します。|
    |PredictTipSingleModeRxPy.sql|モデルを使用した予測のために、scikit-learnで作成した訓練されたモデルを呼び出すプロシージャ`PredictTipSingleModeRxPy`を作成します。このストアドプロシージャは新しい観測値を入力として、個々の特徴値はインラインパラメータとして受け取り、新しい観測値に対する予測値を返します。|
    |SerializePlots.sql|データ探索用のプロシージャ`SerializePlots`を作成します。このストアドプロシージャは、Pythonを使用してグラフィックを作成し、グラフオブジェクトをシリアライズします。|
    |TrainTipPredictionModelSciKitPy.sql|scikit-learnによるロジスティック回帰モデルを訓練するプロシージャ`TrainTipPredictionModelSciKitPy`を作成します。このモデルはランダムに選択された60％のデータを使用して訓練され、tipped値（チップをもらうか否か）を予測します。ストアドプロシージャの出力は訓練されたモデルであり、テーブル`nyc_taxi_models`に登録されます。|
    |TrainTipPredictionModelRxPy.sql|RevoScalePyによるロジスティック回帰モデルを訓練するプロシージャ`TrainTipPredictionModelRxPy`を作成します。このモデルはランダムに選択された60％のデータを使用して訓練され、tipped値（チップをもらうか否か）を予測します。ストアドプロシージャの出力は訓練されたモデルであり、テーブル`nyc_taxi_models`に登録されます。|
  
    ![sqldev-python-browsetables1-gho9o9.png](https://qiita-image-store.s3.amazonaws.com/0/195839/0e81ae64-b4a7-3851-65ad-a378836983dd.png)

    > [!NOTE]
    > T-SQLスクリプトはデータベースオブジェクトを再作成しないため、すでに存在する場合にはデータが重複して登録されます。そのため、スクリプトを再実行する場合は事前に既存オブジェクトを削除してください。

## **重要**：一部オブジェクトの再定義

上記の手順を実行後、以下のSQLを実行し一部のオブジェクトを再定義します。
**SQL Server 2017 CTP から SQL Server 2017 RC にバージョンアップした際にRevoScalePyの仕様が変更されたため、その仕様変更に対応させることがこの再定義の主な理由です。**

- [TrainTipPredictionModelSciKitPy](https://github.com/gho9o9/sql-docs/blob/live/docs/advanced-analytics/tutorials/assets/tempPythonSQL/Alter_TrainTipPredictionModelSciKitPy.sql)
- [TrainTipPredictionModelRxPy](https://github.com/gho9o9/sql-docs/blob/live/docs/advanced-analytics/tutorials/assets/tempPythonSQL/Alter_TrainTipPredictionModelRxPy.sql)
- [PredictTipSciKitPy](https://github.com/gho9o9/sql-docs/blob/live/docs/advanced-analytics/tutorials/assets/tempPythonSQL/Alter_PredictTipSciKitPy.sql)
- [PredictTipRxPy](https://github.com/gho9o9/sql-docs/blob/live/docs/advanced-analytics/tutorials/assets/tempPythonSQL/Alter_PredictTipRxPy.sql)
- [PredictTipSingleModeSciKitPy](https://github.com/gho9o9/sql-docs/blob/live/docs/advanced-analytics/tutorials/assets/tempPythonSQL/Alter_PredictTipSingleModeSciKitPy.sql)
- [PredictTipSingleModeRxPy](https://github.com/gho9o9/sql-docs/blob/live/docs/advanced-analytics/tutorials/assets/tempPythonSQL/Alter_PredictTipSingleModeRxPy.sql)

## リンク

#### 次のステップ
[Step 3: データの探索と可視化](http://qiita.com/qio9o9/items/6f08ffab3e0522044445)

#### 前のステップ
[Step 1: サンプルデータのダウンロード](http://qiita.com/qio9o9/items/d7e38143c19943573882)

#### チュートリアルのはじめから
[SQL開発者のための In-Database Python 分析](http://qiita.com/qio9o9/items/2a521f5ac8afe39e1721)

#### 出典
[Step 2: Import Data to SQL Server using PowerShell](https://docs.microsoft.com/en-us/sql/advanced-analytics/tutorials/sqldev-py2-import-data-to-sql-server-using-powershell)

#### 関連項目
[Machine Learning Services with Python](https://docs.microsoft.com/en-us/sql/advanced-analytics/python/sql-server-python-services)