Python 數據科學入門2:Matplotlib

第七章 從文件加載數據

很多時候,我們想要繪製文件中的數據。 有許多類型的文件,以及許多方法,你可以使用它們從文件中提取數據來圖形化。 在這裡,我們將展示幾種方法。 首先,我們將使用內置的csv模塊加載CSV文件,然後我們將展示如何使用 NumPy(第三方模塊)加載文件。

<code>import matplotlib.pyplot as plt
import csv

x = []
y = []

with open('example.txt','r') as csvfile:
plots = csv.reader(csvfile, delimiter=',')
for row in plots:
x.append(int(row[0]))
y.append(int(row[1]))

plt.plot(x,y, label='Loaded from file!')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Interesting Graph\\nCheck it out')
plt.legend()
plt.show()123456789101112131415161718/<code>
Python 數據科學入門2:Matplotlib

這裡,我們打開樣例文件,包含以下數據:

<code>1,5
2,3
3,4
4,7
5,4
6,3
7,5
8,7
9,4
10,412345678910/<code>

接下來,我們使用csv模塊讀取數據。 csv讀取器自動按行分割文件,然後使用我們選擇的分隔符分割文件中的數據。 在我們的例子中,這是一個逗號。 注意:csv模塊和csv reader不需要文件在字面上是一個.csv文件。 它可以是任何具有分隔數據的簡單的文本文件。

一旦我們這樣做了,我們將索引為 0 的元素存儲到x列表,將索引為 1 的元素存儲到y列表中。 之後,我們都設置好了,準備繪圖,然後顯示數據。

雖然使用 CSV 模塊是完全正常的,但使用 NumPy 模塊來加載我們的文件和數據,可能對我們更有意義。 如果你沒有 NumPy,你需要按下面的步驟來獲取它。 為了瞭解安裝模塊的更多信息,請參閱 pip 教程。 大多數人應該都能打開命令行,並執行pip install numpy。

如果不能,請參閱鏈接中的教程。

一旦你安裝了 NumPy,你可以編寫如下代碼:

<code>import matplotlib.pyplot as plt
import numpy as np

x, y = np.loadtxt('example.txt', delimiter=',', unpack=True)
plt.plot(x,y, label='Loaded from file!')

plt.xlabel('x')
plt.ylabel('y')
plt.title('Interesting Graph\\nCheck it out')
plt.legend()
plt.show()1234567891011/<code>

結果應該是相同的圖表。 稍後,當我們加載數據時,我們可以利用 NumPy 為我們做一些更多的工作,但這是教程未來的內容。 就像csv模塊不需要一個特地的.csv一樣,loadtxt函數不要求文件是一個.txt文件,它可以是一個.csv,它甚至可以是一個 python 列表對象。

第八章 從網絡加載數據

除了從文件加載數據,另一個流行的數據源是互聯網。 我們可以用各種各樣的方式從互聯網加載數據,但對我們來說,我們只是簡單地讀取網站的源代碼,然後通過簡單的拆分來分離數據。

<code>import matplotlib.pyplot as plt
import numpy as np
import urllib
import matplotlib.dates as mdates


def graph_data(stock):

stock_price_url = 'http://chartapi.finance.yahoo.com/instrument/1.0/'+stock+'/chartdata;type=quote;range=10y/csv'

source_code = urllib.request.urlopen(stock_price_url).read().decode()

stock_data = []
split_source = source_code.split('\\n')

for line in split_source:
split_line = line.split(',')
if len(split_line) == 6:
if 'values' not in line:
stock_data.append(line)1234567891011121314151617181920/<code>

這裡有很多步驟。首先,我們看到import。 pyplot像往常一樣導入,然後導入了numpy,然後是用於訪問互聯網的urllib,然後導入了matplotlib.dates作為mdates,它對於將日期戳轉換為 matplotlib 可以理解的日期很有用。

接下來,我們開始構建我們的graph_data函數。在這裡,我們首先定義包含股票數據的網址。之後,我們寫一些urllib代碼來訪問該 URL,然後使用.read讀取源代碼,之後我們繼續解碼該數據。如果你使用 Python 2,則不必使用decode。

然後,我們定義一個空列表,這是我們將要放置股票數據的地方,我們也開始使用split_source變量拆分數據,以換行符拆分。

現在,如果你去看源代碼,用stock替換 URL 中的+stock+,像 AAPL 那樣,你可以看到大多數頁面數據確實是股票定價信息,但有一些頭信息我們需要過濾掉。為此,我們使用一些基本的過濾,檢查它們來確保每行有 6 個數據點,然後確保術語values不在行中。

現在,我們已經解析了數據,並做好了準備。我們將使用 NumPy:

<code>date, closep, highp, lowp, openp, volume = np.loadtxt(stock_data,
delimiter=',',
unpack=True,
# %Y = full year. 2015
# %y = partial year 15
# %m = number month
# %d = number day
# %H = hours
# %M = minutes
# %S = seconds
# 12-06-2014
# %m-%d-%Y
converters={0: bytespdate2num('%Y%m%d')})12345678910111213/<code>

我們在這裡所做的是,使用numpy的loadtxt函數,並將這六個元素解構到六個變量。 這裡的第一個參數是stock_data,這是我們加載的數據。 然後,我們指定delimiter(這裡是逗號),然後我們指定我們確實想要在這裡解包變量,不是一個變量,而是我們定義的這組變量。 最後,我們使用可選的converters參數來指定我們要轉換的元素(0),以及我們打算要怎麼做。 我們傳遞一個名為bytespdate2num的函數,它還不存在,但我們下面會編寫它。

第九章 時間戳的轉換

本教程的重點是將來自 Yahoo finance API 的日期轉換為 Matplotlib 可理解的日期。 為了實現它,我們要寫一個新的函數,bytespdate2num。

<code>def bytespdate2num(fmt, encoding='utf-8'):
strconverter = mdates.strpdate2num(fmt)
def bytesconverter(b):

s = b.decode(encoding)
return strconverter(s)
return bytesconverter123456/<code>

此函數接受數據,基於編碼來解碼數據,然後返回它。

將此應用於我們的程序的其餘部分:

<code>import matplotlib.pyplot as plt
import numpy as np
import urllib
import matplotlib.dates as mdates

def bytespdate2num(fmt, encoding='utf-8'):
strconverter = mdates.strpdate2num(fmt)
def bytesconverter(b):
s = b.decode(encoding)
return strconverter(s)
return bytesconverter


def graph_data(stock):

stock_price_url = 'http://chartapi.finance.yahoo.com/instrument/1.0/'+stock+'/chartdata;type=quote;range=10y/csv'
source_code = urllib.request.urlopen(stock_price_url).read().decode()
stock_data = []
split_source = source_code.split('\\n')
for line in split_source:
split_line = line.split(',')
if len(split_line) == 6:
if 'values' not in line and 'labels' not in line:
stock_data.append(line)

date, closep, highp, lowp, openp, volume = np.loadtxt(stock_data,
delimiter=',',
unpack=True,
# %Y = full year. 2015
# %y = partial year 15
# %m = number month
# %d = number day
# %H = hours
# %M = minutes
# %S = seconds
# 12-06-2014
# %m-%d-%Y
converters={0: bytespdate2num('%Y%m%d')})


plt.plot_date(date, closep,'-', label='Price')

plt.xlabel('Date')
plt.ylabel('Price')
plt.title('Interesting Graph\\nCheck it out')
plt.legend()
plt.show()


graph_data('TSLA')12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849/<code>

如果你繪製 TSLA,結果圖應該看起來像這樣:

Python 數據科學入門2:Matplotlib


分享到:


相關文章: