最近,Analysis with Programming加入了Planet Python。我這里來分享一下如何通過Python來開始數據分析。具體內容如下:
專注于為中小企業提供成都網站制作、成都網站設計服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業德江免費做網站提供優質的服務。我們立足成都,凝聚了一批互聯網行業人才,有力地推動了上千多家企業的穩健成長,幫助中小企業通過網站建設實現規模擴充和轉變。
數據導入
導入本地的或者web端的CSV文件;
數據變換;
數據統計描述;
假設檢驗
單樣本t檢驗;
可視化;
創建自定義函數。
數據導入
1
這是很關鍵的一步,為了后續的分析我們首先需要導入數據。通常來說,數據是CSV格式,就算不是,至少也可以轉換成CSV格式。在Python中,我們的操作如下:
import pandas as pd
# Reading data locally
df = pd.read_csv('/Users/al-ahmadgaidasaad/Documents/d.csv')
# Reading data from web
data_url = ""
df = pd.read_csv(data_url)
為了讀取本地CSV文件,我們需要pandas這個數據分析庫中的相應模塊。其中的read_csv函數能夠讀取本地和web數據。
END
數據變換
1
既然在工作空間有了數據,接下來就是數據變換。統計學家和科學家們通常會在這一步移除分析中的非必要數據。我們先看看數據(下圖)
對R語言程序員來說,上述操作等價于通過print(head(df))來打印數據的前6行,以及通過print(tail(df))來打印數據的后6行。當然Python中,默認打印是5行,而R則是6行。因此R的代碼head(df, n = 10),在Python中就是df.head(n = 10),打印數據尾部也是同樣道理
請點擊輸入圖片描述
2
在R語言中,數據列和行的名字通過colnames和rownames來分別進行提取。在Python中,我們則使用columns和index屬性來提取,如下:
# Extracting column names
print df.columns
# OUTPUT
Index([u'Abra', u'Apayao', u'Benguet', u'Ifugao', u'Kalinga'], dtype='object')
# Extracting row names or the index
print df.index
# OUTPUT
Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78], dtype='int64')
3
數據轉置使用T方法,
# Transpose data
print df.T
# OUTPUT
0 ? ? ?1 ? ? 2 ? ? ?3 ? ? 4 ? ? ?5 ? ? 6 ? ? ?7 ? ? 8 ? ? ?9
Abra ? ? ?1243 ? 4158 ?1787 ?17152 ?1266 ? 5576 ? 927 ?21540 ?1039 ? 5424
Apayao ? ?2934 ? 9235 ?1922 ?14501 ?2385 ? 7452 ?1099 ?17038 ?1382 ?10588
Benguet ? ?148 ? 4287 ?1955 ? 3536 ?2530 ? ?771 ?2796 ? 2463 ?2592 ? 1064
Ifugao ? ?3300 ? 8063 ?1074 ?19607 ?3315 ?13134 ?5134 ?14226 ?6842 ?13828
Kalinga ?10553 ?35257 ?4544 ?31687 ?8520 ?28252 ?3106 ?36238 ?4973 ?40140
... ? ? ? 69 ? ? 70 ? ? 71 ? ? 72 ? ? 73 ? ? 74 ? ? 75 ? ? 76 ? ? 77
Abra ? ? ... ? ?12763 ? 2470 ?59094 ? 6209 ?13316 ? 2505 ?60303 ? 6311 ?13345
Apayao ? ... ? ?37625 ?19532 ?35126 ? 6335 ?38613 ?20878 ?40065 ? 6756 ?38902
Benguet ?... ? ? 2354 ? 4045 ? 5987 ? 3530 ? 2585 ? 3519 ? 7062 ? 3561 ? 2583
Ifugao ? ... ? ? 9838 ?17125 ?18940 ?15560 ? 7746 ?19737 ?19422 ?15910 ?11096
Kalinga ?... ? ?65782 ?15279 ?52437 ?24385 ?66148 ?16513 ?61808 ?23349 ?68663
78
Abra ? ? ?2623
Apayao ? 18264
Benguet ? 3745
Ifugao ? 16787
Kalinga ?16900
Other transformations such as sort can be done using codesort/code attribute. Now let's extract a specific column. In Python, we do it using either codeiloc/code or codeix/code attributes, but codeix/code is more robust and thus I prefer it. Assuming we want the head of the first column of the data, we have
4
其他變換,例如排序就是用sort屬性。現在我們提取特定的某列數據。Python中,可以使用iloc或者ix屬性。但是我更喜歡用ix,因為它更穩定一些。假設我們需數據第一列的前5行,我們有:
print df.ix[:, 0].head()
# OUTPUT 0 ? ? 1243 1 ? ? 4158 2 ? ? 1787 3 ? ?17152 4 ? ? 1266 Name: Abra, dtype: int64
5
順便提一下,Python的索引是從0開始而非1。為了取出從11到20行的前3列數據,我們有
print df.ix[10:20, 0:3]
# OUTPUT
Abra ?Apayao ?Benguet
10 ? ?981 ? ?1311 ? ? 2560
11 ?27366 ? 15093 ? ? 3039
12 ? 1100 ? ?1701 ? ? 2382
13 ? 7212 ? 11001 ? ? 1088
14 ? 1048 ? ?1427 ? ? 2847
15 ?25679 ? 15661 ? ? 2942
16 ? 1055 ? ?2191 ? ? 2119
17 ? 5437 ? ?6461 ? ? ?734
18 ? 1029 ? ?1183 ? ? 2302
19 ?23710 ? 12222 ? ? 2598
20 ? 1091 ? ?2343 ? ? 2654
上述命令相當于df.ix[10:20, ['Abra', 'Apayao', 'Benguet']]。
6
為了舍棄數據中的列,這里是列1(Apayao)和列2(Benguet),我們使用drop屬性,如下:
print df.drop(df.columns[[1, 2]], axis = 1).head()
# OUTPUT
Abra ?Ifugao ?Kalinga
0 ? 1243 ? ?3300 ? ?10553
1 ? 4158 ? ?8063 ? ?35257
2 ? 1787 ? ?1074 ? ? 4544
3 ?17152 ? 19607 ? ?31687
4 ? 1266 ? ?3315 ? ? 8520
axis?參數告訴函數到底舍棄列還是行。如果axis等于0,那么就舍棄行。
END
統計描述
1
下一步就是通過describe屬性,對數據的統計特性進行描述:
print df.describe()
# OUTPUT
Abra ? ? ? ?Apayao ? ? ?Benguet ? ? ? ?Ifugao ? ? ? Kalinga
count ? ? 79.000000 ? ? 79.000000 ? ?79.000000 ? ? 79.000000 ? ? 79.000000
mean ? 12874.379747 ?16860.645570 ?3237.392405 ?12414.620253 ?30446.417722
std ? ?16746.466945 ?15448.153794 ?1588.536429 ? 5034.282019 ?22245.707692
min ? ? ?927.000000 ? ?401.000000 ? 148.000000 ? 1074.000000 ? 2346.000000
25% ? ? 1524.000000 ? 3435.500000 ?2328.000000 ? 8205.000000 ? 8601.500000
50% ? ? 5790.000000 ?10588.000000 ?3202.000000 ?13044.000000 ?24494.000000
75% ? ?13330.500000 ?33289.000000 ?3918.500000 ?16099.500000 ?52510.500000
max ? ?60303.000000 ?54625.000000 ?8813.000000 ?21031.000000 ?68663.000000
END
假設檢驗
1
Python有一個很好的統計推斷包。那就是scipy里面的stats。ttest_1samp實現了單樣本t檢驗。因此,如果我們想檢驗數據Abra列的稻谷產量均值,通過零假設,這里我們假定總體稻谷產量均值為15000,我們有:
from scipy import stats as ss
# Perform one sample t-test using 1500 as the true mean
print ss.ttest_1samp(a = df.ix[:, 'Abra'], popmean = 15000)
# OUTPUT
(-1.1281738488299586, 0.26270472069109496)
返回下述值組成的元祖:
t : 浮點或數組類型t統計量
prob : 浮點或數組類型two-tailed p-value 雙側概率值
2
通過上面的輸出,看到p值是0.267遠大于α等于0.05,因此沒有充分的證據說平均稻谷產量不是150000。將這個檢驗應用到所有的變量,同樣假設均值為15000,我們有:
print ss.ttest_1samp(a = df, popmean = 15000)
# OUTPUT
(array([ -1.12817385, ? 1.07053437, -65.81425599, ?-4.564575 ?, ? 6.17156198]),
array([ ?2.62704721e-01, ? 2.87680340e-01, ? 4.15643528e-70,
1.83764399e-05, ? 2.82461897e-08]))
第一個數組是t統計量,第二個數組則是相應的p值
END
可視化
1
Python中有許多可視化模塊,最流行的當屬matpalotlib庫。稍加提及,我們也可選擇bokeh和seaborn模塊。之前的博文中,我已經說明了matplotlib庫中的盒須圖模塊功能。
請點擊輸入圖片描述
2
# Import the module for plotting
import matplotlib.pyplot as plt
plt.show(df.plot(kind = 'box'))
現在,我們可以用pandas模塊中集成R的ggplot主題來美化圖表。要使用ggplot,我們只需要在上述代碼中多加一行,
import matplotlib.pyplot as plt
pd.options.display.mpl_style = 'default' # Sets the plotting display theme to ggplot2
df.plot(kind = 'box')
3
這樣我們就得到如下圖表:
請點擊輸入圖片描述
4
比matplotlib.pyplot主題簡潔太多。但是在本文中,我更愿意引入seaborn模塊,該模塊是一個統計數據可視化庫。因此我們有:
# Import the seaborn library
import seaborn as sns
# Do the boxplot
plt.show(sns.boxplot(df, widths = 0.5, color = "pastel"))
請點擊輸入圖片描述
5
多性感的盒式圖,繼續往下看。
請點擊輸入圖片描述
6
plt.show(sns.violinplot(df, widths = 0.5, color = "pastel"))
請點擊輸入圖片描述
7
plt.show(sns.distplot(df.ix[:,2], rug = True, bins = 15))
請點擊輸入圖片描述
8
with sns.axes_style("white"):
plt.show(sns.jointplot(df.ix[:,1], df.ix[:,2], kind = "kde"))
請點擊輸入圖片描述
9
plt.show(sns.lmplot("Benguet", "Ifugao", df))
END
創建自定義函數
在Python中,我們使用def函數來實現一個自定義函數。例如,如果我們要定義一個兩數相加的函數,如下即可:
def add_2int(x, y):
return x + y
print add_2int(2, 2)
# OUTPUT
4
順便說一下,Python中的縮進是很重要的。通過縮進來定義函數作用域,就像在R語言中使用大括號{…}一樣。這有一個我們之前博文的例子:
產生10個正態分布樣本,其中和
基于95%的置信度,計算和?;
重復100次; 然后
計算出置信區間包含真實均值的百分比
Python中,程序如下:
import numpy as np
import scipy.stats as ss
def case(n = 10, mu = 3, sigma = np.sqrt(5), p = 0.025, rep = 100):
m = np.zeros((rep, 4))
for i in range(rep):
norm = np.random.normal(loc = mu, scale = sigma, size = n)
xbar = np.mean(norm)
low = xbar - ss.norm.ppf(q = 1 - p) * (sigma / np.sqrt(n))
up = xbar + ss.norm.ppf(q = 1 - p) * (sigma / np.sqrt(n))
if (mu low) (mu up):
rem = 1
else:
rem = 0
m[i, :] = [xbar, low, up, rem]
inside = np.sum(m[:, 3])
per = inside / rep
desc = "There are " + str(inside) + " confidence intervals that contain "
"the true mean (" + str(mu) + "), that is " + str(per) + " percent of the total CIs"
return {"Matrix": m, "Decision": desc}
上述代碼讀起來很簡單,但是循環的時候就很慢了。下面針對上述代碼進行了改進,這多虧了?Python專家
import numpy as np
import scipy.stats as ss
def case2(n = 10, mu = 3, sigma = np.sqrt(5), p = 0.025, rep = 100):
scaled_crit = ss.norm.ppf(q = 1 - p) * (sigma / np.sqrt(n))
norm = np.random.normal(loc = mu, scale = sigma, size = (rep, n))
xbar = norm.mean(1)
low = xbar - scaled_crit
up = xbar + scaled_crit
rem = (mu low) (mu up)
m = np.c_[xbar, low, up, rem]
inside = np.sum(m[:, 3])
per = inside / rep
desc = "There are " + str(inside) + " confidence intervals that contain "
"the true mean (" + str(mu) + "), that is " + str(per) + " percent of the total CIs"
return {"Matrix": m, "Decision": desc}
需求:
你需要轉置一個二維數組,將行列互換.
討論:
你需要確保該數組的行列數都是相同的.比如:
arr = [[1, 2, 3], [4, 5, 6], [7,8, 9], [10, 11, 12]]
列表遞推式提供了一個簡便的矩陣轉置的方法:
print [[r[col] for r in arr] for col in range(len(arr[0]))]
[[1, 4, 7, 10], [2, 5, 8, 11],[3, 6, 9, 12]]
另一個更快和高級一些的方法,可以使用zip函數:
print map(list,
zip(*arr))
本節提供了關于矩陣轉置的兩個方法,一個比較清晰簡單,另一個比較快速但有些隱晦.
有時候,數據到來的時候使用錯誤的方式,比如,你使用微軟的ADO接口訪問數據庫,由于Python和MS在語言實現上的差別.
Getrows方法在Python中可能返回的是列值,和方法的名稱不同.本節給的出的方法就是這個問題常見的解決方案,一個更清晰,一個更快速.
在列表遞推式版本中,內層遞推式表示選則什么(行),外層遞推式表示選擇者(列).這個過程完成后就實現了轉置.
在zip版本中,我們使用*arr語法將一維數組傳遞給zip做為參數,接著,zip返回一個元組做為結果.然后我們對每一個元組使用list方法,產生了列表的列表(即矩陣).因為我們沒有直接將zip的結果表示為list,
所以我們可以我們可以使用itertools.izip來稍微的提高效率(因為izip并沒有將數據在內存中組織為列表).
import itertools
print map(list,
itertools.izip(*arr))
但是,在特定的情況下,上面的方法對效率的微弱提升不能彌補對復雜度的增加.
關于*args和**kwds語法:
*args(實際上,*號后面跟著變量名)語法在Python中表示傳遞任意的位置變量,當你使用這個語法的時候(比如,你在定義函數時使用),Python將這個變量和一個元組綁定,并保留所有的位置信息,
而不是具體的變量.當你使用這個方法傳遞參數時,變量可以是任意的可迭代對象(其實可以是任何表達式,只要返回值是迭代器).
**kwds語法在Python中用于接收命名參數.當你用這個方式傳遞參數時,Python將變量和一個dict綁定,保留所有命名參數,而不是具體的變量值.當你傳遞參數時,變量必須是dict類型(或者是返回值為dict類型的表達式).
如果你要轉置很大的數組,使用Numeric Python或其它第三方包,它們定義了很多方法,足夠讓你頭暈的.
相關說明:
zip(...)
zip(seq1 [,
seq2 [...]]) - [(seq1[0], seq2[0] ...),
(...)]
Return a
list of tuples, where each tuple contains the i-th element
from each of
the argument sequences. The returned list is truncated
in length to
the length of the shortest argument sequence.
有些Python小白對numpy中的常見函數不太了解,今天小編就整理出來分享給大家。
Numpy是Python的一個科學計算的庫,提供了矩陣運算的功能,其一般與Scipy、matplotlib一起使用。其實,list已經提供了類似于矩陣的表示形式,不過numpy為我們提供了更多的函數。
數組常用函數
1.where()按條件返回數組的索引值
2.take(a,index)從數組a中按照索引index取值
3.linspace(a,b,N)返回一個在(a,b)范圍內均勻分布的數組,元素個數為N個
4.a.fill()將數組的所有元素以指定的值填充
5.diff(a)返回數組a相鄰元素的差值構成的數組
6.sign(a)返回數組a的每個元素的正負符號
7.piecewise(a,[condlist],[funclist])數組a根據布爾型條件condlist返回對應元素結果
8.a.argmax(),a.argmin()返回a最大、最小元素的索引
改變數組維度
a.ravel(),a.flatten():將數組a展平成一維數組
a.shape=(m,n),a.reshape(m,n):將數組a轉換成m*n維數組
a.transpose,a.T轉置數組a
數組組合
1.hstack((a,b)),concatenate((a,b),axis=1)將數組a,b沿水平方向組合
2.vstack((a,b)),concatenate((a,b),axis=0)將數組a,b沿豎直方向組合
3.row_stack((a,b))將數組a,b按行方向組合
4.column_stack((a,b))將數組a,b按列方向組合
數組分割
1.split(a,n,axis=0),vsplit(a,n)將數組a沿垂直方向分割成n個數組
2.split(a,n,axis=1),hsplit(a,n)將數組a沿水平方向分割成n個數組
數組修剪和壓縮
1.a.clip(m,n)設置數組a的范圍為(m,n),數組中大于n的元素設定為n,小于m的元素設定為m
2.a.compress()返回根據給定條件篩選后的數組
數組屬性
1.a.dtype數組a的數據類型
2.a.shape數組a的維度
3.a.ndim數組a的維數
4.a.size數組a所含元素的總個數
5.a.itemsize數組a的元素在內存中所占的字節數
6.a.nbytes整個數組a所占的內存空間7.a.astype(int)轉換a數組的類型為int型
數組計算
1.average(a,weights=v)對數組a以權重v進行加權平均
2.mean(a),max(a),min(a),middle(a),var(a),std(a)數組a的均值、最大值、最小值、中位數、方差、標準差
3.a.prod()數組a的所有元素的乘積
4.a.cumprod()數組a的元素的累積乘積
5.cov(a,b),corrcoef(a,b)數組a和b的協方差、相關系數
6.a.diagonal()查看矩陣a對角線上的元素7.a.trace()計算矩陣a的跡,即對角線元素之和
以上就是numpy中的常見函數。更多Python學習推薦:PyThon學習網教學中心。
我先來一個舉例:
arr = np.arange(16).reshape((2, 2, 4))
arr的array是這樣的
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
我們對arr進行transpose轉置,arr2 = arr.transpose((1,0,2)),結果是這樣:
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
這是怎么來的呢。
arr.transpose((1,0,2))的1,0,2三個數分別代表shape()的三個數的順序,初始的shape是(2,2,4),也就是2維的2 x 4矩陣,索引分別是shape的[0],[1],[2],arr.transpose((1,0,2))之后,我們的索引就變成了shape[1][0][2],對應shape值是shape(2,2,4),所以矩陣形狀不變。
與此同時,我們矩陣的索引也發生了類似變化,如arr中的4,索引是arr[0,1,0],arr中的5是arr[0,1,1],變成arr2后,4的位置應該是在[1,0,0],5的位置變成[1,0,1],同理8的索引從[1,0,0]變成[0,1,0]。
分享名稱:python中轉置函數 pytorch轉置函數的用法
文章鏈接:http://m.newbst.com/article44/dojeeee.html
成都網站建設公司_創新互聯,為您提供域名注冊、云服務器、虛擬主機、手機網站建設、定制開發、
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