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