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


以此記錄閱讀和學習《利用Python進行數據分析》這本書中的覺得重要的點!

第一章:准備工作

1、一組新聞文章可以被處理為一張詞頻表,這張詞頻表可以用於情感分析。

2、大多數軟件是由兩部分代碼組成:少量需要占用大部分執行時間的代碼,以及大量不經常執行的“粘合劑代碼”。 

     cython已經成為python領域中創建編譯型擴展以及對接c/c++代碼的一大途徑。

3、在那些要求延遲性非常小的應用程序中(例如高頻交易系統),為了盡最大可能地優化性能,耗費時間使用諸如C++這樣更低級、更低生產率的語言進行編程也是值得的。

4、Python中有一個叫做全局解釋器鎖(GIL)的東西,這是一種防止解釋器同時執行多條python字節碼指令的機制。

     Cython項目可以集成(OpenMP 一個用於並行計算的C框架),以實現並行處理循環進而大幅度提高數值算法的速度

5、Numpy還有一個重要的作用:作為算法之間傳遞數據的容器。對於數值型數據,Numpy數組在存儲和處理數據時,要比內置的Python數據結構高效的多!

6、Pandas提供了大量的適用於金融數據的高性能時間序列功能和工具。Pandas的DataFrame源自於R的data.frame對象。但是R中data.frame提供的功能只是Pandas中DataFrame提供功能的子集。

7、 Ipython主要用於交互式數據處理和利用matplotlib對數據進行可視化處理。

8、scipy.weave:利用內聯C++代碼加速數組計算的工具。

9、語法糖:一種編程語法,它並不會帶來新的性能,但是會使代碼更易讀、更易寫。

第二章:引言

1、pandas中選擇某一列數據非空:

cframe=df[df.a.notnull()]

 2、numpy中的where過濾:

operation_sys=np.where(cframe["a"].str.contains("Windows"),"Windows","Not Windows")

 3、按照某一列和對應長度的列表進行分組,並統計該列每個時區分別制定列表內容出現的次數:

"根據時區和新的操作系統分組"
by_tz_os=cframe.groupby(["tz",operation_sys])
by_tz_os.size().unstack().fillna(0)[:5]

 4、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) #"將兩種信息都銜接在一起表現在圖表中!"

5、基於機器學習的推薦算法的學習

6、讀取數據庫表數據.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)

7、pandas中的切片算法:

users[:5]

8、三表聯合merge為一張表(會自動根據重合的字段來進行合並)

data=pd.merge(pd.merge(users,ratings),movies)

9、根據性別計算對每個電影的平均評分

"按照性別對各電影的評分進行綜合排名。使用pivot_table 方法"
mean_ratings=data.pivot_table("rating",columns="gender",index="title",aggfunc="mean")
mean_ratings[:5]

10、進一步分析電影評分數據

"過濾掉評分數據不足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]

11、找到對電影評分分歧大的電影信息

"如果想找到評分分歧最大的電影,則可以計算電影評分的方差或標准差"
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科學計算牛人的一大關鍵步驟。
7、"使用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的數組版
9、"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()
14、二維數組中,各索引位置上的元素不是標量,而是一維數組。 可以通過以","分割的列表來訪問某個元素。
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
17、"花式索引:根據指定整數數組進行索引"
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方式快上一兩個數量級(甚至更多)
21、"將條件邏輯表現為 數組運算"
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
1、"用於布爾型數組的方法:在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()

2、"排序 和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()是在原始數據上就地排序。

3、"唯一化 以及 其他的集合邏輯"
"返回已排好序的唯一數組"
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"]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM