javascript
数据分析JSON板块的基本使用(以分析比特币收盘价为例),附完整的Python代码及json文件详解---数据可视化
目錄
- 一、前提準備
- 二、將收盤價用可視化圖表示出來
- 上代碼
- 運行結果
- 三、進行時間序列分析
- 上代碼
- 運行結果
- 四、收盤價均值
- 月日均值
- 周日均值
- 星期均值
- 五、數據儀盤表
一、前提準備
btc_close_2017.json文件下載
鏈接:點擊此處
提取碼:zry9
二、將收盤價用可視化圖表示出來
上代碼
# coding = utf-8import json import pygal# import requests """下載收盤數據(注明:這個url有問題,我用多臺電腦測試了都是報錯的,但是方法是沒錯的,直接從網上下載了json文件,見btc_close_2017.json)""" # json_url = 'https://raw.githubusercontent.com/muxuezi/btc/master/btc_close_2017.json' # # req = requests.get(json_url) # #將數據寫入文件 # with open('btc_close_2017_request.json','w') as f: # f.write(req.text) # file_requests =req.json()"""將數據加載到一個列表當中""" filename = 'btc_close_2017.json' with open(filename) as f:# 將數據存儲在btc_data中btc_date = json.load(f)# 創建5個列表,分別存儲日期和收盤價 dates = [] months = [] weeks = [] weekdays = [] close = [] # 打印每一天的信息 for btc_dict in btc_date:dates.append(btc_dict['date'])months.append(int(btc_dict['month']))weeks.append(int(btc_dict['week']))weekdays.append(btc_dict['weekday'])close.append(int(float(btc_dict['close'])))""" 有了x軸與y軸的數據,就可以繪制折線圖了。由于數據點比較多,x軸要顯示346個日期, 在有限的屏幕上會顯得十分擁擠。因此我們需要pygal的配置參數,對圖形進行適當的調整 """ # 創建Line實例時,分別設置x_label_rotation、show_minor_x_labels作為初始化參數 # x_label_rotation=20讓x軸上的日期標簽順時針旋轉20°,show_minor_x_labels=False告訴圖形不用顯示所有的x軸標簽 line_chart = pygal.Line(x_label_rotation=20, show_minor_x_labels=False) line_chart.title = '收盤價(¥)' line_chart.x_labels = dates # x軸坐標每隔20天顯示一次 N = 20 line_chart.x_labels_major = dates[::N] line_chart.add('收盤價', close) line_chart.render_to_file('收盤價折線圖(¥).svg')運行結果
注意:上圖是以網頁的形式表示出來的,在文件目錄下面找到他雙擊
三、進行時間序列分析
??進行時間序列分析總是期望發現趨勢,周期性和噪聲,從而能夠描述事實,預測未來,做出決策。
由上面的折線圖,在每個季度末(3、6、9月)似乎有一些相似的波動。為了驗證周期性的假設,我們用python的math模塊來解決這個問題,這里用math里面的以10為底的對數函數math.log10計算收盤價,日期仍保持不變,這種方式稱作半對數變換。
上代碼
# coding = utf-8import json import pygal import math# import requests """下載收盤數據(注明:這個url有問題,我用多臺電腦測試了都是報錯的,但是方法是沒錯的,直接從網上下載了json文件,見btc_close_2017.json)""" # json_url = 'https://raw.githubusercontent.com/muxuezi/btc/master/btc_close_2017.json' # # req = requests.get(json_url) # #將數據寫入文件 # with open('btc_close_2017_request.json','w') as f: # f.write(req.text) # file_requests =req.json()"""將數據加載到一個列表當中""" filename = 'btc_close_2017.json' with open(filename) as f:# 將數據存儲在btc_data中btc_date = json.load(f)# 創建5個列表,分別存儲日期和收盤價 dates = [] months = [] weeks = [] weekdays = [] close = [] # 打印每一天的信息 for btc_dict in btc_date:dates.append(btc_dict['date'])months.append(int(btc_dict['month']))weeks.append(int(btc_dict['week']))weekdays.append(btc_dict['weekday'])close.append(int(float(btc_dict['close'])))""" 有了x軸與y軸的數據,就可以繪制折線圖了。由于數據點比較多,x軸要顯示346個日期, 在有限的屏幕上會顯得十分擁擠。因此我們需要pygal的配置參數,對圖形進行適當的調整 """ # 創建Line實例時,分別設置x_label_rotation、show_minor_x_labels作為初始化參數 # x_label_rotation=20讓x軸上的日期標簽順時針旋轉20°,show_minor_x_labels=False告訴圖形不用顯示所有的x軸標簽 line_chart = pygal.Line(x_label_rotation=20, show_minor_x_labels=False) line_chart.title = '收盤價對數變換(¥)' line_chart.x_labels = dates # x軸坐標每隔20天顯示一次 N = 20 line_chart.x_labels_major = dates[::N] close_log = [math.log10(_) for _ in close] line_chart.add('log收盤價', close_log) line_chart.render_to_file('收盤價對數變換折線圖(¥).svg')運行結果
四、收盤價均值
由于需要將函數按月份,數據,周幾分組,再計算每組的均值,因此導入python標準庫itertools的函數groupby
https://blog.csdn.net/hanhanwanghaha寶藏女孩 歡迎您的關注!
歡迎關注微信公眾號:寶藏女孩的成長日記
如有轉載,請注明出處(如不注明,盜者必究)
月日均值
# coding = utf-8import json import pygal import math from itertools import groupby# import requests """下載收盤數據(注明:這個url有問題,我用多臺電腦測試了都是報錯的,但是方法是沒錯的,直接從網上下載了json文件,見btc_close_2017.json)""" # json_url = 'https://raw.githubusercontent.com/muxuezi/btc/master/btc_close_2017.json' # # req = requests.get(json_url) # #將數據寫入文件 # with open('btc_close_2017_request.json','w') as f: # f.write(req.text) # file_requests =req.json()"""將數據加載到一個列表當中""" filename = 'btc_close_2017.json' with open(filename) as f:# 將數據存儲在btc_data中btc_date = json.load(f)# 創建5個列表,分別存儲日期和收盤價 dates = [] months = [] weeks = [] weekdays = [] close = [] # 打印每一天的信息 for btc_dict in btc_date:dates.append(btc_dict['date'])months.append(int(btc_dict['month']))weeks.append(int(btc_dict['week']))weekdays.append(btc_dict['weekday'])close.append(int(float(btc_dict['close'])))def draw_line(x_data, y_data, title, y_legend):xy_map = []#將x、y軸的數據進行合并排序再進行分組for x, y in groupby(sorted(zip(x_data, y_data)), key=lambda _: _[0]):y_list = [v for _, v in y]#求出每組的均值,存儲到xy_map變量中xy_map.append([x, sum(y_list) / len(y_list)])#將xy_map中存儲的x軸y軸的數據分離x_unique, y_mean = [*zip(*xy_map)]line_chart = pygal.Line()line_chart.title = titleline_chart.x_labels = x_uniqueline_chart.add(y_legend, y_mean)line_chart.render_to_file(title + '.svg')return line_chartidx_month = dates.index('2017-12-01') line_chart_month = draw_line(months[:idx_month], close[:idx_month], '收盤價月日均值(¥)', '月日均值') line_chart_month運行結果
周日均值
# coding = utf-8import json import pygal import math from itertools import groupby# import requests """下載收盤數據(注明:這個url有問題,我用多臺電腦測試了都是報錯的,但是方法是沒錯的,直接從網上下載了json文件,見btc_close_2017.json)""" # json_url = 'https://raw.githubusercontent.com/muxuezi/btc/master/btc_close_2017.json' # # req = requests.get(json_url) # #將數據寫入文件 # with open('btc_close_2017_request.json','w') as f: # f.write(req.text) # file_requests =req.json()"""將數據加載到一個列表當中""" filename = 'btc_close_2017.json' with open(filename) as f:# 將數據存儲在btc_data中btc_date = json.load(f)# 創建5個列表,分別存儲日期和收盤價 dates = [] months = [] weeks = [] weekdays = [] close = [] # 打印每一天的信息 for btc_dict in btc_date:dates.append(btc_dict['date'])months.append(int(btc_dict['month']))weeks.append(int(btc_dict['week']))weekdays.append(btc_dict['weekday'])close.append(int(float(btc_dict['close'])))def draw_line(x_data, y_data, title, y_legend):xy_map = []# 將x、y軸的數據進行合并排序再進行分組for x, y in groupby(sorted(zip(x_data, y_data)), key=lambda _: _[0]):y_list = [v for _, v in y]# 求出每組的均值,存儲到xy_map變量中xy_map.append([x, sum(y_list) / len(y_list)])# 將xy_map中存儲的x軸y軸的數據分離x_unique, y_mean = [*zip(*xy_map)]line_chart = pygal.Line()line_chart.title = titleline_chart.x_labels = x_uniqueline_chart.add(y_legend, y_mean)line_chart.render_to_file(title + '.svg')return line_chart""" 2017-1-02 --- 2017-12-10 (前49周)的日均值 2017年1月1日是周日,歸屬為2016年52周,因此2017年的第一周從2017年1月2日開始,取數時需要將第一天去掉 另外,2017年第49周周日是2017年12月10日,因此我們通過dates查找2017-12-11的索引位置,確定周數和收盤價的取值范圍 """ idx_weeks = dates.index('2017-12-11') line_chart_weeks = draw_line(weeks[1:idx_weeks], close[1:idx_weeks], '收盤價周日均值(¥)', '周日均值') line_chart_weeks運行結果
星期均值
# coding = utf-8import json import pygal import math from itertools import groupby# import requests """下載收盤數據(注明:這個url有問題,我用多臺電腦測試了都是報錯的,但是方法是沒錯的,直接從網上下載了json文件,見btc_close_2017.json)""" # json_url = 'https://raw.githubusercontent.com/muxuezi/btc/master/btc_close_2017.json' # # req = requests.get(json_url) # #將數據寫入文件 # with open('btc_close_2017_request.json','w') as f: # f.write(req.text) # file_requests =req.json()"""將數據加載到一個列表當中""" filename = 'btc_close_2017.json' with open(filename) as f:# 將數據存儲在btc_data中btc_date = json.load(f)# 創建5個列表,分別存儲日期和收盤價 dates = [] months = [] weeks = [] weekdays = [] close = [] # 打印每一天的信息 for btc_dict in btc_date:dates.append(btc_dict['date'])months.append(int(btc_dict['month']))weeks.append(int(btc_dict['week']))weekdays.append(btc_dict['weekday'])close.append(int(float(btc_dict['close'])))def draw_line(x_data, y_data, title, y_legend):xy_map = []# 將x、y軸的數據進行合并排序再進行分組for x, y in groupby(sorted(zip(x_data, y_data)), key=lambda _: _[0]):y_list = [v for _, v in y]# 求出每組的均值,存儲到xy_map變量中xy_map.append([x, sum(y_list) / len(y_list)])# 將xy_map中存儲的x軸y軸的數據分離x_unique, y_mean = [*zip(*xy_map)]line_chart = pygal.Line()line_chart.title = titleline_chart.x_labels = x_uniqueline_chart.add(y_legend, y_mean)line_chart.render_to_file(title + '.svg')return line_chart""" 繪制每周中各天的均值 為了使用完整的時間段,還像前面那樣取2017-01-02----2017-12-10的數據,同樣通過dates來查找2017-12-11的索引位置,確定周數和收盤價的取數范圍 但是,由于這里的周幾是字符串,按周一到周日的順序排列,而不是單詞首字母的順序,繪圖x軸標簽的順序會有問題。 原來的周幾都是英文單詞,還可以將其調整為中文 """ idx_weeks = dates.index('2017-12-11') # 列出一周7天的英語單詞,將weekdays的內容轉換為1-7的整數 wd = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] weekdays_int = [wd.index(w) + 1 for w in weekdays[1:idx_weeks]]line_chart_weekday = draw_line(weekdays_int, close[1:idx_weeks], '收盤價星期均值(¥)', '星期均值') line_chart_weekday.x_labels = ['周一', '周二', '周三', '周四', '周五', '周六', '周天'] line_chart_weekday.render_to_file('收盤價星期均值(¥).svg')運行結果
五、數據儀盤表
前面已經繪制了五幅圖,分別是收盤價折線圖,收盤價對數變換折線圖,收盤價月均值,收盤價周均值,收盤價星期均值,每個svg文件打開都是獨立的頁面,如果我們能夠將他們整合在一起,就可以很方便進行長期管理、檢測和分析。另外,新的圖表也可以十分方便地加入進來,這樣就形成了一個數據儀表盤
# coding = utf-8import json import pygal import math from itertools import groupby# import requests """下載收盤數據(注明:這個url有問題,我用多臺電腦測試了都是報錯的,但是方法是沒錯的,直接從網上下載了json文件,見btc_close_2017.json)""" # json_url = 'https://raw.githubusercontent.com/muxuezi/btc/master/btc_close_2017.json' # # req = requests.get(json_url) # #將數據寫入文件 # with open('btc_close_2017_request.json','w') as f: # f.write(req.text) # file_requests =req.json()"""將數據加載到一個列表當中""" filename = 'btc_close_2017.json' with open(filename) as f:# 將數據存儲在btc_data中btc_date = json.load(f)# 創建5個列表,分別存儲日期和收盤價 dates = [] months = [] weeks = [] weekdays = [] close = [] # 打印每一天的信息 for btc_dict in btc_date:dates.append(btc_dict['date'])months.append(int(btc_dict['month']))weeks.append(int(btc_dict['week']))weekdays.append(btc_dict['weekday'])close.append(int(float(btc_dict['close'])))# 創建Line實例時,分別設置x_label_rotation、show_minor_x_labels作為初始化參數 # x_label_rotation=20讓x軸上的日期標簽順時針旋轉20°,show_minor_x_labels=False告訴圖形不用顯示所有的x軸標簽 line_chart = pygal.Line(x_label_rotation=20, show_minor_x_labels=False) line_chart.title = '收盤價(¥)' line_chart.x_labels = dates # x軸坐標每隔20天顯示一次 N = 20 line_chart.x_labels_major = dates[::N] line_chart.add('收盤價', close) line_chart.render_to_file('收盤價折線圖(¥).svg')# 創建Line實例時,分別設置x_label_rotation、show_minor_x_labels作為初始化參數 # x_label_rotation=20讓x軸上的日期標簽順時針旋轉20°,show_minor_x_labels=False告訴圖形不用顯示所有的x軸標簽 line_chart = pygal.Line(x_label_rotation=20, show_minor_x_labels=False) line_chart.title = '收盤價對數變換(¥)' line_chart.x_labels = dates # x軸坐標每隔20天顯示一次 N = 20 line_chart.x_labels_major = dates[::N] close_log = [math.log10(_) for _ in close] line_chart.add('log收盤價', close_log) line_chart.render_to_file('收盤價對數變換折線圖(¥).svg') line_chartdef draw_line(x_data, y_data, title, y_legend):xy_map = []for x, y in groupby(sorted(zip(x_data, y_data)), key=lambda _: _[0]):y_list = [v for _, v in y]xy_map.append([x, sum(y_list) / len(y_list)])x_unique, y_mean = [*zip(*xy_map)]line_chart = pygal.Line()line_chart.title = titleline_chart.x_labels = x_uniqueline_chart.add(y_legend, y_mean)line_chart.render_to_file(title + '.svg')return line_chartidx_month = dates.index('2017-12-01') line_chart_month = draw_line(months[:idx_month], close[:idx_month], '收盤價月日均值(¥)', '月日均值') line_chart_monthidx_week = dates.index('2017-12-11') line_chart_week = draw_line(weeks[1:idx_week], close[1:idx_week], '收盤價周日均值(¥)', '周日均值') line_chart_weekidx_week = dates.index('2017-12-11') wd = ['Monday', 'Tuesday', 'Wednesday','Thursday', 'Friday', 'Saturday', 'Sunday'] weekdays_int = [wd.index(w) + 1 for w in weekdays[1:idx_week]] line_chart_weekday = draw_line(weekdays_int, close[1:idx_week], '收盤價星期均值(¥)', '星期均值') line_chart_weekday.x_labels = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] line_chart_weekday.render_to_file('收盤價星期均值(¥).svg') line_chart_weekdaywith open('收盤價Dashboard.html', 'w', encoding='utf8') as html_file:html_file.write('<html><head><title>收盤價Dashboard</title><meta charset="utf-8"></head><body>\n')for svg in ['收盤價折線圖(¥).svg', '收盤價對數變換折線圖(¥).svg', '收盤價月日均值(¥).svg','收盤價周日均值(¥).svg', '收盤價星期均值(¥).svg']:html_file.write(' <object type="image/svg+xml" data="{0}" height=500></object>\n'.format(svg))html_file.write('</body></html>')運行結果
注意,可放大!
學習《python編程從入門到實戰》16章第二節。
以上就是全部內容啦,如果有不懂的小伙伴歡迎提出來傲!
https://blog.csdn.net/hanhanwanghaha寶藏女孩 歡迎您的關注!
歡迎關注微信公眾號:寶藏女孩的成長日記
如有轉載,請注明出處(如不注明,盜者必究)
總結
以上是生活随笔為你收集整理的数据分析JSON板块的基本使用(以分析比特币收盘价为例),附完整的Python代码及json文件详解---数据可视化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spfa_队列
- 下一篇: Mysql中的IFNULL函数的详解(嵌