How to | ZIPファイルからインポートしたデータを整理する方法
Wolfram言語では,使用しているマシンに保存されているZIPファイルをインポートすることに加えて,URLから直接ZIPファイルをインポートすることが可能である.ほとんどの場合,ZIPファイル内のデータを処理することは比較的簡単である.しかし,データがフォーマットされている形式によっては,ここで取り上げる例のように,さらに処理することが必要な場合もある.そのような場合でもWolfram言語では,ほんの数ステップの手順を踏むだけでデータをインポートし処理してからプロットすることができる.
アメリカ国勢調査局は,アメリカと他のすべての国との間の貿易収支についてのデータを管理している.これらのデータは,アメリカ国勢調査局のWebサイトからZIPファイルとしてダウンロードすることができる.ZIPファイルにはデータの入ったスプレッドシートが含まれている.
ZIPファイルからのデータをWolfram言語に取り込むのには,2つの方法が使える.このノートブックの例のようにZIPファイルをそのURLから直接インポートする方法と,ダウンロードし別々に抽出してから,使用しているローカルマシンからスプレッドシートをインポートする方法である.
下の例では,データの一部だけが表示されている.これは,このドキュメントの記憶空間を節約するためである.しかし,自分で実際に別のデータを処理するという場合には,もっと広い範囲のデータを見て,データのどの部分に焦点を当てるかを決定する必要があるだろう.
まずZIPファイルをWebサイトからインポートすることから始める.データ集合は大きすぎてこのドキュメントですべて表示することはできないので,セミコロン(;)を使って出力を非表示にしている:
tmp = First[Import["http://www.census.gov/foreign-trade/balance/country.zip", "*"]];Lengthを使って,スプレッドシートファイルに何枚のワークシートから含まれているかをチェックする:
tmp//Length最初のワークシートにはデータについての基本の記述的情報が含まれている.[[ ]](Partの簡略形)と「;;」(Spanの簡略形)を使って,ワークシートの必要な情報を含む部分をチェックする.
例えば,Partの指定である[[1,6;;]]で,最初のワークシートから第6要素から最終要素までの部分を得る.データを見ると,月名の3文字の短縮形の前に付いているIおよびEはそれぞれ輸入と輸出を表していることが分かる:
tmp[[1, 6 ;; ]]今度は2番目のワークシートを得る.このワークシートには実際の交易データが含まれている.これは大きなデータであるので,ここではShortを使ってその一部だけが表示されている:
Short[tmp[[2]], 10]実際の交易データを含む各リストの第3要素はそのデータを得た国や組織である.特定の国や組織についてデータを取り出して解析する場合は,別の処理を追加して行う必要がある.この例では,Casesのパターンマッチングを使って,中国からの輸入についてのデータを抽出する.
パターンには,最初の2要素がアンダースコアであり,第3要素が"China"であるリストを指定する.アンダースコアは,任意のWolfram言語式を表すことができるパターンオブジェクトである.第4要素には,2つのアンダースコアを一緒に使う.これは1つ以上のWolfram言語式からなる任意の列を表すことができるパターンオブジェクトである:
tmp1 = Cases[tmp[[2]], {_, _, "China", __}];Shortを使ってデータの一部だけを見ることによって,"China"が第3要素であるデータを含むリストが抽出されたことが分かる:
Short[tmp1, 15]1985年のデータだけを見る.Chinaに続く12の要素は,各月の輸入に,そして13番目の要素はこれらの輸入の合計(3861.7)に対応している.3861.7に続く12の要素は,各月の輸出に,そして13番目の要素はこれらの輸出の合計(3855.7)に対応している:
tmp1[[1]]中国の貿易データだけを示すWebサイトに表示されているように,このデータの月ごとの輸出と輸入がまとまるように,データを並び替えることができる.
それぞれの行が第1要素である年で始まるようにする.輸入データは第4から第15の要素,輸出データは第17から第28の要素に対応する:
tmp1[[1, {1, 3 + #, 16 + #}]]& /@ Range[12]後でDateListPlotと使えるように日付を適切なものにする:
{Flatten[{tmp1[[1, {1}]], #}], Sequence@@tmp1[[1, {3 + #, 16 + #}]]}& /@ Range[12]ここまで1985年からのデータだけを例として処理してきたが,ここで定義した関数を使うと,すべてのデータを処理することもできる:
makeData[tmp1_List] := {Flatten[{ToExpression[tmp1[[{1}]]], #}], Sequence@@tmp1[[{3 + #, 16 + #}]]}& /@ Range[12]tradeData = Flatten[makeData /@ tmp1, 1];短縮したデータを見れば,中国に関するデータがすべて処理されたことが分かる:
Short[tradeData, 15]プロットにスタイルを付けるためのオプションをいくつか定義する:
opts = {
Filling -> Axis,
FillingStyle -> ColorData["LakeColors"][1],
FrameLabel -> {None, "$ (× SuperscriptBox[10, -3])"},
ImageSize -> 500,
Joined -> True,
PlotRangePadding -> 0,
PlotStyle -> ColorData[2][4]
};label = TextGrid[{{Style["アメリカの中国からの月別輸入額", FontFamily -> "Arial", 12]}, {Style["出典:アメリカ国勢調査局", FontFamily -> "Arial", 9]}}];DateListPlotを使ってプロットを作成する:
Labeled[DateListPlot[tradeData[[All, {1, 2}]], opts], label]これでアメリカの貿易データに定期的にアクセスし処理する手段が整った.この例では,このドキュメントの目的を考慮して,データ処理はステップごとに細かく分けて行ったが,普段の使用には,これらのステップを単一の関数に組み合せて使うことも可能である.