Python數據可視化之交易收盤與天氣變化走勢圖


下面的案例是繪出交易收盤走勢圖

簡單說明:整體代碼分為5個函數,最后給出了最后兩個函數運行的效果圖。前面每個函數都為下面的函數做准備。

函數btc_close_2017()、btc_close_2017_01()、btc_close_2017_02()函數為了顯示數據

函數btc_close_2017_03()、btc_close_2017_04()可視化數據

繪圖用到的函數以及參數說明未單獨列出都在程序里注釋說明。

整體代碼如下:

  1 #交易收盤走勢圖:JSON格式
  2 from __future__ import (absolute_import,division,print_function,unicode_literals)
  3 import requests
  4 
  5 def btc_close_2017():
  6     #實現兼容python 2.x和3.x的版本,要用到urlopen函數
  7     try:
  8         from urllib2 import urlopen
  9     except ImportError:
 10         from urllib.request import urlopen
 11 
 12     導入json模塊
 13     import json
 14 
 15     json_url = "https://raw.githubusercontent.com/muxuezi/btc/master/btc_close_2017.json"
 16     #調用requests.get()方法向github服務器發送請求,返回結果存儲在req中
 17     req = requests.get(json_url)
 18     # 將數據寫入文件
 19     with open('btc_close_2017_request.json','w') as f:
 20         #req.text屬性可以直接讀取文件數據,返回格式為字符串
 21         f.write(req.text)
 22     #直接調用req.json就可將btc_close_2017.json文件轉換成python列表file_request
 23     file_request = req.json
 24     """
 25     response = urlopen(json_url)
 26     req = response.read()
 27 
 28     with open("btc_close_2017_urllib.json",'wb') as f:
 29         f.write(req)
 30     file_urllib = json.loads(req)
 31     print(file_urllib)
 32     """
 33     print(req.text)
 34 
 35 import json
 36 
 37 def btc_close_2017_01():
 38     filename = "btc_close_2017.json"
 39     with open(filename) as f:
 40         btc_data = json.load(f)
 41     for btc_dict in btc_data:
 42         date = btc_dict['date']
 43         month = btc_dict['month']
 44         week = btc_dict['week']
 45         weekday = btc_dict['weekday']
 46         close = btc_dict['close']
 47         print ("{} is month {} week{},{},the close price is {}RMB".format(date,month,week,weekday,close))
 48 
 49 # 將字符轉化為數字
 50 def btc_close_2017_02():
 51     filename = "btc_close_2017.json"
 52     with open(filename) as f:
 53         btc_data = json.load(f)
 54     for btc_dict in btc_data:
 55         date = btc_dict['date']
 56         month = int(btc_dict['month'])
 57         week = int(btc_dict['week'])
 58         weekday = btc_dict['weekday']
 59         close = int(float(btc_dict['close']))
 60         print ("{} is month {} week{},{},the close price is {}RMB".format(date,month,week,weekday,close))
 61 
 62 import pygal
 63 # 繪制收盤價折線圖
 64 def btc_close_2017_03():
 65     filename = "btc_close_2017.json"
 66     with open(filename) as f:
 67         btc_data = json.load(f)
 68     dates = []
 69     month = []
 70     week = []
 71     weekday = []
 72     close = []
 73     for btc_dict in btc_data:
 74         dates.append(btc_dict['date'])
 75         month.append(int(btc_dict['month']))
 76         week.append(int(btc_dict['week']))
 77         weekday.append(btc_dict['weekday'])
 78         close.append(int(float(btc_dict['close'])))
 79 
 80     line_chart = pygal.Line(x_label_rotation=20,show_minor_x_labels=False)
 81     line_chart.title = "收盤價(¥)"
 82     line_chart.x_labels = dates
 83     N = 20
 84     line_chart.x_labels_major = dates[::N]
 85     line_chart.add("收盤價",close)
 86     line_chart.render_to_file('收盤價折線圖.svg')
 87 
 88 
 89 import math
 90 #導入python標准庫中模塊itertools的函數groupby
 91 from itertools import groupby
 92 #計算收盤價均值
 93 def draw_line(x_data,y_data,title,y_legend):
 94     xy_map = []
 95     #將x軸,y軸數據合並排序再用groupby分組,分組之后求出均值
 96     for x,y in groupby(sorted(zip(x_data,y_data)),key = lambda _:_[0]):
 97         y_list = [v for _,v in y]
 98         xy_map.append([x,sum(y_list)/len(y_list)])
 99     #將xy_map中x軸,y軸數據分離
