{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Movesのデータを分析する\n", "\n", "## 1. 下準備" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# JupyterNotebookでデータ分析するときのの定番\n", "import numpy as np\n", "import pandas as pd\n", "from pandas import Series,DataFrame\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "\n", "# 今回使用\n", "import requests\n", "import secret # INIファイルの読み書き " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# アクセストークンをINIファイルから取得\n", "access_token = secret.readAccessToken()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# 取得したアクセストークンの中身\n", "print(access_token)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. ユーザープロフィールの取得" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "api_url = 'https://api.moves-app.com/api/1.1/user/profile?access_token=' + access_token \n", "requests.get(api_url).json()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. 2017年4月1ヶ月分のデータを取得\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "api_url = 'https://api.moves-app.com/api/1.1/user/summary/daily/201704?access_token=' + access_token \n", "\n", "data = requests.get(api_url).json()\n", "#requests.get(api_url).text" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "さて,これをどう料理するか" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "type(data) # ドキュメントによると日々のデータのリストになっている" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "type(data[0]) # 4/1のデータはdict型" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "4/1のデータだけ見る" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "data[0]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "type(data[0]['summary'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "type(data[0]['summary'][0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "各日付ごとにlist,その中に日付やサマリーがdictで入っていて,サマリーの値はアクティビティごとにlist,アクティビティの中はまたdict" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data[0]['summary'][0]['duration']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "こうすればウォーキング,移動,バイクの3つのリストにデータを抽出できる" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "walking = list()\n", "transport = list()\n", "motorcycle = list()\n", "for d1 in data:\n", " date = d1[\"date\"]\n", " for d2 in d1[\"summary\"]:\n", " activity = d2[\"activity\"]\n", " distance = d2[\"distance\"]\n", " duration = d2[\"duration\"]\n", "\n", " if activity==\"walking\":\n", " steps = d2[\"steps\"]\n", " walking.append((date, activity, distance, steps))\n", " elif activity==\"transport\":\n", " transport.append((date, activity, distance, duration))\n", " elif activity==\"motorcycle\":\n", " motorcycle.append((date, activity, distance, duration))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "walking[0:5]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "transport[0:5]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "motorcycle[0:5]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "あとでpandasのDataFrameに入れることを考えると,列ごとのリストにしたほうがよい" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "date = list()\n", "activity = list()\n", "distance = list()\n", "duration=list()\n", "steps=list()\n", "\n", "for d1 in data:\n", " for d2 in d1[\"summary\"]:\n", " date.append(d1[\"date\"])\n", " ac = d2[\"activity\"]\n", " activity.append(ac)\n", " distance.append(d2[\"distance\"])\n", " duration.append(d2[\"duration\"])\n", " if ac==\"walking\":\n", " steps.append(d2[\"steps\"])\n", " else:\n", " steps.append(np.nan)\n", "\n", " \n", "df = DataFrame({'Date': date,\n", " 'Activity': activity,\n", " 'Distance': distance,\n", " 'Duration': duration,\n", " 'Steps': steps},\n", " columns=['Date','Activity', 'Distance', 'Duration', 'Steps'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "これでpandasのDataFrameに格納できる" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df.head(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. 位置情報の取得\n", "\n", "今度は位置情報を取得。4/15はバイクでツーリングに行った日。\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "api_url2 = 'https://api.moves-app.com/api/1.1/user/storyline/daily/20170415?trackPoints=true&scope=activity&access_token=' + access_token\n", "\n", "posdata = requests.get(api_url2).json()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "type(posdata[0][\"segments\"])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "type(posdata[0][\"segments\"][1])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "posdata[0][\"segments\"][1][\"activities\"][0][\"trackPoints\"][0][\"lat\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "データを見てみると,位置情報があるのはactivityとplace" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "lat=list()\n", "lon=list()\n", "time=list()\n", "activity=list()\n", "for d1 in posdata:\n", " for d2 in d1[\"segments\"]:\n", " if \"activities\" in d2:\n", " for d3 in d2[\"activities\"]:\n", " for d4 in d3[\"trackPoints\"]:\n", " activity.append(d3[\"activity\"])\n", " lat.append(d4[\"lat\"])\n", " lon.append(d4[\"lon\"])\n", " time.append(d4[\"time\"])\n", " if \"place\" in d2:\n", " if \"name\" in d2[\"place\"]:\n", " name = d2[\"place\"][\"name\"]\n", " else:\n", " name = \"Unknown\"\n", " if name != \"ホーム\": # 自宅データは除外\n", " activity.append(\"Place:\" + name)\n", " lat.append(d2[\"place\"][\"location\"][\"lat\"])\n", " lon.append(d2[\"place\"][\"location\"][\"lon\"])\n", " time.append(d2[\"endTime\"])\n", " \n", " \n", "df2 = DataFrame({'Time': time,\n", " 'Lat': lat,\n", " 'Lon': lon,\n", " 'Activity': activity},\n", " columns=['Time','Lat', 'Lon', 'Activity'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df2.head(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "地図に表示するためにfoliumパッケージを使う。" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import folium" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "m = folium.Map(location=[35.01, 139], zoom_start=9)\n", "for i, row in df2.iterrows():\n", " if row[\"Activity\"][0:5]==\"Place\":\n", " folium.Marker([row[\"Lat\"],row[\"Lon\"]], popup=row[\"Activity\"][6:]).add_to(m)\n", " else:\n", " folium.CircleMarker([row[\"Lat\"],row[\"Lon\"]], radius=2, color=\"#336699\").add_to(m)\n", " #print([row[\"Lat\"],row[\"Lon\"]])\n", "m" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" } }, "nbformat": 4, "nbformat_minor": 1 }