獲取數據 - 咱們將學習如何閱讀文本文件。這些數據包括嬰兒的姓名和1880年出生的嬰兒的數量。
準備數據 - 在這裏,咱們將簡單地看一下數據並確保它是乾淨的。乾淨,個人意思是咱們會看看文本文件的內容並發現任何異常。可能包括缺失的數據,數據中的不一致或任何其餘不合適的數據。若是發現這些問題,咱們將不得不決定如何處理這些記錄。
分析數據 - 咱們將簡單地找出特定年份中流行的取名傾向。
呈現數據 - 經過表格數據和圖表,清楚地向最終用戶顯示特定年份中最受歡迎的取名。html
注意:
確保你已經瀏覽了之前的全部課程,由於之前課程中學到的知識將用於此練習。python
pandas庫用於全部數據分析,不包括一小部分的數據呈現部分。 數據呈現部分須要引入 matplotlib 庫。導入庫是咱們在本課中採起的第一步。數組
#導入本教程所需的全部庫 import matplotlib.pyplot as plt
import pandas as pd
import sys
import matplotlib
from numpy import random
In[2]:
print('Python version ' + sys.version)
print('Pandas version ' + pd.__version__)
print('Matplotlib version ' + matplotlib.__version__)
out[2]:
Python version 3.5.1 |Anaconda custom (64-bit)| (default, Feb 16 2016, 09:49:46) [MSC v.1900 64 bit (AMD64)]
Pandas version 0.20.1
Matplotlib version 1.5.1
數據集將包括1,000個寶寶的名字和當年記錄的出生人數(1880年)。咱們還將添加大量重複項目,以便您屢次看到相同的寶貝名稱。您能夠考慮爲每一個姓名提供多個條目,簡單地說就是全國各地的不一樣醫院報告每一個嬰兒名稱的分娩數量。所以,若是兩家醫院報告了寶寶名稱「Bob」,則數據將具備兩個名稱Bob的值。咱們將首先建立一組隨機的寶寶名字。併發
#嬰兒名字的初始化
names = [ 'Bob' ,'Jessica' ,'Mary' ,'John' ,'Mel' ]
要使用上述五個隨機列表中的1,000個嬰兒名稱,咱們將執行如下操做:app
爲此,咱們將使用函數seed,randint,len,range和zip。dom
random.seed?
random.randint?
len?
range?
zip?
seed(500) - 建立種子函數
randint(low=0,high=len(names)) - 生成一個介於0和列表「names」長度之間的隨機整數.學習
names[n] - 選擇其索引等於n的名稱。.spa
for i in range(n) - 循環直到 i 等於n,即1,2,3,... n。code
random_names = 從名稱列表中選擇一個隨機名並執行此操做n次。
random.seed(500) random_names = [names[random.randint(low=0,high=len(names))] for i in range(1000)] # 輸出前10條記錄 random_names[:10]
生成0到1000之間的隨機數字
births = [random.randint(low=0,high=1000) for i in range(1000)] births[:10]
使用zip函數合併 names 和 births 數據集。
BabyDataSet = list(zip(random_names,births)) BabyDataSet[:10]
咱們基本上完成了建立數據集。咱們如今將使用 pandas 庫將此數據集導出到csv文件中
df 是一個 DataFrame 對象。您能夠將此對象視爲相似於SQL表或Excel電子表格的格式保存了BabyDataSet的內容。下面讓咱們看看df的內容 。
df = pd.DataFrame(data = BabyDataSet, columns=['Names', 'Births']) df[:10]
df.to_csv?
咱們僅使用的參數是 index 和 header。將這些參數設置爲False將會阻止導出索引和標題名稱。更改這些參數的值以更好地瞭解它們的用法。
df.to_csv('births1880.txt',index=False,header=False)
要讀入 txt 文件,咱們將使用pandas函數 read_csv。讓咱們看看這個函數如何使用。
pd.read_csv?
雖然這個函數有不少參數,咱們這裏只簡單地傳遞文本文件的位置。
文件位置在 C:\Users\ENTER_USER_NAME.xy\startups\births1880.txt
Note: 固然,你存放的文件位置不同,你就須要修改它
Location = r'C:\Users\david\notebooks\update\births1880.txt' df = pd.read_csv(Location)
注意字符串前面的r。因爲斜線"\"是特殊轉義字符,所以在字符串前加一個 r 將會忽略整個字符串的轉義。
df.info()
信息說:
要真正看到數據幀的內容,咱們可使用head()函數,默認狀況下它會返回前五個記錄。您還能夠傳入數字n以返回數據幀的前n個記錄。
df.head()
這給咱們帶來了這個練習的第一個問題。該 read_csv 函數處理的第一個記錄在文本文件中爲頭名。這顯然是不正確的,由於文本文件沒有爲咱們提供標題名稱。
爲了糾正這個問題,咱們將傳遞 header 參數給 read_csv 函數並將它設置爲 None (在python中表示爲null)。
df = pd.read_csv(Location, header=None) df.info()
如今讓咱們看看數據框的最後五條記錄
df.tail()
.若是咱們想給列指定名字,咱們必須傳遞另外一個參數names 。咱們也能夠省略 header 參數。
df = pd.read_csv(Location, names=['Names','Births']) df.head(5)
咱們的數據由1880年的嬰兒姓名和出生人數組成。咱們已經知道咱們有1,000條記錄,而且沒有記錄丟失(非空值)。咱們能夠驗證「Names」列仍然只有五個惟一的名稱。
咱們可使用數據幀的 unique 屬性來查找「Names」列的全部一致記錄。
# 方法 1:
df['Names'].unique()
# If you actually want to print the unique values:
for x in df['Names'].unique(): print(x)
# 方法 2:
print(df['Names'].describe())
因爲每一個寶貝名稱都有多個值,所以咱們須要彙總此數據,讓它只會出現一次寶貝名稱。這意味着1,000行將須要變爲5.咱們能夠經過使用groupby函數來實現這一點。
df.groupby?
# Create a groupby object
name = df.groupby('Names') # Apply the sum function to the groupby object df = name.sum() df
要找出最多見的名字或嬰兒出生率最高的名字,咱們能夠執行如下操做之一。
# Method 1:
Sorted = df.sort_values(['Births'], ascending=False) Sorted.head(1)
# Method 2:
df['Births'].max()
在這裏,咱們能夠繪製 Births 列,並標記圖形以顯示最終用戶圖上的最高點。與表格一塊兒,最終用戶清楚地知道 Bob 是數據集中最受歡迎的嬰兒名稱。
# Create graph
df['Births'].plot.bar() print("The most popular name") df.sort_values(by='Births', ascending=False)