S3は簡単に言うとAWSのクラウドストレージサービスであり、大量にデータを保存することができます。
・Amazon S3 とは何ですか? http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/Welcome.html
今回S3上のデータを集計してグラフにして表示する必要があったため、それについてのスクリプトについて説明します。
作業環境:
macOS Sierra バージョン10.12.5
Python 2.7.10
boto
まずPythonからAWSにアクセスするためにbotoを使う必要があります。
最新バージョンはboto3なのでboto3をインストール。
$ pip install boto3
boto3をインストールしてPythonにインポートしたあと、以下のようにしてS3にアクセスします。さらに取ってきたいバケットの名前を指定してデータを取ってきます。
import boto3
s3_resource = boto3.resource('s3')
bucket = s3_resource.Bucket('bucket_name')
バケットの中にもたくさんデータがあるので、取ってきたいオブジェクトがある場合はfilterで指定します。全部必要な場合はallで取ってきます。
obj = bucket.objects.filter(Prefix='filter_word')
obj = bucket.objects.all()
オブジェクトのデータをダウンロードします。Filenameはローカルで保存するときの名前です。拡張子はS3に置いてあるファイルと同じにします。
bucket.download_file(Key=obj.key, Filename='file_name')
これでS3のデータがダウンロードできました。あとはファイルオープンし、データの形式に従ってリストや辞書を使って集計していきます。
グラフ化
次に集計したデータをグラフ化します。集計したデータは以下のような形式でテキストファイルとして保存しています。時間ごとに名前1〜6のその時の数値を記録しています。
時間1
名前1:数値1-1
名前2:数値1-2
名前3:数値1-3
名前4:数値1-4
名前5:数値1-5
名前6:数値1-6
時間2
名前1:数値2-1
名前2:数値2-2
名前3:数値2-3
名前4:数値2-4
名前5:数値2-5
名前6:数値2-6
時間3
・・・・・・・・・
・・・・・・・・
・・・・・・・
・・・・・
これをグラフ化するのにPandasとmatplotlibを使います。PandasはPyhtonでデータを扱いやすくしてくれるライブラリです。データフレーム形式にすることで簡単にグラフを作成することができます。matplotlibはグラフを描画するのに使います。どちらもpipでインストールしてきます。
データフレームは直接代入しても作れますが、辞書からも作成できるので辞書を作成してからデータフレーム形式にします。集計データのテキストファイルを開き辞書を作り、キーに名前、値に数値をリストにして入れていきます。入力し終わったらデータフレーム形式にしてグラフを作成します。
import pandas as pd
with open('data.txt')as f:
line = f.readline()
while line:
results = line.rstrip()
if ':' in results:
data = results.split(':')
results_dict[data[0]].append(int(data[1]))
line=f.readline()
#辞書をデータフレームにする
my_df = pd.DataFrame.from_dict(results_dict)
#グラフの作成
my_df.plot(title='graph_title')
これでグラフが作成できました。最後にmatplotlibを使って表示します。
import matplotlib.pyplot as plt
plt.show()
その他
もっとお洒落なグラフを作成するのにseabornというライブラリが使えます。
公式ページにいろんなグラフと使い方が載っています。
https://seaborn.pydata.org/examples/index.html