100     x_unique,y_mean = [*zip(*xy_map)]
101     #實例化折線圖對象並畫圖
102     line_chart = pygal.Line()
103     line_chart.title = title
104     line_chart.x_labels = x_unique
105     line_chart.add(y_legend,y_mean)
106     line_chart.render_to_file(title+".svg")
107     return line_chart
108 
109 def btc_close_2017_04():
110     filename = "btc_close_2017.json"
111     with open(filename) as f:
112         btc_data = json.load(f)
113     dates = []
114     month = []
115     week = []
116     weekday = []
117     close = []
118     for btc_dict in btc_data:
119         dates.append(btc_dict['date'])
120         month.append(int(btc_dict['month']))
121         week.append(int(btc_dict['week']))
122         weekday.append(btc_dict['weekday'])
123         close.append(int(float(btc_dict['close'])))
124 
125     #x軸日期標簽旋轉20度,不用顯示x軸所有標簽
126     line_chart = pygal.Line(x_label_rotation=20,show_minor_x_labels=False)
127     line_chart.title = "收盤價對數變換(¥)"
128     line_chart.x_labels = dates
129     #x軸每隔20天顯示一次
130     N = 20
131     line_chart.x_labels_major = dates[::N]
132     #利用對數變換剔除非線性趨勢之后,整體上漲更接近線性增長
133     close_log = [math.log10(_) for _ in close]
134     line_chart.add("log收盤價",close_log)
135     line_chart.render_to_file('收盤價對數變換折線圖.svg')
136 
137     # 收盤價月日均圖
138     idx_month = dates.index('2017-12-01')
139     line_chart_month = draw_line(month[:idx_month],close[:idx_month],'收盤價月日均圖','月日均值')
140 
141 
142 btc_close_2017_04()
143 """
144 btc_close_2017_03()
145 btc_close_2017_02()
146 btc_close_2017_01()
147 """

收盤價折線圖如下:

收盤價對數變換折線圖如下:

收盤價月日均圖如下:

天氣變化折線圖程序如下(程序所用函數以及參數含義在注釋中已說明):

 1 import csv
 2 from matplotlib import pyplot as plt
 3 from datetime import datetime
 4 
 5 # filename = 'sitka_weather_07-2014.csv'
 6 #要讀取的文件
 7 filename = 'sitka_weather_2014.csv'
 8 
 9 #打開文件並將文件結果對象存儲到f中
10 with open(filename) as f:
11     #創建一個與該文件相關聯的閱讀器(reader)對象,reader處理文件中以逗號分隔每一行的數據
12     reader = csv.reader(f)
13     #模塊csv包含函數next(),將閱讀器對象傳遞給它將返回文件的下一行
14     headr_row = next(reader)
15 
16     dates,highs,lows = [],[],[]
17     for row in reader:
18         #datetime.strptime()設置時間日期
19         current_date = datetime.strptime(row[0],"%Y-%m-%d")
20         dates.append(current_date)
21 
22         high = int(row[1])
23         highs.append(high)
24 
25         low = int(row[3])
26         lows.append(low)
27 
28     # 數據可視化
29     fig = plt.figure(dpi=128,figsize=(10,6))
30     #紅色顯示最高氣溫,藍色顯示最低氣溫
31     plt.plot(dates,highs,c='red')
32     plt.plot(dates,lows,c = 'blue')
33     #向fill_between()函數傳遞一個x值:dates 兩個y值:highs,lows 中間填充色:blue 透明度:0.5
34     plt.fill_between(dates,highs,lows,facecolor = 'blue',alpha=0.5)
35 
36     #設置圖形的格式
37     plt.title("Daily hight temperatures,July 2014",fontsize=10)
38     plt.xlabel('',fontsize=5)
39     #來繪制斜的日期標簽
40     fig.autofmt_xdate()
41     plt.ylabel("Temperature(F)",fontsize = 10)
42     plt.tick_params(axis='both',which='major',labelsize = 10)
43     plt.show()

效果圖如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM