Choose one of Udacity's curated datasets and investigate it using NumPy and Pandas. Go through the entire data analysis process, starting by posing a question and finishing by sharing your findings.
P2的課已經(jīng)達(dá)到要求了泽西,雖然code重新提交了兩次才通過,完整的報(bào)告已經(jīng)放在了自己的github上鹉戚,點(diǎn)這里, 不過這一個(gè)學(xué)到了太多新的東西杭抠,還是需要好好消化一下骂维,完善一下筆記。
目錄(簡書竟然不支持目錄!)
ANACONDA 和 JUPYTER NOTEBOOKS
數(shù)據(jù)分析過程
用Numpy和Pandas分析一維數(shù)據(jù)
用Numpy和Pandas分析二維數(shù)據(jù)
ANACONDA AND JUPYTER NOTEBOOKS
這兩個(gè)對(duì)我來說是用于數(shù)據(jù)分析的新工具冰单,但是感覺非常的好的用,有幾個(gè)我認(rèn)為比較重要的指令:
conda upgrade --all
conda install jupyter notebook #安裝jupyter notebook
conda create -n py2 python=2 #用于創(chuàng)造一個(gè)新的python2的環(huán)境灸促,py2可替換成任意環(huán)境名字
jupyter notebook #啟動(dòng)notebook
一開始我創(chuàng)建新指令之后诫欠,在notebook中并沒有能夠找到我新環(huán)境的選項(xiàng)涵卵,如圖所示:
后來我才發(fā)現(xiàn),在創(chuàng)建了心的conda環(huán)境之后荒叼,其實(shí)要再安裝一遍jupyter notebook轿偎,不然不會(huì)在界面中顯示出來。
在Jupyter notebook中書寫格式主要是代碼和markdown被廓。其實(shí)之前接觸過一點(diǎn)markdown坏晦,所以不算陌生,基本寫法可以參考這里嫁乘,再有昆婿,對(duì)數(shù)據(jù)分析比較重要的是數(shù)學(xué)公式的書寫,可以參考這里亦渗。
數(shù)據(jù)分析過程
讀取CSV
with open(filename, 'rb') as f:
reader = unicodecsv.DictReader(f)
result = list(reader)
(之后pandas提供了更簡單的函數(shù)挖诸,這個(gè)基本現(xiàn)在用不上了)
注意在數(shù)據(jù)處理過程中,用int(), float()對(duì)數(shù)據(jù)根據(jù)要求進(jìn)行相應(yīng)的轉(zhuǎn)換法精。
雖然說只要過一遍計(jì)算機(jī)導(dǎo)論多律,python就夠用了,其實(shí)還是有些新的內(nèi)容搂蜓,又學(xué)了幾個(gè)寫法:
#在dictionary中遍歷的方法狼荞,a,b in [dictionary].item(), a是key, b是值,比如:
for key, data_points in grouped_data.items()
#values()--This method returns a list of all the values available in a given dictionary.
total_minutes = total_minutes_by_account.values()
#set()的使用帮碰,利用set()相味,可以建立一個(gè)沒有重復(fù)項(xiàng)的合集,比如:
pass_subway_project = set()
關(guān)于set()更多的用法可以參考這里
pyplot的使用
%pylab inline #可以讓圖標(biāo)在notebook中直接打開
import matplotlib.pyplot as plt
import numpy as np #縮寫
# Summarize the given data
def describe_data(data,bin = None):
print 'Mean:', np.mean(data)
print 'Standard deviation:', np.std(data)
print 'Minimum:', np.min(data)
print 'Maximum:', np.max(data)
if bin == None:
plt.hist(data)
else:
plt.hist(data, bins = bin)
這里的describe_data
我引入了兩個(gè)parameters
殉挽,data
和bin =None
丰涉,這是從cs101地方學(xué)來的,如果用的時(shí)候不考慮bin斯碌,我在用函數(shù)時(shí)候一死,只要填寫data這個(gè)參量就可以,如果要設(shè)定bin傻唾,填寫數(shù)字參量投慈。然后在function內(nèi)添加一個(gè)if判斷就可以實(shí)現(xiàn)了。
用Numpy和Pandas分析一維數(shù)據(jù)
Numpy作為python的數(shù)據(jù)庫冠骄,可以進(jìn)行多項(xiàng)運(yùn)算
具體的代碼筆記已經(jīng)放在github上伪煤。
在code review中,reviewer給我推薦了用 kernel density estimates,來理清性別和生存率的關(guān)系凛辣,他給我了這么一張圖抱既,我覺得挺高大上的,于是我就研究了一個(gè)下午:
kde(kernel density estimation)是核密度估計(jì)扁誓。核的作用是根據(jù)離散采樣蝙砌,估計(jì)連續(xù)密度分布阳堕。
參考了知乎的一篇文章跋理,寫的很生動(dòng)(python的seaborn.kdeplot有什么用?)(https://www.zhihu.com/question/43415333)雖然大部分我還是沒看懂
seaborn中有個(gè)seaborn.kdeplot就是用來算這個(gè)的择克,我的目標(biāo)是先把1D data的搞清楚:
import seaborn as sns
female_df_age = titanic_df[titanic_df['Sex'] == 'female']['Age'].dropna()
#注意這種df[df[] ==""]按照條件提取相對(duì)應(yīng)數(shù)組的手法
male_df_age = titanic_df[titanic_df['Sex'] == 'male']['Age'].dropna()
sns.kdeplot(female_df_age, shade=True, shade_lowest=False,label='Female')
sns.kdeplot(male_df_age, shade=True, shade_lowest=False,label='Male')
最后畫出來了這是樣的,我就可以根據(jù)隨意一個(gè)年齡去推算他的在船上出現(xiàn)的概率前普,然后與生存率相結(jié)合著來看(其實(shí)說實(shí)話我覺得他的那個(gè)圖好看是好看肚邢,可還是有點(diǎn)看不懂)
用Numpy和Pandas分析二維數(shù)據(jù)
具體的代碼筆記已經(jīng)放在github上,這一塊有三個(gè)筆記拭卿,包括了最后的制圖骡湖。
Pandas里dataframes的幾個(gè)join方式
這個(gè)也是比較搞腦子的,參數(shù)不一樣合并的結(jié)果不一樣峻厚,重點(diǎn)注意how這個(gè)參量的變化响蕴,outer是全部合并,inner是合并除了有無效值的row, right保留右邊的數(shù)據(jù)(雖然合并之后左邊會(huì)是無效值)left就恰好相反惠桃,詳細(xì)的還是要看完整的合并指南浦夷,每次忘記怎么合并了,再看看辜王。
當(dāng)兩邊的df數(shù)據(jù)key值不一樣劈狐,要用left_on和right_on來對(duì)左右數(shù)據(jù)做一一的匹配才能保證正確合并。
Matlab的使用
這一塊要再有空的時(shí)候繼續(xù)加強(qiáng)呐馆,特別是作圖的時(shí)候肥缔,熟悉幾個(gè)用法還是很重要的。
Pyplot tutorial
pandas.DataFrame.plot
其實(shí)我有時(shí)候會(huì)搞混的汹来,現(xiàn)在終于知道個(gè)大概:
*New in version 0.17.0:* Each plot kind has a corresponding method on the DataFrame.plot accessor:
df.plot(kind='line') is equivalent to df.plot.line()
.
這章節(jié)已經(jīng)完結(jié)(2017年1月7日)