python输入一组数据、进行简单的统计_《利用Python进行数据分析》学习笔记——第二章(3)...
1880-2010年間全美嬰兒姓名
用pandas.read_csv加載.txt文件
圖2.1 用read_csv加載.txt文件
DataFrame.names1880中只有births這一列是int型,所有在使用sum()函數他似乎是會默認使用births列進行分組(groupby):
圖2.2 默認對births列進行分組
讀取所有數據,并組裝到一個DataFrame中,再加上一個year字段:
圖2.3 讀取所有數據
range(1880,2011)是因為range是左閉右開的,而2010是最后一個有效統計年度。
frame['year']=year,當沒有指定行的話,那么整個的'year'列都會賦予相同的值。
將所有數據整合到單個DataFrame中:
圖2.4 將所有數據整合到單個DataFrame中
concat默認按行將多個DataFrame組合到一起,pieces是由多個DataFrame組合成的list,所以這些單個的數據而具有各自的索引(index),因此在組合的時候我們需要忽視現在的索引(index),然后concat會為這個新的組合的DataFrame設置新的索引(index)。
如果不設置ignore_index=True這個參數的話,也不會報錯,那樣的話這個DataFrame就會有相同的index。那么,當我們根據這個index進行索引的時候就會將這些擁有相同index的數據全部提取出來:
圖2.4 沒有設置ignore_index=True的索引結果
可以看到正好每個年份都有一個相同的index
利用pivot_table在year和sex級別上進行聚合:
圖2.5 數據透視表
.tail()是輸出最后的5行,.head()的話則是開始的5行。下面是用groupby進行分組的方式:
圖2.6? groupby進行分組
用groupby的話要注意使用.unstack(),不要讓數據堆疊在一起。
畫出圖像:
圖2.7 按性別和年度統計的總出生數
插入prop列,用于存放指定名字的嬰兒數相對于總出生數的比例:
圖2.8 插入prop列
‘用于存放指定名字的嬰兒數相對于總出生數的比例’,這句話我一開始沒有理解,所以對其中定義的add_prop(group)函數的計算結果感到疑惑:
圖2.9 prop的總數
按照我對這句話最初的理解,prop的總數應該為1才對,而結果是262(sum進行浮點計算會丟失精度,因而結果應該是262)。
那么按照這個理解,這句話具體的含義應該是‘指定名字且相同性別的嬰兒相對于同一年份嬰兒的總出生數的比例’(感覺好像有點長,不知道還有沒更簡潔的表達方式):
圖2.10 分組的prop總和
其實還是對groupby這個函數的理解不到位,不然其實通過代碼是可以輕易的反推出題意的。
檢查分組總計值:
圖2.11 分組總計值為1
取出每對sex/year組合的前1000個名字:
圖2.12?取出每對sex/year組合的前1000個名字
這里除了書上的兩種方法,為了讓它看起來更簡潔,就把方法1的函數用lambda代替了。
分析命名趨勢
有了完整的數據集和剛才生成的top1000數據集,我們就可以開始分析各種命名趨勢了。首先將前1000個名字分為男女兩個部分:
圖2.13 布爾型數組索引
生成一張按year和name統計的總出生數的數據透視表:
圖2.14 按year和name統計的總出生數透視表
這里出現了警告,大概意思應該是'year'同時具有兩個屬性,index level (索引水平)和 column label(列標簽),我一開始以為是pivot_table的參數問題,所以用groupby也試了一下,發現依舊出現這樣的警告,也不知道怎么消除。但是問題應該不大,畢竟是可以運行的。
用plot方法繪制名字的曲線圖:
圖2.15 plot方法繪圖
這里的subplots參數分成若干子圖,figsize圖的尺寸,grid網格。生成的圖像:
圖2.16 幾個男孩和女孩名字隨時間變化的使用數量
評估命名多樣性的增長
圖2.16所反映的降低情況可能意味著父母愿意給小孩起常見的名字越來越少。這個假設可以從數據中得到驗證。
一個辦法是計算最流行的1000個名字所占比例:
按year和sex進行聚合并繪圖:
圖2.17 分性別統計的前1000個名字在總出生人數中的比例
通過前1000項的比例降低,可以得知名字的多樣性出現了增長。
另一個辦法是計算占總出生人數前50%的不同名字的數量:
圖2.18 計算cumsum,確定0.5的位置
cumnum()計算前n項的累加和,所以用在這里時要注意排序。
searchsorted()尋找某個數應該插在數組的什么位置上,返回值是Index,也就是說0.5應該插在索引為116的位置,又由于index是從0開始,所以0.5應作為第116+1=117個數添加進去,這里可以看一下index=115和Index=116的數分別是多少:
圖2.19 查看Index=115 和index=116的數據
這里一開始腦子沒有轉過來,還在想0.5明明在二者之間,為什么他應該放在117這個位置。這個問題就和‘小明跑步比賽中超過了第一名,現在他是第幾名’一樣傻。。。
與1900年做比較:
圖2.20 1900年0.5的位置
用一個函數計算各分組的'searcheasored(0.5)+1'值:
圖2.21 計算各分組'searcheasored(0.5)+1'? 的值
這里我犯了一個很大錯誤,書上的程序是“diversity = diversity.unstack('sex')”,這里我寫的時候自作聰明寫成了“diversity.unstack()”,當然在這里的輸出圖表結果是不影響的。但是,在后面繪圖的時候,由于'sex'堆疊在一起,所以輸出的圖和我想要的是有區別的。并且還花費了我大量時間查找錯誤。
另外從這里輸出的DataFrame中的數據帶有括號,而書上的結果是沒有的,這應該又是python3和python2區別了。而且如果沒注意到這個問題,繪圖時就會報錯。
這個簡單函數還是嘗試用lambda寫一下:
圖2.22 用lambda函數計算'searchsorted(0.5)+1'的值
繪制圖表:
先看一下沒堆疊的錯誤的圖:
圖2.23 'sex'堆疊的圖表
當然如果要是完全按照書上來的話是不會出現這樣的問題的(python3還是有其他問題的)
上面說了,DataFrame的結果和書上有區別(帶括號),當我們用這個直接用這個結果繪圖的時候會報這樣的錯:
圖2.24 TypeError
類型錯誤,說我們的DataFrame里沒有數值類型(numeric)
所以先看一下那個帶括號的數據是什么類型:
圖2.25 ndarray類型數據
所以為了將圖像正常輸出來,就要用類型轉換astype(int):
圖2.26 正常輸出的按年度統計的密度表
從圖中可以看出,女孩名字的多樣性總是比男孩高,而且還在變得越來越高
“最后一個字母”的變革
為了了解男孩名字在最后一個字母上的分布發生變化,我首先將全部出生數據在年度、性別以及及末字母上進行了聚合:
圖2.27 末字母聚合
這里的map將傳入的函數依次作用到序列的每個元素,并把結果作為新的Iterator返回。
選出具有一定代表性的三年:
圖2.29 具有代表性的三年
按總出生數對該表進行規范化處理,以計算各性別各末字母占總出生人數的比例:
圖2.30 表規范化處理
這里沒有和書上一樣用數據類型轉換,發現結果還是一樣的,所以先在這去掉,如果后面出現問題,可以更好的理解這里轉換的意義。
生成各年度各性別的條形圖:
圖2.31 程序
圖2.32 男孩女孩名字中各個末字母的比例
fig、axes分別是繪制的圖一些參數,fig主要是繪制的圖中,軸以外的部分;而axes也就是這個坐標軸的參數。
subplots是繪制子圖,在這里將它男成2行1列的圖,axes[0]就是第一行,axes[1]就是第二行。
這里我將參數改一下,就可以稍微理解一些參數的意義:
圖2.33 更改參數測試
從圖2.32可以看出,從20世紀60年代開始,以字母“n”結尾的男孩名字出現了顯著的增長。回到之前創建的那個完整表,按年度和性別對其進行規范化處理,并在男孩名字中選取幾個字母,最后進行轉置以便將各個列做成一個時間序列:
圖3.34 時間序列
這里的.T就是轉置的意思
繪制趨勢圖:
圖3.35 各年出生的男孩中名字以d/n/y結尾的人數比例
變成女孩名字的男孩名字(以及相反情況)
回到top1000數據集,找出其中以“lesl”開頭的一組名字:
圖2.36 找出以“lesl”開頭的名字
這里的.unique()是用于求唯一值,感覺用起來和list里面的set有點像。
這里的['lesl' in x.lower() for x in all_namesl] 又是一個布爾值運算數組,如果看mask的值可以看到:
圖2.38 mask的值
過濾其他的名字,并按名字分組計算出生數以查看相對頻率:
圖2.37?過濾其他的名字,并按名字分組計算出生數以查看相對頻率
pd.isin(values),是否包含數據框中的元素
按性別和年度進行聚合,并按年度進行規范化處理:
圖2.38
按性別和年度進行聚合,并按年度進行規范化處理
這里的.div()我好像之前寫過,不過還是不太熟悉(很尷尬),div主要是用作小數除法。
繪制年度曲線圖:
圖3.39 各年度使用“Lesley型”名字的男女比例
總結
以上是生活随笔為你收集整理的python输入一组数据、进行简单的统计_《利用Python进行数据分析》学习笔记——第二章(3)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 随机组卷python_关于随机自动组卷的
- 下一篇: python字符集_PYTHON 中的字