程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python數據可視化------下載數據

編輯:Python

CSV文件格式:

要在文本文件中存儲數據,一個簡單的方式是將數據作為一系列以逗號分隔的值(comma——separated)寫入文件。這樣的文件稱為CSV文件。

舉例:

USWA,weather,01,02
aaa,bbb,ccc,02,04

閱讀CSV文件對於我們來說不宜閱讀,但使用程序進行處理會很簡單。

分析文件頭:

import csv#csv模塊是包含在Python標准庫中 ,可用於分析CSV文件中的數據行
#使用我們之前學過的文件操作的內容打開文件
filename='sitka_weather_07-2018_simple.csv'
with open(filename) as f:
reader=csv.reader(f)#調用csv.reader()並將存儲的文件作為實參傳遞給它
#為了創建一個與該文件相關聯的閱讀器對象
header_row=next(reader)#next()函數,返回文件中的下一行
#由於只調用了一次next()函數,因此得到的是文件的第一行
print(header_row)

輸出結果為該文件的文件頭:

reader處理文件中以逗號分隔的第一行數據,並將每項數據都作為一個元素存儲在列表中。

['STATION', 'NAME', 'DATE', 'PRCP', 'TAVG', 'TMAX', 'TMIN']

打印文件頭及其位置:

為了讓文件數據更加容易理解,現在我們將每個文件頭及其位置打印出來:

import csv
filename='sitka_weather_07-2018_simple.csv'
with open(filename) as f:
reader=csv.reader(f)
header_row=next(reader)
#調用enumerate()來獲取每個元素的索引及其值
for index,column_header in enumerate(header_row):
print(index,column_header)

輸出每個文件頭的索引:

0 STATION
1 NAME
2 DATE
3 PRCP
4 TAVG
5 TMAX
6 TMIN

從輸出的索引內容可得,名稱在第二行,它的索引值為1,日期在第三行,它的索引值為2等等。

提取並讀取文件:

假設現在我們想要讀取每天的最高氣溫:

import csv
filename='sitka_weather_07-2018_simple.csv'
with open(filename) as f:
reader=csv.reader(f)
header_row=next(reader)
highs=[]#用來存儲我們讀取的數據
for row in reader:#遍歷CSV文件剩下的部分
#由於上面我們已經讀取了文件的第一行,所以閱讀器將從上次停留的地方繼續往下讀,也就是第二行開始
high=int(row[5])#每次讀取文件的索引值為5的那部分
highs.append(high)
print(highs)

如下所示,我們輸出了文件索引值為5的部分,也確實是最高溫度。

[62, 58, 70, 70, 67, 59, 58, 62, 66, 59, 56, 63, 65, 58, 56, 59, 64,
60, 60, 61, 65, 65, 63, 59, 64, 65, 68, 66, 64, 67, 65]

繪制溫度圖表:

前面我們學習了Matplotlib,現在我們就可以可視化這些溫度數據。

舉例:

import csv
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
filename = 'sitka_weather_07-2018_simple.csv'
with open(filename) as f:
---snip---
plt.style.use("seaborn")#根據最高溫度繪制圖表
fig, ax = plt.subplots()
ax.plot(highs, c="red")
#設置橫縱坐標標簽等
ax.set_title("2018年7月每日最高溫度",fontsize=24)
ax.set_xlabel('',fontsize=16)
ax.set_ylabel('溫度(F)',fontsize=16)
ax.tick_params(axis='both',which='major',labelsize=16)
plt.show()

輸出效果如下圖所示:

圖片呈現給我們的內容並不是完美的,它只是反映出了溫度的變化趨勢,而並沒有表明某日期對應的相關溫度。

下面我們就對其進行優化,給它添加日期,在添加之前,我們先來學習模塊datetime

模塊datetime:

from datetime import datetime#導入日期模塊中的datetime類
first_date=datetime.strptime("2018-07-01","%Y-%m-%d")#方法strptime是將包含日期的字符串作為第一個參數,而第二個參數表明日期的格式
print(first_date)

輸出結果如下:

2018-07-01 00:00:00

方法strptime()可接受各種實參,並且可根據實參來解讀對應的日期:
如下圖所示:

在圖表中添加日期:

import csv
from datetime import datetime
import matplotlib.pyplot as plt
import matplotlib
plt.style.use('seaborn')
plt.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']='sans-serif'
filename = 'sitka_weather_07-2018_simple.csv'
with open(filename) as f:
reader = csv.reader(f)
header_row = next(reader)
dates,highs = [],[] # 用來存儲我們讀取的數據
for row in reader: # 遍歷CSV文件剩下的部分
# 由於上面我們已經讀取了文件的第一行,所以閱讀器將從上次停留的地方繼續往下讀,也就是第二行開始
current_date=datetime.strptime(row[2],"%Y-%m-%d")
high=int(row[5])
dates.append(current_date)
highs.append(high)
fig,ax = plt.subplots()
ax.plot(dates,highs, c="red")
ax.set_title("2018年7月每日最高溫度",fontsize=24)
ax.set_xlabel('',fontsize=16)
fig.autofmt_xdate()
ax.set_ylabel("溫度(F)",fontsize=16)
ax.tick_params(axis='both',which='major',labelsize=16)
plt.show()

