以此記錄閱讀和學習《利用Python進行數據分析》這本書中的以爲重要的點!python
第一章:準備工做算法
一、一組新聞文章能夠被處理爲一張詞頻表,這張詞頻表能夠用於情感分析。數據庫
二、大多數軟件是由兩部分代碼組成:少許須要佔用大部分執行時間的代碼,以及大量不常常執行的「粘合劑代碼」。 編程
cython已經成爲python領域中建立編譯型擴展以及對接c/c++代碼的一大途徑。數組
三、在那些要求延遲性很是小的應用程序中(例如高頻交易系統),爲了盡最大可能地優化性能,耗費時間使用諸如C++這樣更低級、更低生產率的語言進行編程也是值得的。安全
四、Python中有一個叫作全局解釋器鎖(GIL)的東西,這是一種防止解釋器同時執行多條python字節碼指令的機制。數據結構
Cython項目能夠集成(OpenMP 一個用於並行計算的C框架),以實現並行處理循環進而大幅度提升數值算法的速度框架
五、Numpy還有一個重要的做用:做爲算法之間傳遞數據的容器。對於數值型數據,Numpy數組在存儲和處理數據時,要比內置的Python數據結構高效的多!dom
六、Pandas提供了大量的適用於金融數據的高性能時間序列功能和工具。Pandas的DataFrame源自於R的data.frame對象。可是R中data.frame提供的功能只是Pandas中DataFrame提供功能的子集。機器學習
七、 Ipython主要用於交互式數據處理和利用matplotlib對數據進行可視化處理。
八、scipy.weave:利用內聯C++代碼加速數組計算的工具。
九、語法糖:一種編程語法,它並不會帶來新的性能,可是會使代碼更易讀、更易寫。
第二章:引言
一、pandas中選擇某一列數據非空:
cframe=df[df.a.notnull()]
二、numpy中的where過濾:
operation_sys=np.where(cframe["a"].str.contains("Windows"),"Windows","Not Windows")
三、按照某一列和對應長度的列表進行分組,並統計該列每一個時區分別制定列表內容出現的次數:
"根據時區和新的操做系統分組" by_tz_os=cframe.groupby(["tz",operation_sys]) by_tz_os.size().unstack().fillna(0)[:5]
四、argsort 函數的使用????
"選取最常出現的時區" indexer=arg_counts.sum(1).argsort() "經過take按照這個順序截取最後10行" count_sub=arg_counts.take(indexer)[-10:] "經過stacked=True 來生成一張條形圖" count_sub.plot(kind="barh",stacked=True) #"將兩種信息都銜接在一塊兒表如今圖表中!"
五、基於機器學習的推薦算法的學習
六、讀取數據庫表數據.dat文件的數據到DataFrame中
unames=["user_id","gender","age","occupation","zip"] users=pd.read_table("{dir}{name}".format(dir=movie_dir,name="users.dat"),sep="::",header=None,names=unames)
七、pandas中的切片算法:
users[:5]
八、三表聯合merge爲一張表(會自動根據重合的字段來進行合併)
data=pd.merge(pd.merge(users,ratings),movies)
九、根據性別計算對每一個電影的平均評分
"按照性別對各電影的評分進行綜合排名。使用pivot_table 方法" mean_ratings=data.pivot_table("rating",columns="gender",index="title",aggfunc="mean") mean_ratings[:5]
十、進一步分析電影評分數據
"過濾掉評分數據不足250條的電影 按照title分組。獲得每組的評分條數" rating_by_title=data.groupby("title").size() active_titles=rating_by_title.ix[rating_by_title>=250] cur_mean_ratings=mean_ratings.ix[active_titles] #從以前的mean_ratings中選取評論數》=250條的數據 "爲了瞭解女性觀衆最喜歡的電影,按照性別‘f’進行降序排列" cur_mean_ratings.sort_index(by="F",ascending=False)[:4]
十一、找到對電影評分分歧大的電影信息
"若是想找到評分分歧最大的電影,則能夠計算電影評分的方差或標準差" rating_std_by_title=data.groupby("title")["rating"].std() "根據active_titles進行過濾" rating_std_by_title=rating_std_by_title.ix[active_titles] "對series進行降序排列" rating_std_by_title=rating_std_by_title.order(ascending=False)
利用python進行數據分析: 第三章:ipython 1、分析每句python執行的時間: %timeit python語句。 eg: "時間分析命令。 用於分析每條命令執行的時間" strings=["Lindsay","Poo","Pandas","Python","Numpy","Scipy"]*100000 %timeit method1=[x for x in strings if x.startswith("Lin")] %timeit method2=[x for x in strings if x[:3]=="Lin"] %timeit會自動屢次執行,以產生一個精確的平均執行時間! 第四章:Numpy基礎:數組和矢量計算 1、Numpy部分功能: 用於對整組數據進行快速運算的標準數學函數(無需編寫循環) 用於集成由C、C++、Fortran等語言編寫的代碼的工具。 2、理解Numpy數組,以及面向數組的計算有利於更高效的使用諸如Pandas之類的工具。 3、Pandas還提供了一些Numpy所沒有的更加領域特定的功能:如時間序列處理等! 4、Numpy能夠像標量同樣進行運算。 import numpy as np data=np.array([[1,2,3,4,5],[6,7,8,9,10]]) data "能夠對整個np.array數組進行標量運算" print data*10 print data+data 5、numpy是同構數據多維容器。 類型相同。 data.shape data.dtype 6、精通面向數組的編程和邏輯思惟方式是成爲Python科學計算牛人的一大關鍵步驟。 七、"使用zeros 和 one 和 empty 構建numpy數組。" np.zeros(8) np.zeros((2,3)) np.ones(5) np.ones((3,4)) np.empty(6) np.empty((3,2)) #認爲np.empty 返回全0數據是不安全的。不少狀況下,返回的是一些未初始化的垃圾值。 8、np.arange(n) 是python中range的數組版 九、"numpy中的astype 能夠將numpy轉換爲特定的類型" data4=data4.astype("string_") data4.dtype data4 10、astype 不管如何都會建立出一個新的數組(原始數據的一份拷貝),幾十新dtype和老的dtype相同也是如此! 11、注意:浮點數(float64和gloat32)只能表示近似的分數值。 在複雜計算中,因爲可能會積累一些浮點錯誤,因子比較操做只能在必定小數位之內有效。 12、數組和標量之間的運算(數組的矢量化) arr=np.array([[1,2,3],[4,5,6]]) arr+arr arr-arr arr*arr 1/arr arr**0.5 13、基本的索引和切片 "Numpy數組的索引和切片" arr=np.arange(10) arr[5] arr[5:8] arr[5:8]=14 arr #注意:數組切片是原始數組的視圖,這意味着數據不會被複制,視圖上的任何修改都會直接反映到源數組上。 arr_slice=arr[5:8] arr_slice[1]=12345 arr_slice arr arr[:]=64 arr #若是想要獲得的是numpy.array切片的一份副本而非視圖,就須要顯式地進行復制操做。如:arr[5:8].copy() 1四、二維數組中,各索引位置上的元素不是標量,而是一維數組。 能夠經過以","分割的列表來訪問某個元素。 arr2=np.array([[1,2,3],[4,5,6],[7,8,9]]) arr2[2] arr2[1,2] arr2[1][2] #後兩種方式是等價的。 15、多維數組切片: 例如: arr2=np.array([[1,2,3],[4,5,6],[7,8,9]]) #print arr2 arr2[:1,:2] #中間用","分割。 16、布爾型索引: "布爾型索引 。 索引列表要和numpy數組的行數一致。 索引列表包含值爲:True 或 False。 " names=np.array(['Bob','Joe','Will','Joe','Joe','Bob','Will']) data=np.random.randn(7,4) "選取name爲 Bob的" names=="Bob" "根據name=='Bob'條件 選擇數據" data[names=='Bob'] data[names=='Bob',2] "選取多個判斷條件時,須要使用 布爾運算符 | 或 &。 多個判斷條件之間用()括起來" (names=='Bob') | (names=='Joe') "利用布爾條件選擇數據" data[(names=='Bob') | (names=='Joe')] "注意:經過布爾型索引選取數組中的數據,將老是建立數據的副本。 即便返回如出一轍的數組也是如此。" "python關鍵字:and 或 or 在布爾型數組中無效!" "將全部負值都設置爲0" data[data<0]=0 "經過一維布爾數組 設置整行 或 整列的值" data[names!='Bob']=7 data 1七、"花式索引:根據指定整數數組進行索引" arr=np.empty((8,4)) #返回數組中數據並非0,而是隨機的未初始化的數值 for i in xrange(8): arr[i]=i arr arr[[3,4,7]] #從0下標開始,取數據。 arr arr[[-2,-5,-6]] 18、reshape "根據多個索引數組 選取數據" data=np.arange(32).reshape(8,4) data data[[1,2,3,4],[3,2,0,1]] #至關於指定座標的點的列表 data[[1,2,3,4]][:,[3,2,0,1]] #先選中全部行切片以後,再選擇列。 "注意:花式索引,和切片不一樣。 老是將數據複製到新數組中!" 19、通用函數:快速的元素級別數組函數 arr=np.arange(10) np.sqrt(arr) np.exp(arr) x=np.random.randn(8) y=np.random.randn(8) np.maximum(x,y) #返回x,y中對應位置的最大值 組成的數組 arr=np.random.randn(7)*5 print arr np.modf(arr) #返回兩個數組,分別爲:小數部分數組和整數部分數組。 20、用數組表達式替換循環的作法,稱之爲:矢量化。 矢量化數組運算比等價的python方式快上一兩個數量級(甚至更多) 2一、"將條件邏輯表現爲 數組運算" xarr=np.array([1,2,3,4,5,6,7,8]) yarr=np.array([2,4,9,16,25,36,49,64]) cond=np.array([True,False,True,False,False,False,True,False]) result=np.where(cond,xarr,yarr) result
一、"用於布爾型數組的方法:在sum cumsum cumprod std 等方法中,布爾類型被強制轉化爲1(True),0(False)" "能夠用sum 對數組中的True的值進行統計" arr=np.random.randn(100) (arr>0).sum() "any 和 all。 any:用於判斷數組中是否存在一個或多個True。 all:數組中是否所有都爲True" arr=np.array([True,False,False]) arr.any() arr=np.array([False,False,False]) arr.any() arr=np.array([True,True]) arr.all() arr=np.array([False,False]) arr.all() "這兩個方法也適用於 非布爾類型數據。 全部非0數值均被當作True" arr=np.array([1,2,0,3,4]) arr.any() arr=np.array([-1,-2]) arr.any() arr.all() 二、"排序 和python中的list同樣。 能夠經過sort方法實現就地排序。 改變了原始數組中數據的順序" arr=np.random.randn(8) print arr arr.sort() print arr arr2=np.random.randn(5,4) print arr2 arr2.sort(1) #多維數組排序 print arr2 arr3=np.random.randn(8) print arr3 print np.sort(arr3) #使用頂級方法 np.sort,返回的是數組的一個已排序的副本。 arr.sort()是在原始數據上就地排序。 三、"惟一化 以及 其餘的集合邏輯" "返回已排好序的惟一數組" names=np.array(["bob","joe","anna","joe","anna"]) np.unique(names) #返回已排序好的惟一數組 ints=np.array([1,2,3,4,5,1,2,3,4,1,2,1]) np.unique(ints) "np.in1d 測試原始數組在另一個數組中的成員資格。 返回一個布爾類型的數組" np.in1d(ints,[4,7,8]) "其餘各類集合操做 :交集、並集、差集、異或 等" 4、numpy進行數據存儲 "存儲和讀取二進制文件 若是沒有填寫後綴:.npy 則numpy在保存的時候會自動添加" arr=np.random.randn(10) np.save("arr",arr) np.load("arr.npy") "numpy 將多個數組添加到亞索文件中。 若是未指定後綴,則會默認添加後綴:.npz 會對各個數組進行延遲加載!" arr2=np.array([[1,2,3],[4,5,6],[7,8,9]]) np.savez("savez",a=arr,b=arr2) np.load("savez.npz")["b"]