第1課
創建數據 - 我們從創建自己的數據集開始分析。這可以防止閱讀本教程的最終用戶為得到下面的結果而不得不下載許多文件。我們將把這個數據集導出到一個文本文件中,這樣您就可以獲得從文本文件中一些拉取數據的經驗。
獲取數據 - 我們將學習如何閱讀文本文件。這些數據包括嬰兒的姓名和1880年出生的嬰兒的數量。
准備數據 - 在這里,我們將簡單地看一下數據並確保它是干凈的。干凈,我的意思是我們會看看文本文件的內容並發現任何異常。可能包括缺失的數據,數據中的不一致或任何其他不合適的數據。如果發現這些問題,我們將不得不決定如何處理這些記錄。
分析數據 - 我們將簡單地找出特定年份中流行的取名傾向。
呈現數據 - 通過表格數據和圖表,清楚地向最終用戶顯示特定年份中最受歡迎的取名。
pandas庫用於所有數據分析,不包括一小部分的數據呈現部分。 數據呈現部分需要引入 matplotlib 庫。導入庫是我們在本課中采取的第一步。
#導入本教程所需的所有庫 #在庫中導入特定函數的一般語法: ## from(庫) import(特定庫函數)
from pandas import DataFrame, read_csv
#導入一個庫但沒有函數的一般語法:
## import(庫)as(給庫取一個昵稱/別名)
import matplotlib.pyplot as plt import pandas as pd #我通常這樣導入pandas import sys #確定Python版本號時需要的庫 import matplotlib #僅用於確定Matplotlib版本號
print('Python version ' + sys.version)
print('Pandas version ' + pd.__version__)
print('Matplotlib version ' + matplotlib.__version__)
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
創建數據
數據集將包括5個寶寶的名字和當年記錄的出生人數(1880年)。
# 初始化寶寶姓名和出生人數
names = ['Bob','Jessica','Mary','John','Mel'] births = [968, 155, 77, 578, 973]
為了將這兩個列表合並到一起,我們將使用 zip 函數。
zip?
BabyDataSet = list(zip(names,births)) BabyDataSet
我們基本上完成了創建數據集。我們現在將使用 pandas 庫將此數據集導出到csv文件中
df 是一個 DataFrame 對象。您可以將此對象視為類似於SQL表或Excel電子表格的格式保存了BabyDataSet的內容。下面讓我們看看df的內容 。
df = pd.DataFrame(data = BabyDataSet, columns=['Names', 'Births']) df
將這個數據幀導出到 csv 文件。我們可以命名為文件 births1880.csv。函數 to_csv 用於導出文件。除非另有說明,否則該文件將保存在當前目錄下。
df.to_csv?
我們僅使用的參數是 index 和 header。將這些參數設置為False將會阻止導出索引和標題名稱。更改這些參數的值以更好地了解它們的用法
df.to_csv('births1880.csv',index=False,header=False)
獲取數據
要讀入csv文件,我們將使用pandas函數 read_csv。讓我們看看這個函數如何使用。
read_csv?
雖然這個函數有很多參數,我們這里只簡單地傳遞文本文件的位置。
文件位置在 C:\Users\ENTER_USER_NAME.xy\startups\births1880.csv
Note: 當然,你存放的文件位置不一樣,你就需要修改它
Location = r'C:\Users\david\notebooks\update\births1880.csv' df = pd.read_csv(Location)
注意字符串前面的r。由於斜線"\"是特殊轉義字符,因此在字符串前加一個 r 將會忽略整個字符串的轉義。
df
這給我們帶來了這個練習的第一個問題。該 read_csv 函數處理的第一個記錄在CSV文件中為頭名。這顯然是不正確的,因為文本文件沒有為我們提供標題名稱。
為了糾正這個問題,我們將傳遞 header 參數給 read_csv 函數並將它設置為 None (在python中表示為null)。
df = pd.read_csv(Location, header=None) df
.如果我們想給列指定名字,我們必須傳遞另一個參數names 。我們也可以省略 header 參數。
df = pd.read_csv(Location, names=['Names','Births']) df
您可以將數字[0,1,2,3,4]視為Excel文件中的行號。在pandas中,這些是 數據幀 index 的一部分 。您可以將index視為sql表的主鍵,但 index 是允許重復值的。
[Names, Births] 可以視為列標題,類似於Excel電子表格或sql數據庫中的列標題。
使用過不再需要的csv文件我們可以這樣刪除它
import os os.remove(Location)
准備數據
我們的數據由1880年的嬰兒姓名和出生人數組成。我們已經知道我們有5條記錄,並且沒有記錄丟失(非空值)。
names列是由字母數字(寶貝名稱)組成的字符串。本列中有不良數據的可能性,但在分析時我們不需擔心。在 Births 列應該只包含代表出生在一個特定年份具有特定名稱的嬰兒數目的整數。我們可以檢查所有數據是是否是數據類型整數。這個列有一個浮點數據類型是沒有意義的。在分析時,我們不需擔心任何可能的異常值。
意識到我們無需在“names”列上做的檢查之外,簡單地看一下數據幀里面的數據應該是我們在這個目標階段所需要的。隨着我們在數據分析生命周期中的繼續,我們將有大量的機會來發現數據集的任何問題。
# 檢查每列數據類型
df.dtypes
# 檢查 Births 列類型
df.Births.dtype
正如你可以看到 Births 列的類型是 int64,所以在這個列中不會出現浮點數(十進制數)或字母數字字符。
分析數據
要找出最常見的名字或嬰兒出生率最高的名字,我們可以執行以下操作之一。
- 對數據幀排序並選擇第一行
- 使用 max() 屬性來查找最大值
# 方法 1:
Sorted = df.sort_values(['Births'], ascending=False) Sorted.head(1)
# 方法 2:
df['Births'].max()
呈現數據
在這里,我們可以繪制 Births 列,並標記圖形以顯示最終用戶圖上的最高點。與表格一起,最終用戶清楚地知道 Mel 是數據集中最受歡迎的嬰兒名稱。
plot() 是一個方便的屬性,pandas可以讓你無痛苦地繪制數據幀中的數據。上一節中我們學習了如何找到 Births 列的最大值。現在找到 最大出生數973值的嬰兒姓名看起來有點棘手,讓我們回過頭來看看。
回顧一下:
df ['Names'] - 這是嬰兒名字的整個列表,整個名字列
df ['Births'] - 這是1880年出生數的整個列表,整個Births列
df [‘Births’].max() - 這是在 Births 列中找到的最大值
[df ['Births'] == df ['Births'].max()] 等於 [查找Births列中等於973的所有記錄]
df ['Names'] [df ['Births'] == df ['Births'].max()] 等於 選擇Names列中的所有記錄條件是 [Births列等於973]
另一種方法我們可以使用 Sorted 數據幀:
Sorted ['Names'].head(1).value
str()函數簡單方便地將對象轉換成一個字符串。
In [19]:
# Create graph
df['Births'].plot() # Maximum value in the data set MaxValue = df['Births'].max() # Name associated with the maximum value MaxName = df['Names'][df['Births'] == df['Births'].max()].values # Text to display on graph Text = str(MaxValue) + " - " + MaxName # Add text to graph plt.annotate(Text, xy=(1, MaxValue), xytext=(8, 0), xycoords=('axes fraction', 'data'), textcoords='offset points') print("The most popular name") df[df['Births'] == df['Births'].max()] #Sorted.head(1) can also be used
