一個偶然的發現,在iPhone的健康應用里,可以將全部健康數據導出為一個XML文件。這是數據啊,有數據不就可以折騰了嗎? 于是越想越精神,雖然我并不知道怎么處理這些數據,那就。。先把其中的一些數據用matplotlib可視化一下吧。這都是我自己產生的真實的數據啊,于是就有了今天下午的故事··
知識相關:
- python 讀取XML文件的方法 (xml.sax/xml.etree.ElementTree)
- Python 對象序列化
- Python 迭代器和生成器 (讀 python cookbook)
- Python elementsTree 讀取xml 標簽的多個屬性值 參考
- Matplotlib 將dict類型的數據可視化 (折線圖)
- Matplotlib 以日期為橫軸的問題 (matplotlib 必須把數值轉換為浮點數)
讀取XML的方法
ElementTree是將所有的XML解析為樹,就要讀入所有的數據,這個還是比較占用內存空間的。因為僅僅是一個月的數據,XML文件解壓后就有90兆左右了。XML.sax會比較省內存,但是比較麻煩,需要自己重新實現一個handler,因為90mb的數據還是在允許的范圍之內的,所以為了省事就使用了ElementTree,日后有需要的時候還是要研究一下sax的。但是因為自己寫代碼需要多次運行,每一次運行就要重新載入一下90兆的數據,這個速度慢的還是有點不能忍的,好在我并不是需要所有的數據--我只是想把每天的運動時間可視化展示一下,這樣,我在第一次把數據讀入時就把所有的運動時間相關的數據存在一個list 中,然后把這個list對象序列化,保存為文件,那么我下一次就直接載入這個序列化的文件就好了,大大節省了載入數據的時間。
pickle
就是干這件事情的,關于pickle,我覺的目前只要記住兩個方法就夠用了
關于對象序列化,我覺的作用還是蠻大的,至少讓對象的生存周期延續到了程序運行結束后,也讓對象的生存空間從內存移動到了硬盤 +ns
import pickle
pickle.dump(activity_data, f) # store the sequence of object activity_data to f(f is a file)
activity_data = pickle.load(f) # get the object by f
# now type(activity_data) is []
# 序列化部分的完整代碼
def create_activity_data():
# source_data = open('/home/alexsun/testData/appleHealth/apple_health_export/mydata.xml')
# data = parse(source_data)
# f = open('xml_data','wb')
# pickle.dump(data, f)
f = open('xml_data', 'rb')
f1 = open('activity_data_list','wb')
data = pickle.load(f)
cnt = 0
activity_data = []
for item in data.iterfind('ActivitySummary'):
activity_data.append(item.attrib)
print item.attrib
# pickle.dump(records_data, fr)
pickle.dump(activity_data, f1)
f.close()
f1.close()
# source_data.close()
matplotlib展示健身時間
先把代碼貼在這里吧,更熟練了matplotlib之后再來補充
def main():
f = open('activity_data_list')
activity_data = pickle.load(f)
# x represents date
x = []
# y represents daily exercise time
y = []
for item in activity_data:
date = item['dateComponents']
x.append(datetime.strptime(date, '%Y-%m-%d').date())
y.append(item['appleExerciseTime'])
plt.gca().xaxis.set_major_formatter(md.DateFormatter('%Y-%m-%d'))
plt.gca().xaxis.set_major_locator(md.DayLocator())
plt.xlabel('date')
plt.ylabel('exercise time')
plt.plot(x, y)
plt.show()
if __name__ == '__main__':
main()
最后的效果是這個樣子的:
figure_1-1.png
發現現在看到數據就會非常驚喜,我覺得有了數據之後可以做太多有意義的事情了.這僅僅是一個開始