利用python進行數據分析--(閱讀筆記一)

以此記錄閱讀和學習《利用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"]
相關文章
相關標籤/搜索