Azure Machine LearningでExperimentをWeb Service向けにデプロイすると、Web Servicesに対応したExcelワークブックを取得することができます。
ところがExperimentでのモデルの作り方によってはWeb Serviceに対応したExcelが表示されない場合があります。今回は表示されない場合でもExcelワークブックを使うための対処法を紹介します。
1. Web Service Parametersを確認する
1つ目の対処法は、Web Service Parameterを削除する方法です。Training ExperimentでReaderやWriterを使っていた場合、自動的にWeb Service Parametersが設定される場合があります。この状態でWebデプロイ向けのPredictive Experimentを作成すると、Web Service Parametersの設定が残ってしまい、Web Service Parametersが設定されているため、Web Service画面でExcelが表示されません。
Predictive ExperimentでWriterなどでWeb Service Parametersを使用していない場合は、Web InputのWeb Service Parametersを削除した後に、Deploy Web Serviceすることで、Excelが表示されるようになります。
2. ExcelのVBAを編集する
2つ目の対処法はExcelのVBAを編集する方法です。Web Service Parametersが設定されてたWeb Serviceでは、表示されているExceワークブックを使うことができません。Excel内のWeb Service URLやAccess Key、Schemaを変更すれば動きそうな気がしますが、Excel内のVBA(2015/8/24時点)ではWeb Service Parametersに関するデータを送らないため、無効な引数としてエラーが返ってきます。
Web Service Parametersの入力を含めるためにはExcelのVBAを、API version 2に適したデータに修正する必要があります。例として下記のように変更します。Web Service Parametersのパラメータや、入力名は適した名前に変更してください。
Private Function getRequestBody() As String | |
On Error GoTo ErrorsHandler | |
Dim BodyTemplate As String | |
Dim Params As String | |
Dim Values As String | |
Dim Body As String | |
Dim MyBody As String | |
Dim ParamName As String | |
Dim ParamValue As String | |
Dim CurrentJsonParam As String | |
Dim CurrentJsonValue As String | |
BodyTemplate = "{""Inputs"":{""input1"":{""ColumnNames"":[ParamsGoHere],""Values"":[[ValuesGoHere]]}},""GlobalParameters"":{""Path to container, directory or blob"":""test""}}" | |
If activeCellRow = 7 Then | |
Exit Function | |
End If | |
For Counter = 0 To inputParamsNumber - 1 | |
ParamName = Range("B7").Offset(0, Counter).Value | |
ParamValue = Range("B1").Offset(activeCellRow - 1, Counter).Value | |
If Counter <> inputParamsNumber And Counter <> 0 Then | |
Params = Params & "," | |
Values = Values & "," | |
End If | |
CurrentJsonParam = Chr(34) + ParamName + Chr(34) | |
CurrentJsonValue = Chr(34) + ParamValue + Chr(34) | |
Params = Params & CurrentJsonParam | |
Values = Values & CurrentJsonValue | |
Next Counter | |
Body = Replace(Replace(BodyTemplate, "ParamsGoHere", Params), "ValuesGoHere", Values) | |
getRequestBody = Body | |
ErrorsHandler: | |
If Err.Number <> 0 Then | |
MsgBox "getRequestBody: " & Err.Description | |
End If | |
End Function |
Private Sub ExtractResponseBody(Response As String) | |
'This procedure parses the response and writes down the result | |
On Error GoTo ErrorsHandler | |
Dim Results As Variant | |
Dim InnerResults As Variant | |
Response = Replace(Response, "[[", Chr(9)) | |
Response = Replace(Response, Chr(34), "") | |
Response = Replace(Response, "{", "") | |
Response = Replace(Response, "}", "") | |
Response = Replace(Response, "[", "") | |
Response = Replace(Response, "]", "") | |
Results = Split(Response, Chr(9)) | |
If UBound(Results) = 1 Then | |
InnerResults = Split(Results(1), ",") | |
For Counter = 0 To UBound(InnerResults) | |
Range("A1").Offset(activeCellRow - 1, inputParamsNumber + Counter + 1).Value = InnerResults(Counter) | |
Range("A1").Offset(activeCellRow - 1, inputParamsNumber + Counter + 1).Interior.ColorIndex = 15 | |
Range("A1").Offset(activeCellRow - 1, inputParamsNumber + Counter + 1).Font.Name = "Segoe UI" | |
Next Counter | |
End If | |
ErrorsHandler: | |
If Err.Number <> 0 Then | |
MsgBox "ExtractResponseBody: " & Err.Description | |
End If | |
End Sub |
きれいなコードではありませんが、ご参考に。
VBAでJsonを使えないのかな。。。