目錄
15.4.6 繪制直方圖
die_visual.py
注意
15.4.7 同時(shí)擲兩個(gè)骰子
dice_visual.py
15.4.8 同時(shí)擲兩個(gè)面數(shù)不同的骰子
different_dice.py
15.5 小結(jié)
第 16 章
16.1 CSV 文件格式
16.1.1 分析 CSV 文件頭
highs_lows.py
注意
16.1.2 打印文件頭及其位置
highs_lows.py
往期快速傳送門??(在文章最后):
感謝大家的支持!歡迎訂閱收藏!專欄將持續(xù)更新!
15.4.6 繪制直方圖
有了頻率列表后,我們就可以繪制一個(gè)表示結(jié)果的直方圖。直方圖是一種條形圖,指出了各 種結(jié)果出現(xiàn)的頻率。創(chuàng)建這種直方圖的代碼如下:
die_visual.py
import pygal
--snip--
# 分析結(jié)果
frequencies = []
for value in range(1, die.num_sides+1):
frequency = results.count(value)
frequencies.append(frequency)
# 對(duì)結(jié)果進(jìn)行可視化
1 hist = pygal.Bar()
hist.title = "Results of rolling one D6 1000 times."
2 hist.x_labels = ['1', '2', '3', '4', '5', '6']
hist.x_title = "Result"
hist.y_title = "Frequency of Result"
3 hist.add('D6', frequencies)
hist.render_to_file('die_visual.svg')
為創(chuàng)建條形圖,我們創(chuàng)建了一個(gè)pygal.Bar()實(shí)例,并將其存儲(chǔ)在hist中(見(jiàn)1)。接下來(lái), 我們?cè)O(shè)置hist的屬性title(用于標(biāo)示直方圖的字符串),將擲D6骰子的可能結(jié)果用作x軸的標(biāo)簽 (見(jiàn)2),并給每個(gè)軸都添加了標(biāo)題。在3處,我們使用add()將一系列值添加到圖表中(向它傳遞要給添加的值指定的標(biāo)簽,還有一個(gè)列表,其中包含將出現(xiàn)在圖表中的值)。最后,我們將這個(gè) 圖表渲染為一個(gè)SVG文件,這種文件的擴(kuò)展名必須為.svg。
要查看生成的直方圖,最簡(jiǎn)單的方式是使用Web瀏覽器。為此,在任何Web瀏覽器中新建一 個(gè)標(biāo)簽頁(yè),再在其中打開(kāi)文件die_visual.svg(它位于die_visual.py所在的文件夾中)。你將看到一 個(gè)類似于圖15-11所示的圖表(為方便印刷,我稍微修改了這個(gè)圖表;默認(rèn)情況下,Pygal生成的 圖表的背景比你在圖15-11中看到的要暗)。
注意
Pygal讓這個(gè)圖表具有交互性:如果你將鼠標(biāo)指向該圖表中的任何條形,將看到與之 相關(guān)聯(lián)的數(shù)據(jù)。在同一個(gè)圖表中繪制多個(gè)數(shù)據(jù)集時(shí),這項(xiàng)功能顯得特別有用。
15.4.7 同時(shí)擲兩個(gè)骰子
同時(shí)擲兩個(gè)骰子時(shí),得到的點(diǎn)數(shù)更多,結(jié)果分布情況也不同。下面來(lái)修改前面的代碼,創(chuàng)建 兩個(gè)D6骰子,以模擬同時(shí)擲兩個(gè)骰子的情況。每次擲兩個(gè)骰子時(shí),我們都將兩個(gè)骰子的點(diǎn)數(shù)相 加,并將結(jié)果存儲(chǔ)在results中。請(qǐng)復(fù)制die_visual.py并將其保存為dice_visual.py,再做如下修改:
dice_visual.py
import pygal
from die import Die
# 創(chuàng)建兩個(gè)D6骰子
die_1 = Die()
die_2 = Die()
# 擲骰子多次,并將結(jié)果存儲(chǔ)到一個(gè)列表中
results = []
for roll_num in range(1000):
1 result = die_1.roll() + die_2.roll()
results.append(result)
# 分析結(jié)果
frequencies = []
2 max_result = die_1.num_sides + die_2.num_sides
3 for value in range(2, max_result+1):
frequency = results.count(value)
frequencies.append(frequency)
# 可視化結(jié)果
hist = pygal.Bar()
4 hist.title = "Results of rolling two D6 dice 1000 times."
hist.x_labels = ['2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']
hist.x_title = "Result"
hist.y_title = "Frequency of Result"
hist.add('D6 + D6', frequencies)
hist.render_to_file('dice_visual.svg')
創(chuàng)建兩個(gè)Die實(shí)例后,我們擲骰子多次,并計(jì)算每次的總點(diǎn)數(shù)(見(jiàn)1)??赡艹霈F(xiàn)的最大點(diǎn)數(shù) 12為兩個(gè)骰子的最大可能點(diǎn)數(shù)之和,我們將這個(gè)值存儲(chǔ)在了max_result中(見(jiàn)2)。可能出現(xiàn)的最 小總點(diǎn)數(shù)2為兩個(gè)骰子的最小可能點(diǎn)數(shù)之和。分析結(jié)果時(shí),我們計(jì)算2到max_result的各種點(diǎn)數(shù)出 現(xiàn)的次數(shù)(見(jiàn)3)。我們?cè)究梢允褂胷ange(2, 13),但這只適用于兩個(gè)D6骰子。模擬現(xiàn)實(shí)世界 的情形時(shí),最好編寫(xiě)可輕松地模擬各種情形的代碼。前面的代碼讓我們能夠模擬擲任何兩個(gè)骰子 的情形,而不管這些骰子有多少面。
創(chuàng)建圖表時(shí),我們修改了標(biāo)題、x軸標(biāo)簽和數(shù)據(jù)系列(見(jiàn)4)。(如果列表x_labels比這里所示 的長(zhǎng)得多,那么編寫(xiě)一個(gè)循環(huán)來(lái)自動(dòng)生成它將更合適。)
運(yùn)行這些代碼后,在瀏覽器中刷新顯示圖表的標(biāo)簽頁(yè),你將看到如圖15-12所示的圖表。
這個(gè)圖表顯示了擲兩個(gè)D6骰子時(shí)得到的大致結(jié)果。正如你看到的,總點(diǎn)數(shù)為2或12的可能性 最小,而總點(diǎn)數(shù)為7的可能性最大,這是因?yàn)樵?種情況下得到的總點(diǎn)數(shù)都為7。這6種情況如下: 1和6、2和5、3和4、4和3、5和2、6和1。
15.4.8 同時(shí)擲兩個(gè)面數(shù)不同的骰子
下面來(lái)創(chuàng)建一個(gè)6面骰子和一個(gè)10面骰子,看看同時(shí)擲這兩個(gè)骰子50 000次的結(jié)果如何:
different_dice.py
from die import Die
import pygal
# 創(chuàng)建一個(gè)D6和一個(gè)D10
die_1 = Die()
1 die_2 = Die(10)
# 擲骰子多次,并將結(jié)果存儲(chǔ)在一個(gè)列表中
results = []
for roll_num in range(50000):
result = die_1.roll() + die_2.roll()
results.append(result)
# 分析結(jié)果
--snip--
# 可視化結(jié)果
hist = pygal.Bar()
2 hist.title = "Results of rolling a D6 and a D10 50,000 times."
hist.x_labels = ['2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12',
'13', '14', '15', '16']
hist.x_title = "Result"
hist.y_title = "Frequency of Result"
hist.add('D6 + D10', frequencies)
hist.render_to_file('dice_visual.svg')
為創(chuàng)建D10骰子,我們?cè)趧?chuàng)建第二個(gè)Die實(shí)例時(shí)傳遞了實(shí)參10(見(jiàn)1)。我們還修改了第一個(gè) 循環(huán),以模擬擲骰子50 000次而不是1000次。可能出現(xiàn)的最小總點(diǎn)數(shù)依然是2,但現(xiàn)在可能出現(xiàn) 的最大總點(diǎn)數(shù)為16,因此我們相應(yīng)地調(diào)整了標(biāo)題、x軸標(biāo)簽和數(shù)據(jù)系列標(biāo)簽(見(jiàn)2)。 圖15-13顯示了最終的圖表??赡苄宰畲蟮狞c(diǎn)數(shù)不是一個(gè),而是5個(gè),這是因?yàn)閷?dǎo)致出現(xiàn)最小 點(diǎn)數(shù)和最大點(diǎn)數(shù)的組合都只有一種(1和1以及6和10),但面數(shù)較小的骰子限制了得到中間點(diǎn)數(shù)的 組合數(shù):得到總點(diǎn)數(shù)7、8、9、10和11的組合數(shù)都是6種。因此,這些總點(diǎn)數(shù)是最常見(jiàn)的結(jié)果,它 們出現(xiàn)的可能性相同。
通過(guò)使用Pygal來(lái)模擬擲骰子的結(jié)果,能夠非常自由地探索這種現(xiàn)象。只需幾分鐘,就可以 擲各種骰子很多次。
15.5 小結(jié)
在本章中,你學(xué)習(xí)了:如何生成數(shù)據(jù)集以及如何對(duì)其進(jìn)行可視化;如何使用matplotlib創(chuàng)建簡(jiǎn) 單的圖表,以及如何使用散點(diǎn)圖來(lái)探索隨機(jī)漫步過(guò)程;如何使用Pygal來(lái)創(chuàng)建直方圖,以及如何 使用直方圖來(lái)探索同時(shí)擲兩個(gè)面數(shù)不同的骰子的結(jié)果。 使用代碼生成數(shù)據(jù)集是一種有趣而強(qiáng)大的方式,可用于模擬和探索現(xiàn)實(shí)世界的各種情形。完 成后面的數(shù)據(jù)可視化項(xiàng)目時(shí),請(qǐng)注意可使用代碼模擬哪些情形。請(qǐng)研究新聞媒體中的可視化,看 看其中是否有圖表是以你在這些項(xiàng)目中學(xué)到的類似方式生成的。 在第16章中,我們將從網(wǎng)上下載數(shù)據(jù),并繼續(xù)使用matplotlib和Pygal來(lái)探索這些數(shù)據(jù)。
第 16 章
下載數(shù)據(jù)
16.1 CSV 文件格式
要在文本文件中存儲(chǔ)數(shù)據(jù),最簡(jiǎn)單的方式是將數(shù)據(jù)作為一系列以逗號(hào)分隔的值(CSV)寫(xiě)入 文件。這樣的文件稱為CSV文件。例如,下面是一行CSV格式的天氣數(shù)據(jù):
2014-1-5,61,44,26,18,7,-1,56,30,9,30.34,30.27,30.15,,,,10,4,,0.00,0,,195
這是阿拉斯加錫特卡2014年1月5日的天氣數(shù)據(jù),其中包含當(dāng)天的最高氣溫和最低氣溫,還有 眾多其他數(shù)據(jù)。CSV文件對(duì)人來(lái)說(shuō)閱讀起來(lái)比較麻煩,但程序可輕松地提取并處理其中的值,這 有助于加快數(shù)據(jù)分析過(guò)程。
注意 這個(gè)項(xiàng)目使用的天氣數(shù)據(jù)是從http://www.wunderground.com/history/下載而來(lái)的。
16.1.1 分析 CSV 文件頭
csv模塊包含在Python標(biāo)準(zhǔn)庫(kù)中,可用于分析CSV文件中的數(shù)據(jù)行,讓我們能夠快速提取感興 趣的值。下面先來(lái)查看這個(gè)文件的第一行,其中包含一系列有關(guān)數(shù)據(jù)的描述:
highs_lows.py
import csv
filename = 'sitka_weather_07-2014.csv'
1 with open(filename) as f:
2 reader = csv.reader(f)
3 header_row = next(reader)
print(header_row)
導(dǎo)入模塊csv后,我們將要使用的文件的名稱存儲(chǔ)在filename中。接下來(lái),我們打開(kāi)這個(gè)文 件,并將結(jié)果文件對(duì)象存儲(chǔ)在f中(見(jiàn)1)。然后,我們調(diào)用csv.reader(),并將前面存儲(chǔ)的文件 對(duì)象作為實(shí)參傳遞給它,從而創(chuàng)建一個(gè)與該文件相關(guān)聯(lián)的閱讀器(reader)對(duì)象(見(jiàn)2)。我們 將這個(gè)閱讀器對(duì)象存儲(chǔ)在reader中。
模塊csv包含函數(shù)next(),調(diào)用它并將閱讀器對(duì)象傳遞給它時(shí),它將返回文件中的下一行。 在前面的代碼中,我們只調(diào)用了next()一次,因此得到的是文件的第一行,其中包含文件頭(見(jiàn) 3)。我們將返回的數(shù)據(jù)存儲(chǔ)在header_row中。正如你看到的,header_row包含與天氣相關(guān)的文件 頭,指出了每行都包含哪些數(shù)據(jù):
['AKDT', 'Max TemperatureF', 'Mean TemperatureF', 'Min TemperatureF',
'Max Dew PointF', 'MeanDew PointF', 'Min DewpointF', 'Max Humidity',
' Mean Humidity', ' Min Humidity', ' Max Sea Level PressureIn',
' Mean Sea Level PressureIn', ' Min Sea Level PressureIn',
' Max VisibilityMiles', ' Mean VisibilityMiles', ' Min VisibilityMiles',
' Max Wind SpeedMPH', ' Mean Wind SpeedMPH', ' Max Gust SpeedMPH',
'PrecipitationIn', ' CloudCover', ' Events', ' WindDirDegrees']
reader處理文件中以逗號(hào)分隔的第一行數(shù)據(jù),并將每項(xiàng)數(shù)據(jù)都作為一個(gè)元素存儲(chǔ)在列表中。 文件頭AKDT表示阿拉斯加時(shí)間(Alaska Daylight Time),其位置表明每行的第一個(gè)值都是日期或 時(shí)間。文件頭Max TemperatureF指出每行的第二個(gè)值都是當(dāng)天的最高華氏溫度??赏ㄟ^(guò)閱讀其他 的文件頭來(lái)確定文件包含的信息類型。
注意
文件頭的格式并非總是一致的,空格和單位可能出現(xiàn)在奇怪的地方。這在原始數(shù)據(jù)文件 中很常見(jiàn),但不會(huì)帶來(lái)任何問(wèn)題。
16.1.2 打印文件頭及其位置
為讓文件頭數(shù)據(jù)更容易理解,將列表中的每個(gè)文件頭及其位置打印出來(lái):
highs_lows.py
--snip--
with open(filename) as f:
reader = csv.reader(f)
header_row = next(reader)
1 for index, column_header in enumerate(header_row):
print(index, column_header)
我們對(duì)列表調(diào)用了enumerate()(見(jiàn)1)來(lái)獲取每個(gè)元素的索引及其值。(請(qǐng)注意,我們刪除 了代碼行print(header_row),轉(zhuǎn)而顯示這個(gè)更詳細(xì)的版本。) 輸出如下,其中指出了每個(gè)文件頭的索引:
0 AKDT
1 Max TemperatureF
2 Mean TemperatureF
3 Min TemperatureF
--snip--
20 CloudCover
21 Events
22 WindDirDegrees
從中可知,日期和最高氣溫分別存儲(chǔ)在第0列和第1列。為研究這些數(shù)據(jù),我們將處理 sitka_weather_07-2014.csv中的每行數(shù)據(jù),并提取其中索引為0和1的值。
關(guān)于“Python”的核心知識(shí)點(diǎn)整理大全37-CSDN博客
關(guān)于“Python”的核心知識(shí)點(diǎn)整理大全25-CSDN博客文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-763491.html
關(guān)于“Python”的核心知識(shí)點(diǎn)整理大全12-CSDN博客文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-763491.html
往期快速傳送門??(在文章最后):
感謝大家的支持!歡迎訂閱收藏!專欄將持續(xù)更新!
到了這里,關(guān)于關(guān)于“Python”的核心知識(shí)點(diǎn)整理大全45的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!