涵蓋更長的時間:

上面我們可視化的數據為7月份一個月的天氣,現在我們嘗試可視化一整年的數據:

---snip---
filename = 'sitka_weather_2018_simple.csv'#打開覆蓋一整年數據的文件
with open(filename) as f:
reader = csv.reader(f)
header_row = next(reader)
highs = [] # 用來存儲我們讀取的數據
for row in reader: # 遍歷CSV文件剩下的部分
# 由於上面我們已經讀取了文件的第一行,所以閱讀器將從上次停留的地方繼續往下讀,也就是第二行開始
high=int(row[5])
highs.append(high)
fig,ax = plt.subplots()
ax.plot(highs, c="red")
ax.set_title("2018年每日最高溫度",fontsize=24)
---snip---

如下圖所示,輸出一整年的溫度數據。

數據系列結合:

上面我們對2018一整年的最高溫度數據進行可視化,為了能夠更加了解一整年的溫度情況,我們可以嘗試將最低溫度和最高溫度數據結合,進行可視化分析:

對上述代碼增加讀取最低溫度部分的代碼,再修改圖像的標簽即可。

 low=int(row[6])
lows.append(low)
ax.plot(dates,lows, c="blue")
ax.set_title("2018年7月每日最高溫度與最低溫度",fontsize=24)

輸出如下圖所示:

給圖表區域著色:

---snip---
#alpha指定顏色的透明度,等於零為完全透明,等於1為完全不透明
ax.plot(dates,highs, c="red",alpha=0.5)
ax.plot(dates,lows, c="blue",alpha=0.5)
ax.fill_between(dates,highs,lows,facecolor='blue',alpha=0.1)#調用fill__between()函數,該函數的作用是填充兩條水平曲線之間的區域
#fill__betweenx()函數的作用是填充兩條垂直曲線之間的區域
---snip---

錯誤檢查:

在對天氣的數據進行可視化時,我們應做到讓任意地方的天氣能夠運行我們編寫的代碼,從而使任何地方的天氣數據都能進行可視化,但是,在收集數據的過程中,我們很難保證數據的種類等是一致的,比如,信心的不完整或缺損都可能會引發異常。

舉例:

import csv
from datetime import datetime
import matplotlib.pyplot as plt
import matplotlib
filename="death_valley_2018_simple.csv"
with open(filename) as f:
reader=csv.reader(f)
header_row=next(reader)
dates,highs,lows=[],[],[]
for row in reader:
current_date=datetime.strptime(row[2],"%Y-%m-%d")
high=int(row[4])
low=int(row[5])
dates.append(current_date)
for index,conlumn_header in enumerate(header_row):
print(index,conlumn_header)

程序並沒有正確運行,編譯器報告給我們無法處理其中一天的最高溫度,原因是無法將空字符串(‘ ’)轉化為整數。

Traceback (most recent call last):
File "C:/Users/Lenovo/PycharmProjects/pythonProject4/project1.py", line 42, in <module>
high=int(row[4])
ValueError: invalid literal for int() with base 10: ''

而當我們打開這個文件就可以找到文件中確實缺失了一些數據。
既然我們發現異常,就要想辦法去處理它,處理它的辦法即為我們之前學過的try-except-else代碼塊。

處理異常:

---snip---
for row in reader:
current_date=datetime.strptime(row[2],"%Y-%m-%d")
#對異常進行處理
try:
high=int(row[4])
low=int(row[5])
except ValueError:
print(f"Missing data for{
current_date}")
else:
dates.append(current_date)
highs.append(high)
lows.append(low)
#描繪圖表內容
title="2018年每日最高溫度和最低溫度\n美國加利福尼亞州死亡谷"
fig,ax = plt.subplots()
ax.plot(dates,highs, c="red",alpha=0.5)
ax.plot(dates,lows, c="blue",alpha=0.5)
ax.fill_between(dates,highs,lows,facecolor='blue',alpha=0.1)
ax.set_title(title,fontsize=20)
ax.set_xlabel('',fontsize=16)
plt.show()

當我們對該異常進行處理之後,輸出結果如下:

此時編譯器並沒有直接報錯,而是給我們指出缺少2018年2-18日這一天的數據。

Missing data for2018-02-18 00:00:00

使用try-except-else代碼塊對異常進行處理後,代碼將忽略該天的異常,而生成除了該天以外的圖像。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved