Wolfram Data Science Platform：
クラウドでのデータサイエンス

MouseOver

MouseOver

Wolfram Research，シニアカーネル開発者

Dillon Tracy

Wolframのクラウドプラットフォーム

Wolfram Programming Cloud：2014年夏リリース

プログラミングプロジェクト，立上げ，プロトタイプ化に最適

その他のプラットフォーム：Mathematica Online

Mathematica Online：2014年9月リリース

デスクトップでの Mathematica の使用をクラウドに拡張

Wolfram Data Science Platform

インポート・解析・発表のワークフローを強調

なぜデータサイエンスをクラウドで行うのか．アクセスのしやすさと到達度

計算可能ドキュメントをクラウド化

API関数が計算へのアクセスを民主化する．

計算可能ドキュメントをクラウド化することによって，結果へのアクセスを民主化する．

「私の上司は Mathematica を使っていません．」という問題を解決することができる．

GraphicsGrid[
Partition[
Tooltip[Button[cdfThumb[#],NotebookOpen[FileNameJoin[{NotebookDirectory[],"./CDF-Examples",#}]],Appearance->Automatic,FrameMargins->10],#]&/@cdfSamples,
3,3,{1,1},{}
],ImageSize->600,Dividers->LightGray
]

Data Science Platformのワークフロー

Wolfram Data Science Platformは，クラウド内のデータソース，アップロードされたデータソース，URLベースのデータソース，外部APIベースのデータソースをサポートする．

あるデータソース：

$url="https://docs.google.com/spreadsheet/pub?key=0An-lvWEXFqTvdElnLUNEOG5QTUJJaUh2aEpabUdIbEE&single=true&gid=0&output=csv";

SemanticImportは，構造データの実体の認識を試みる：

$CurrentData=SemanticImport[$url]

$CurrentData[All,{"date","elec (kWh)"}]//DateListPlot

木

イリノイ州シャンペーンにおける木の種類と分布の一覧：

$src="ChampaignTrees.csv";

Take[Import[$src],4]//Column

d=Quiet@SemanticImport[FileNameJoin[{Directory[],$src}],{"Plant",Automatic,Automatic,Automatic,Automatic,Automatic},
"Rows"
];

Take[d,4]//Grid[#,Dividers->LightGray]&

LinguisticAssistant["Properties"]//Length

LinguisticAssistant["FoliageColor"]

ドキュメント生成器

計算可能なドキュメント，ノートブックテンプレート，およびスケジュールに従って行うタスクが，ドキュメント生成器のもとに集結する．ドキュメント生成器はテンプレートからなり，テンプレート変数を計算するためのスケジュールと論理文を持つこともできる．

以下はテンプレートである：

NotebookPut@Import["ExampleData/BasicTemplate.nb"]

このテンプレートから基本的なドキュメント生成器を作成する：

Quiet@RemoveScheduledTask[CloudObject["WTC/r1"]];

co=CloudDeploy[DocumentGenerator[File["ExampleData/BasicTemplate.nb"],None],"WTC/r1"]

生成器をトリガし，EvaluateScheduledTaskを使って同期実行する． 評価はクラウド内で行われている．

With[{o=co},EvaluateScheduledTask[o]]

生成器をトリガし，RunScheduledTaskを使って非同期に実行する． 評価はクラウド内で行われている．

With[{o=co},RunScheduledTask[o]]

ドキュメント生成器：光熱費レポート

以下は，先ほどの光熱費の例をコードから配備したものである：

Quiet@RemoveScheduledTask[CloudObject["WTC/Utilities-report"]];

co=CloudDeploy[DocumentGenerator[
File["Utilities-report.nb"],
"Monthly"
],CloudObject["WTC/Utilities-report"]
]

生成器をトリガし，非同期で実行する：

With[{o=co},RunScheduledTask[o]]

ドキュメント生成器：株式のレポート

過去 m 日間の n 社のトラック運送会社の株式のパフォーマンスを，前の日の最高取引高とともに毎日報告するドキュメント生成器を作成する．以下はそのテンプレートである：

NotebookPut@Import["ExampleData/StocksTemplate.nb"]

適切なドライバの生成器を配備する：

Clear[driver];
driver[m_Integer, n_Integer]:=Block[{members,reportOn},
members=FinancialData["Trucking","Members"];
reportOn=Take[Reverse[SortBy[
({#,Quiet[FinancialData[#,"Volume",{Yesterday}]]}&/@members)/.{{_,_Missing|_FinancialData}->Sequence[],{t_String,{{_List,i_Integer}}}:>{t,i}},
Last
]],n][[All,1]];
<|
"Start":>DateString[DatePlus[Today,-m],"DateShort"],
"Stocks"->(
<|"Name"->FinancialData[#,"Company"],"Ticker"->#|>&/@reportOn)
|>
]&;

With[{dest="WTC/trucking"},
Quiet@RemoveScheduledTask[CloudObject[dest]];
co=CloudDeploy[DocumentGenerator[
File["ExampleData/StocksTemplate.nb"],
driver[30,5],
DateObject[{_,_,Tuesday|Wednesday|Thursday|Friday|Saturday,1}]
],dest]
]

この報告書の生成には長い時間がかかる可能性があるため，この場合は非同期の評価を行うほうが望ましい：

With[{o=co},RunScheduledTask[o]]

まとめ

Wolfram Data Science Platformは，データを取り込み，ドキュメントを作成するという，インポート・解析・発表のワークフローに適したプラットフォームである．

意味的な解釈により，知識ベースの分析が可能である．

クラウドにおけるデータサイエンスは，普及の問題を解決する．

クラウドのみのワークフローとデスクトップと組み合せたワークフローの両方をサポートする．

Init

Init

SetDirectory[NotebookDirectory[]]

PrependTo[$Path,"./CDF-Examples"];

PrependTo[$Path,"./cdf thumbs"];

cdfSamples=Complement[
Last[FileNameSplit[#]]&/@FileNames["*.cdf","./CDF-Examples"],
{"CDF and ReportGeneration.cdf"}
]

Scan[
(cdfThumb[#]=Import[FileBaseName[#]<>".jpg"];&),
cdfSamples
]

Off[FrontEndObject::notavail]

Cloud connection

(*PacletDirectoryAdd["/Users/dillont/eclipse/workspace/CloudPlatformComponents/apache-tomcat-6.0.41/data/PID-617d2f9e-84de-43c0-b38d-2ac266e8574f/"]*)

FindFile["CloudObject`"]

<<CloudObject`;

$CloudDebug=True;
$CloudDebugLevel=3;

$CloudDebug=False;
$CloudDebugLevel=3;

$CloudBase="http://localhost/";

$CloudBase="http://www.wolframcloud.com/";

$CloudBase="http://www.devel.wolframcloud.com/";

$CloudBase="http://www.test.wolframcloud.com/";

$CloudBase="http://www.wolframcloud.com/";

CDF Thumbs

ClearAll[nb];
Scan[
(nb[#]=Import[#];&),
cdfSamples
]

Clear[makeNbThumb];
makeNbThumb[nb_Notebook,width_:175]:=Module[
{nbObj=NotebookPut[nb],res},
res=makeNbThumb[nbObj,width];
NotebookClose[nbObj];
res
];
makeNbThumb[nbObj_NotebookObject,width_:175]:=Module[
{rs,top},
rs=Rasterize[nbObj,"RasterSize"];
top=With[{res=Rasterize[nbObj]},
If[res===$Failed,
Return[$Failed],
ImageTake[res,1.294*rs[[1]]]
]
];
ImageResize[top,width]
]

ClearAll[cdfThumb]

Scan[
(If[!MatchQ[cdfThumb[#],_Image|$Failed],
cdfThumb[#]=makeNbThumb[nb[#]];
]&),
Take[cdfSamples,6]
]

no=NotebookPut[nb[#]]&@cdfSamples[[12]]

t=(cdfThumb[#]=makeNbThumb[no])&@cdfSamples[[12]]

CreateDirectory["cdf thumbs"]

Export["cdf thumbs/"<>FileBaseName[#]<>".jpg",cdfThumb[#]]&/@cdfSamples

Special Cells

Picture Cell

PicturePrint[expr_,opts:OptionsPattern[Cell]]:=CellPrint[TextCell[expr,"Picture",opts,ShowStringCharacters->False]]

Overview Mouseover

OverviewMouseover[header_,subs_]:=CellPrint@Cell[BoxData[ToBoxes@Mouseover[Framed[Style[header,"OverviewSection"],FrameMargins->{{15,15},{5,5}},BoxFrame->2,FrameStyle->None,RoundingRadius->5],

Evaluate@If[subs=="",Framed[Style[header,"OverviewSection",White],FrameMargins->{{15,15},{5,5}},BoxFrame->2,FrameStyle->None,RoundingRadius->5,Background->m8red[1]],Row[{Framed[Style[header,"OverviewSection",White],FrameMargins->{{15,15},{5,5}},FrameStyle->None,RoundingRadius->5,Background->m8red[1]]," » ",Framed[Style[subs,"OverviewSection"],FrameMargins->{{15,15},{5,5}},FrameStyle->m8red[1],BoxFrame->2,RoundingRadius->5,Background->White]}]]]],"OverviewSection"]

(*MapThread[OverviewMouseover,Transpose[{{"Chapter One","Chapter One topics, …"},{"Chapter Two","Chapter Two topics, …"},{"Chapter Three","Chapter Three topics, …"},{"Chapter Four","Chapter Four topics, …"}}]]*)

Large Overview Mouseover

LargeOverviewMouseover[header_,subs_]:=CellPrint@Cell[BoxData[ToBoxes@Mouseover[Framed[Style[header,"LargeOverviewSection",FontFamily->"Helvetica"],FrameMargins->{{15,15},{5,5}},FrameStyle->None,RoundingRadius->5],

Evaluate@If[subs=="",Framed[Style[header,"LargeOverviewSection",White],FrameMargins->{{15,15},{5,5}},FrameStyle->None,RoundingRadius->5,Background->Orange],Row[{Framed[Style[header,"LargeOverviewSection",{FontFamily->"Helvetica",White}],FrameMargins->{{15,15},{5,5}},FrameStyle->None,RoundingRadius->5,Background->Orange]," » ",Framed[Style[subs,"LargeOverviewSection",FontFamily->"Helvetica"],FrameMargins->{{15,15},{5,5}},FrameStyle->Orange,RoundingRadius->5,Background->White]}]]]],"LargeOverviewSection"]

MapThread[LargeOverviewMouseover,Transpose[{
{"Deployment","Scheduling Tasks, Computable Documents, Document Generators"}
}]
];

DG removal

RemoveScheduledTask[CloudObject["WDS/r1"]]

RemoveScheduledTask[CloudObject["WDS/r2"]]

RemoveScheduledTask[CloudObject["WDS/r3"]]

RemoveScheduledTask[CloudObject["WDS/r4"]]

Scratch

t=Import["ChampaignTrees.csv"];

t=Import["ChampaignTrees-short.csv"];

t[[1]]

Export["ChampaignTrees-short.csv",Prepend[RandomSample[t[[2;;]],500],t[[1]]]
]

Directory[]

t=DocumentGenerators[];

DocumentGeneratorInformation/@t

MapThread[LargeOverviewMouseover,Transpose[{
{"The Cloud","Platforms, Motivation"},
{"Components","Computable Documents, Scheduled Tasks, Document Templating"},
{"Workflow","Utilities, Trees, Stocks ..."}
}]
];