數(shù)據(jù)可視化:是關于數(shù)據(jù)視覺表現(xiàn)形式的科學技術(shù)研究。其中,這種數(shù)據(jù)的視覺表現(xiàn)形式被定義為“一種以某種概要形式抽提出來的信息,包括相應信息單位的各種屬性和變量”。
數(shù)據(jù)可視化主要是借助于圖形化手段,清晰有效地傳達與溝通信息。
Power BI、Tableau、Gehpi和Echarts
Python是一個結(jié)合了 解釋性、編譯性、互動性和面向?qū)ο?/strong> 的高級程序設計語言,結(jié)構(gòu)簡單,語法定義清晰。Python最具特色的就是使用縮進來表示代碼塊,不需要使用大括號{}。縮進的空格數(shù)是可變的,但是同一個代碼塊的語句必須包含相同的縮進空格數(shù)。
Python第三方包的安裝方式較多,本書建議采用以下方式進行安裝和管理:
(1)在CMD命令窗口中,使用conda命令進行自動下載安裝,用法如下:
conda install <包名稱列表> #安裝包
conda remove <包名稱列表> #卸載包
conda search<搜索項> #搜索包
conda list #查看所有包
conda update<包名稱> #升級包
(2)在CMD命令窗口中使用pip命令,用法如下:
pip install <包名> #安裝包
pip install--upgrade <包名> #更新包
pip uninstall <包名> #刪除包
也可以在 Jupyter notebook 的cell中運行pip命令執(zhí)行相應的命令,只需在命令前加“!”,如執(zhí)行 !pip install 包名 進行包的安裝。
按 esc 鍵切換為命令模式,按 enter 鍵進入編輯模式
NumPy是在1995年誕生的Python庫 Numeric 的基礎上建立起來的,但真正促使NumPy的發(fā)行的是Python的SciPy庫。 但SciPy中并沒有合適的類似于Numeric中的對于基礎數(shù)據(jù)對象處理的功能 。于是,SciPy的開發(fā)者將SciPy中的一部分和Numeric的設計思想結(jié)合,在2005年發(fā)行了NumPy。
NumPy是Python的一種開源的數(shù)值計算擴展庫。它包含很多功能,如 創(chuàng)建n維數(shù)組(矩陣)、對數(shù)組進行函數(shù)運算、數(shù)值積分 等。 NumPy的誕生彌補了這些缺陷,它提供了兩種基本的對象:
通常來說,ndarray是一個通用的同構(gòu)數(shù)據(jù)容器,即其中的所有元素都需要相同的類型。利用array函數(shù)可創(chuàng)建ndarray數(shù)組。
在NumPy.random模塊中,提供了多種隨機數(shù)的生成函數(shù)。如randint函數(shù)生成指定范圍的隨機整數(shù)來構(gòu)成指定形狀的數(shù)組。
np.random.randint(low, high=None, size=None)
random模塊的常用隨機數(shù)生成函數(shù):
np.reshape(a, newshape, order='C')
數(shù)據(jù)重塑不會改變原來的數(shù)組.
數(shù)組的切片返回的是原始數(shù)組的視圖,不會產(chǎn)生新的數(shù)據(jù),如果需要的并非視圖而是要復制數(shù)據(jù),則可以通過 copy 方法實現(xiàn)。
廣播(broadcasting)是指不同形狀的數(shù)組之間執(zhí)行算術(shù)運算的方式。
w=np.array([2,5,6,3,10])
np.where(w>4)
(array([1, 2, 4], dtype=int64),)
where中 若只有條件 (condition),沒有x和y,則輸出滿足條件元素的 坐標 。這里的坐標以tuple的形式給出,通常原數(shù)組有多少維,輸出的tuple中就包含幾個數(shù)組,分別對應符合條件元素的各維坐標。
Sort函數(shù)對數(shù)據(jù)直接進行排序, 調(diào)用改變原始數(shù)組 ,無返回值。
arr=np.array([7,9,5,2,9,4,3,1,4,3])
print('原數(shù)組:',arr)
print('排序后:',arr.argsort())
#返回值為數(shù)組排序后的下標排列
print('顯示較大的5個數(shù):',arr[arr.argsort()][-5:])
原數(shù)組: [7 9 5 2 9 4 3 1 4 3]
排序后: [7 3 6 9 5 8 2 0 1 4]
顯示較大的5個數(shù): [4 5 7 9 9]
a=[1,5,1,4,3,4,4]
b=[9,4,0,4,0,2,1]
# 先按照a排序,如果a有相同的數(shù)按照b排序
ind=np.lexsort((b,a)) #sort by a,then by b
print('ind:',ind)
tmp=[(a[i],b[i])for i in ind]
print('tmp:',tmp)
ind: [2 0 4 6 5 3 1]
tmp: [(1, 0), (1, 9), (3, 0), (4, 1), (4, 2), (4, 4), (5, 4)]
NumPy中提供了很多用于統(tǒng)計分析的函數(shù),常見的有 sum、mean、std、var、min和max 等。
Numpy中數(shù)組的方法sort、argsort和lexsort分別是指 ___、 將___和___
直接排序x中的元素從小到大排列,提取其對應的index(索引)對數(shù)組或列表按照某一行或列進行排序
Pandas(Python Data Analysis Library)是基于NumPy的數(shù)據(jù)分析模塊,它提供了大量標準數(shù)據(jù)模型和高效操作大型數(shù)據(jù)集所需的工具, 可以說Pandas是使得Python能夠成為高效且強大的數(shù)據(jù)分析環(huán)境的重要因素之一 。
Pandas有三種數(shù)據(jù)結(jié)構(gòu):Series、DataFrame和Panel。
DataFrame的屬性
data.rename(columns=({
'total_bill':'消費總額','tip':'小費','sex':'性別','smoker':'是否抽煙',
'day':'星期','time':'聚餐時間段','size':'人數(shù)'}),inplace=True)
fdata['是否抽煙']===fdata.是否抽煙
data.query( '是否抽煙=="Yes" & 性別=="Male" & 人均消費>15')
data.dropna(subset=['性別','聚餐時間段'],inplace=True)
data.isnull().sum()
df.apply(np.mean)
data.dpplymap(lambda x:'%.3f'%x)
對于DataFrame數(shù)據(jù)排序,通過指定軸方向,使用 sort_index 函數(shù)對行或列索引進行排序。如果要進行列排序,則通過 sort_values 函數(shù)把列名傳給by參數(shù)即可。
df.sum() # 按列進行求和
df.sum(axis=1) # 按行進行求和
利用 describe 方法會對每個數(shù)值型的列數(shù)據(jù)進行統(tǒng)計
Pandas中常用的描述性統(tǒng)計量:
對于類別型特征的描述性統(tǒng)計,可以使用頻數(shù)統(tǒng)計表。Pandas庫中通過unique方法獲取不重復的數(shù)組,利用value_counts方法實現(xiàn)頻數(shù)統(tǒng)計。
groupby方法的參數(shù)及其說明:
data.groupby(data.map(judge)),sum()
使用agg方法聚合數(shù)據(jù)
數(shù)據(jù)透視表(Pivot Table)是數(shù)據(jù)分析中常見的工具之一,根據(jù)一個或多個鍵值對數(shù)據(jù)進行聚合,根據(jù)列或行的分組鍵將數(shù)據(jù)劃分到各個區(qū)域。
pivot_table 函數(shù)格式:
pivot_table(data, values=None, index=None, columns=None,
aggfunc='mean', fill_value=None, margins=False,
dropna=True, margins_name='All')
交叉表是一種特殊的透視表,主要用于計算分組頻率。
crosstab(index, columns, values=None,
rownames=None, colnames=None,
aggfunc=None,
margins=False, dropna=True, normalize=False)
對于數(shù)據(jù)分析而言,數(shù)據(jù)大部分來源于外部數(shù)據(jù),如常用的CSV文件、Excel文件和數(shù)據(jù)庫文件等。Pandas庫將外部數(shù)據(jù)轉(zhuǎn)換為DataFrame數(shù)據(jù)格式,處理完成后再存儲到相應的外部文件中。
文本文件是一種由若干行字符構(gòu)成的計算機文件,它是一種典型的順序文件。
pandas.read_table(filepath_or_buffer, sep=’\t’,
header=’infer’, names=None, index_col=None,
dtype=None, engine=None, nrows=None)
pandas.read_csv(filepath_or_buffer, sep=’,’,
header=’infer’, names=None, index_col=None,
dtype=None, engine=None, nrows=None)
2. 文本文件的存儲
DataFrame.to_csv(path_or_buf=None, sep=’,’, na_rep,
columns=None, header=True, index=True, index_label=None,
mode=’w’, encoding=None)
pandas.read_excel(io, sheetname, header=0,
index_col=None, names=None, dtype)
JSON(JavaScript Object Notation) 數(shù)據(jù)是一種輕量級的數(shù)據(jù)交換格式,因其簡潔和清晰的層次結(jié)構(gòu)使其成為了理想的數(shù)據(jù)交換語言。JSON數(shù)據(jù)使用大括號來區(qū)分表示并存儲。
Pandas通過read_json函數(shù)讀取JSON數(shù)據(jù)。讀取代碼如下:
import pandas as pd
df=pd.read_json(‘FileName’)
df=df.sort_index
Pandas使用 pd.to_json 實現(xiàn)將DataFrame數(shù)據(jù)存儲為JSON文件。
import pandas as pd
import MySQLdb
conn=MySQLdb.connect(host=host,port=port,user=username,passwd=password,db=db_name)
df=pd.read_sql('select * from table_name',con=conn) conn.close()
import pandas as pd
import pymssql
conn=pymssql.connect(host=host, port=port ,user=username, password=password, database=database)
df=pd.read_sql("select * from table_name",con=conn) conn.close()
merge函數(shù)是通過一個或多個鍵將兩個DataFrame按行合并起來,與SQL中的 join 用法類似,Pandas中的數(shù)據(jù)合并merge( )函數(shù)格式如下:
merge合并時默認是 內(nèi)連接 (inner),即返回交集。通過how參數(shù)可以選擇連接方法:左連接(left),右連接(right)和外連接(outer)。
在合并時會出現(xiàn)重復列名,雖然可以人為進行重復列名的修改,但 merge 函數(shù)提供了 suffixes 用于處理該問題:
如果要合并的 DataFrame 之間沒有連接鍵,就無法使用merge方法。pandas中的concat方法可以實現(xiàn),默認情況下會按行的方向堆疊數(shù)據(jù)。如果在列向上連接設置axies=1即可。
如果需要合并的兩個DataFrame存在重復索引,則使用merge和concat都無法正確合并,此時需要使用combine_first方法。
填充缺失值
缺失值所在的特征為數(shù)值型時,通常利用其均值、中位數(shù)和眾數(shù)等描述其集中趨勢的統(tǒng)計量來填充;缺失值所在特征為類別型數(shù)據(jù)時,則選擇眾數(shù)來填充。
在DataFrame中利用duplicates方法判斷各行是否有重復數(shù)據(jù)。 duplicates 方法返回一個布爾值的series,反映每一行是否與之前的行重復。
Pandas通過drop_duplicates刪除重復的行,格式為:
drop_duplicates(self, subset=None, keep=’first’, inplace=False)
簡單的數(shù)據(jù)統(tǒng)計方法中常用散點圖、箱線圖和3σ法則檢測異常值。
箱線圖利用數(shù)據(jù)中的五個統(tǒng)計量(最小值、下四分位數(shù)、中位數(shù)、上四分位數(shù)和最大值)來描述數(shù)據(jù),它也可以粗略地看出數(shù)據(jù)是否具有對稱性、分布的分散程度等信息。
若數(shù)據(jù)服從正態(tài)分布,在3σ原則下,異常值被定義為一組測定值中與平均值的偏差超過3倍標準差的值,因為在正態(tài)分布的假設下,距離平均值3σ之外的值出現(xiàn)的概率小于0.003。因此根據(jù)小概率事件,可以認為超出3σ之外的值為異常數(shù)據(jù)。
離差標準化是對原始數(shù)據(jù)所做的一種線性變換,將原始數(shù)據(jù)的數(shù)值映射到[0,1]區(qū)間。轉(zhuǎn)換公式如下所示。
標準差標準化數(shù)據(jù)
標準差標準化又稱零均值標準化或z分數(shù)標準化,是當前使用最廣泛的數(shù)據(jù)標準化方法。
啞變量( Dummy Variables)是用以反映質(zhì)的屬性的一個人工變量,是量化了的自變量,通常取值為0或1。
散點圖 箱線圖分析 3σ法則,
在Jupyter notebook中進行交互式繪圖,需要執(zhí)行一下語句 % matplotlib notebook
figure():創(chuàng)建一個新的繪圖窗口。
figtext():為figure添加文字
axes():為當前figure添加一個坐標軸
plot():繪圖函數(shù)
polar():繪制極坐標圖
axis():獲取或設置軸屬性的邊界方法(坐標的取值范圍)
clf : 清除當前figure窗口 cla : 清除當前axes窗口
close : 關閉當前figure窗口
subplot : 一個圖中包含多個axes
text(): 在軸上添加文字
title(): 設置當前axes標題
xlabel/ylabel:設置當前X軸或Y軸的標簽
hist():繪制直方圖
hist2d():繪制二維在直方圖
hold :設置當前圖窗狀態(tài);off或者on
imread():讀取一個圖像,從圖形文件中提取數(shù)組
legend():為當前axes放置標簽
pie():繪制餅狀圖
scatter():做一個X和Y的散點圖,其中X和Y是相同長度的序列對象
stackplot():繪制一個堆疊面積圖
acorr():繪制X的自相關函數(shù)
annotate():用箭頭在指定的數(shù)據(jù)點創(chuàng)建一個注釋或一段文本
bar():繪制垂直條形圖 barh():繪制橫向條形圖
barbs():繪制一個倒鉤的二維場
創(chuàng)建子圖
import matplotlib.pyplot as plt
fig=plt.figure()
#不能使用空白的figure繪圖,需要創(chuàng)建子圖
ax1=fig.add_subplot(2,2,1)
ax2=fig.add_subplot(2,2,2)
ax3=fig.add_subplot(2,2,3)
可以用語句 Fig , axes=plt.subplots(2,3) 創(chuàng)建一個新的圖片,然后返回包含了已生成子圖對象的NumPy數(shù)組。數(shù)組axes可以像二維數(shù)組那樣方便地進行索引,如 axes[0,1] 。也可以通過sharex和sharey表明子圖分別擁有相同的x軸和y軸。
fig, axes=plt.subplots(2,3)
調(diào)整子圖周圍的間距: plt.subplots_adjust(wspace=0,hspace=0)
查看matplotlib的rc參數(shù):
import matplotlib as plt
print(plt.rc_params())
常用參數(shù):
Axes:設置坐標軸邊界、顏色、坐標
刻度值大小和網(wǎng)格的顯示;
Figure:設置邊界顏色、圖形大小和子區(qū);
Font:設置字號、字體和樣式;
Grid:設置網(wǎng)格顏色和線型;
Legend:設置圖例和其中的文本顯示;
Lines:設置線條顏色、寬度、線型等;
Savefig:對保存圖像進行單獨設置;
Xtick和ytick:X、Y軸的主刻度和次刻度設置顏色、大小、方向和標簽大小。
import numpy as np
import matplotlib.pyplot as plt
fig,ax=plt.subplots()
plt.rcParams['font.family']=['SimHei']#用來顯示中文標簽
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號
調(diào)用函數(shù)fill_between() 實現(xiàn)曲線下面部分的填充:
plt.fill_between(x, 0, y, facecolor='green', alpha=0.3)
x:第一個參數(shù)表示覆蓋的區(qū)域, x,表示整個x都覆蓋
0:表示覆蓋的下限
y:表示覆蓋的上限是y這個曲線
facecolor:覆蓋區(qū)域的顏色
alpha:覆蓋區(qū)域的透明度[0,1],其值越大,表示越不透明
繪圖時有時需要在圖表中加文本注解
這時可以通過text函數(shù)在指定的位置(x,y)加入文本注解;
通過 annotate() 在指定位置實現(xiàn)指向型注釋。
箱線圖利用數(shù)據(jù)中的五個統(tǒng)計量(最小值、下四分位數(shù)、中位數(shù)、上四分位數(shù)和最大值)來描述數(shù)據(jù),它也可以粗略地看出數(shù)據(jù)是否具有對稱性、分布的分散程度等信息,特別可以用于對幾個樣本的比較。
雷達圖也稱為網(wǎng)絡圖,星圖,蜘蛛網(wǎng)圖,不規(guī)則多邊形,極坐標圖等。雷達圖是以從同一點開始的軸上表示的三個或更多個定量變量的二維圖表的形式顯示多變量數(shù)據(jù)的圖形方法。軸的相對位置和角度通常是無信息的。雷達圖相當于平行坐標圖,軸徑向排列。
(1)WordCloud
(2)jieba
conda install -c conda-forge jieba
(1)首先使用pandas讀取數(shù)據(jù)并將需要分析的數(shù)據(jù)轉(zhuǎn)化為列表;
(2)對獲得的列表數(shù)據(jù)利用分詞工具jieba進行遍歷分詞;
(3)使用WordCloud設置詞云圖片的屬性、掩碼和停用詞,并生成詞云圖像。
查找到當前用戶的配置文件目錄,然后用編輯器打開,修改matplotlibrc文件,即可修改配置參數(shù)。
annotate()
text()
Matplotlib繪圖基本模仿MATLAB繪圖庫,其繪圖風格和MATLAB類似。由于MATLAB繪圖風格偏古典,因此, Python開源社區(qū)開發(fā)了Seaborn繪圖模塊,對Matplotlib進行封裝,繪圖效果更符合現(xiàn)代人的審美 。
Seaborn屬于Matplotlib的一個高級接口,使得作圖更加容易。在多數(shù)情況下使用Seaborn能做出很具吸引力的圖,而使用Matplotlib可以制作具有更多特色的圖。 應該把Seaborn視為Matplotlib的補充,而不是替代物 。
Seaborn通過set函數(shù)實現(xiàn)風格設置繪圖的背景色、風格、字型、字體:
seaborn.set(context='notebook', style='darkgrid', palette='deep', font='sans-serif', font_scale=1, color_codes=True, rc=None)
Seaborn將matplotlib的參數(shù)劃分為兩個獨立的組合。第一組是 設置繪圖的外觀風格 的,第二組主要 將繪圖的各種元素按比例縮放的 ,以至可以嵌入到不同的背景環(huán)境中。控制這些參數(shù)的接口主要有兩對方法:
despine()控制哪個脊柱將被移除。
sinplot()
sns.despine(left=True)
除了選用預設的風格外,可以利用with 語句使用 axes_style() 方法設置臨時繪圖參數(shù)。
with sns.axes_style("darkgrid"):
plt.subplot(2,1,1)
sinplot( )
plt.subplot(2,1, 2)
sinplot(-1)
seaborn中通過 set_context() 設置縮放參數(shù),預設的參數(shù)有 paper, notebook, talk, poster 。默認為 notebook。“paper”、“talk”和“poster” 。
使用 distplot 方法繪制的直方圖與matplotlib是類似的。在 distplot 的參數(shù)中,可以選擇不繪制密度圖。其中的 rug 參數(shù)繪制 毛毯圖 ,可以為每個觀測值繪制小細線(邊際毛毯),也可以單獨用 rugplot 進行繪制。
如果設置 hist 為 False ,則可以直接繪制密度圖而沒有直方圖。
sns.distplot(df_iris['Petal.Width'],hist=False,rug=True)
小提琴圖其實是箱線圖與核密度圖的結(jié)合,箱線圖展示了 分位數(shù) 的位置,小提琴圖則展示了 任意位置的密度 ,通過小提琴圖可以知道哪些位置的密度較高。
在圖中, 白點 是中位數(shù),黑色盒型的范圍是下四分位點到上四分位點,細黑線表示須。 外部形狀即為核密度估計 (在概率論中用來估計未知的密度函數(shù),屬于非參數(shù)檢驗方法之一)。
sns.set_style("whitegrid")
df_iris=pd.read_csv('D:\dataset\iris.csv')
ax=sns.violinplot(x=df_iris['Petal.Length'])
sns.jointplot(x='Petal.Length',y='Petal.Width' ,data=df_iris,kind='kde')
sns.regplot(x='舉手次數(shù)',y='討論次數(shù)',order=4,data=df)
熱力圖是數(shù)據(jù)可視化項目中比較常用的數(shù)據(jù)顯示方式。 熱力圖通過顏色變化程度直觀反應出熱點分布,區(qū)域聚集等數(shù)據(jù)信息 。熱力圖實現(xiàn)過程就是通過簡單的數(shù)學變化,將離散的點信息映射為圖像。
簡述Seaborn繪圖風格設置的內(nèi)容和方法
Seaborn通過set函數(shù)實現(xiàn)風格設置。
seaborn.set(context='notebook', style='darkgrid', palette='deep', font='sans-serif', font_scale=1, color_codes=True, rc=None)
pyecharts是基于Echart圖表的一個類庫,而Echart是百度開源的一個可視化 JavaScript 庫。
pyecharts主要基于web瀏覽器進行顯示,繪制的圖形比較多,包括 折線圖、柱狀圖、餅圖、漏斗圖、地圖、極坐標圖 等,代碼量很少,而且很靈活,繪制出來的圖形很美觀。
圖形繪制過程,基本上所有的圖表類型都是這樣繪制的:
chart_name=Type() #初始化具體類型圖表
chart_name.add() #添加數(shù)據(jù)及配置項
chart_name.render()
#生成本地文件(html/svg/jpeg/png/pdf/gif)
chart_name .render_notebook #在jupyter notebook中顯示
pyecharts 中通過 Funnel 繪制漏斗圖,
儀表盤
平行坐標圖(Parallel Coordinates Plot)是對于具有多個屬性問題的一種可視化方法。在平行坐標圖中,數(shù)據(jù)集的一行數(shù)據(jù)在平行坐標圖中用一條折線表示,縱向是 屬性值 ,橫向是 屬性類別 (用索引表示)
桑基圖(Sankey diagram)即 桑基能量分流圖 ,也叫桑基能量平衡圖。它是一種特定類型的流程圖,圖中延伸的分支的寬度對應數(shù)據(jù)流量的大小,通常應用于能源、材料成分、金融等數(shù)據(jù)的可視化分析。 Pyecharts 中利用 Sankey 繪制桑基圖。
簡述pyecharts中圖表繪制的步驟。
chart_name=Type() #初始化具體類型圖表
chart_name .add() #添加數(shù)據(jù)及配置項
chart_name .render()
#生成本地文件(保存路徑)
chart_name .render_notebook #在jupyter notebook中顯示
Python標準庫中包含了用于日期(date)、時間(time)、日歷(calendar)等功能的數(shù)據(jù)類型,主要會用到datetime、time、calendar模塊,我們主要介紹一下datetime模塊。
time=datetime.time(10,20,15)
print(time)
print(time.hour,time.minute,time.second)
Datetime類數(shù)據(jù)是date類和time類數(shù)據(jù)的組合,通過now函數(shù)可以查看當前的時間。
重采樣是時間序列頻率轉(zhuǎn)換的過程,Pandas中的resample函數(shù)用于各種頻率的轉(zhuǎn)換工作。
在做 時間序列分析 時,經(jīng)常要對時間序列進行平穩(wěn)性檢驗。用Python來進行 平穩(wěn)性檢驗 主要有 時序圖檢驗、自相關圖檢驗以及構(gòu)造統(tǒng)計量進行檢驗 3種方法
時序圖就是普通的時間序列圖,即以時間為橫軸,觀察值為縱軸進行檢驗。利用時序圖可以粗略觀察序列的平穩(wěn)性。
2 自相關圖檢驗
平穩(wěn)序列通常具有短期相關性,即隨著延遲期數(shù)k的增加,平穩(wěn)序列的自相關系數(shù)會很快地衰減向零,而非平穩(wěn)序列的自相關系數(shù)的衰減速度會比較慢。畫自相關圖用到的是 statsmodels 中的 plot_acf 方法。自相關圖中橫軸表示延遲期數(shù),縱軸表示自相關系數(shù)。
3. 利用繪圖判斷序列的平穩(wěn)性比較直觀,但不夠精確,ADF(Augmented Dickey-Fuller)法直接通過 假設檢驗 的方式來驗證平穩(wěn)性。ADF的原假設(H0)和備擇假設(H1)如下:
Python中可以使用 statsmodels 中的 adfuller 方法進行ADF檢驗,直接輸入數(shù)據(jù),即可返回7個數(shù)值。
其中的第一個返回值adf就是ADF方法的檢驗結(jié)果,這個值理論上越負越能拒絕原假設;
第二個返回值pvalue以常用的判斷標準值0.05作為參考,若其值大于0.05,說明支持原假設,反之拒絕原假設,表明該序列是一個平穩(wěn)序列。
若其值大于0.05,說明支持原假設,反之拒絕原假設,表明該序列是一個平穩(wěn)序列。
Scipy是一款用于數(shù)學、科學和工程領域的Python工具包,可以處理插值、積分、優(yōu)化、圖像處理、常微分方程數(shù)值解的求解、信號處理等問題。
SciPy的constants模塊包含了大量用于科學計算的常數(shù)。
from scipy import constants as C
print(C.pi) #圓周率
print(C.golden) #黃金比例
print(C.c) #真空中的光速
print(C.h) #普朗克常數(shù)
print(C.mile) #一英里等于多少米
print(C.inch) #一英寸等于多少米
print(C.degree) #一度等于多少弧度
print(C.minute) #一分鐘等于多少秒
print(C.g) #標準重力加速度
SciPy的special模塊包含了大量函數(shù)庫,包括基本數(shù)學函數(shù)、特殊函數(shù)以及NumPy中的所有函數(shù)。
from scipy import special as S
print(S.cbrt(8)) #立方根
print(S.exp10(3)) #10**3
print(S.sindg(90)) #正弦函數(shù),參數(shù)為角度
print(S.round(3.1)) #四舍五入函數(shù)
print(S.round(3.5))
print(S.round(3.499))
print(S.comb(5,3))
#從5個中任選3個的組合數(shù)
print(S.perm(5,3)) #排列數(shù)
print(S.gamma(4)) #gamma函數(shù)
print(S.beta(10,200)) #beta函數(shù)
print(S.sinc(0)) #sinc函數(shù)
SciPy.linalg 是SciPy中實現(xiàn)線性代數(shù)計算的模塊,常用的導入方式為: from scipy import linalg
在NumPy中,矩陣有矩陣類型和二維數(shù)組兩種表示方法。
矩陣類型數(shù)據(jù)可以用 np.mat() 或 mat.matrix() 創(chuàng)建。
from scipy import linalg
import numpy as np
A=np.mat('[1,2;3,4]')
print('A矩陣為:\n',A)
print('A的轉(zhuǎn)置矩陣為:\n',A.T)
print('A的逆矩陣為:\n',A.I)
矩陣也可以用二維數(shù)組對象表示,數(shù)組對象的矩陣操作與矩陣對象有一定的區(qū)別。
M=np.array([[1,2],[3,4]])
print('M矩陣為:\n',M)
print('M的轉(zhuǎn)置矩陣為:\n',M.T)
print('M的逆矩陣為:\n',linalg.inv(M))
除了通過矩陣的逆求解外可以直接使用 linalg.solve() 函數(shù)求解而且效率更高。
from scipy import linalg
import numpy as np
a=np.array([[1, 3, 5], [2, 5, -1], [2, 4, 7]])
b=np.array([10, 6, 4])
x=linalg.solve(a, b)
print(x)
[-14.31578947 7.05263158 0.63157895]
行列式是一個將方陣映射到標量的函數(shù)。linalg.det()可以計算矩陣的行列式。
M=np.array([[1,2],[3,4]])
linalg.det(M)
-2.0
范數(shù)是數(shù)學上一個類似“長度”的概念。 linalg.norm() 函數(shù)可以計算向量或矩陣的范數(shù)(或者模)。常見范數(shù)及其含義見下表。
M=np.array([[1,2],[3,4]])
print('M矩陣為:\n',M)
print('M矩陣的L范數(shù)為:\n',linalg.norm(M,1)) # 6.0
print('M矩陣的2范數(shù)為:\n',linalg.norm(M,2))
函數(shù) linalg.eig() 可以用來求解特征值和特征向量。
A=np.array([[1,2],[3,4]])
l,v=linalg.eig(A)
print(l)
print(v)
[-0.37228132+0.j 5.37228132+0.j]
[[-0.82456484 -0.41597356]
[ 0.56576746 -0.90937671]]
奇異值分解是一個能適用于任意的矩陣的一種分解的方法。
scikit-learn的PCA算法的背后真正的實現(xiàn)就是用的SVD。
from numpy import *
data=mat([[1,2,3],[4,5,6]])
U,sigma,VT=np.linalg.svd(data)
print('U: ',U)
print('SIGMA:',sigma)
print('VT:',VT)
SciPy.optimize 包提供了幾種常用的優(yōu)化算法,包括用來求有/無約束的多元標量函數(shù)最小值算法,最小二乘法,求有/無約束的單變量函數(shù)最小值算法,還有解各種復雜方程的算法。
使用 SciPy.optimize 模塊的root和fsolve函數(shù)進行數(shù)值求解線性及非線性方程求方程的根。
from scipy.optimize import root
def func(x):
return x*2 + 2 * np.cos(x)
sol=root(func, 0.3)
# 0.3 估計初始值
print (sol)
使用 fmin,fminbound 可以求函數(shù)的極值:
import numpy as np
from matplotlib import pyplot as plt
from SciPy.optimize import fmin,fminbound
def f(x):
return x**2+10*np.sin(x)+1
x=np.linspace(-10,10,num=500)
min1=fmin(f,3) #求3附近的極小值
min2=fmin(f,0) #求0附近的極小值
min_global=fminbound(f,-10,10)
#這個區(qū)域的最小值
print(min1)
print(min2)
print(min_global)
plt.plot(x,f(x))
plt.show()
import matplotlib.pyplot as plt
x=np.linspace(-5,5,20)
y=3.5*x+2.1
y_noise=y+np.random.randn(20)*2
coeff=np.polyfit(x,y_noise,1)
plt.plot(x,y_noise,'x',x,coeff[0]*x+coeff[1])
plt.show()
最小二乘擬合
最小二乘擬合(Least Squares)是一種常用的數(shù)學優(yōu)化技術(shù),通過最小化誤差的平方和在尋找一個與數(shù)據(jù)匹配的最佳函數(shù)。
要使用最小二乘優(yōu)化,需要先定義誤差函數(shù):
def errf(p,x,y):
return y-func(x,*p)
其中,p表示要估計的真實參數(shù),x是函數(shù)的輸入,y表示輸入對應的數(shù)據(jù)值。最小二乘估計對應的函數(shù)為 optimize.leastsq() ,可以利用該函數(shù)和定義的誤差函數(shù),對真實參數(shù)進行最小二乘估計。
from scipy import optimize
def myfunc(x,a,b,w,t):
return a*np.exp(-b*np.sin(w*x+t))
x=np.linspace(0,2*np.pi)
par=[3,2,1.25,np.pi/4]
y=myfunc(x,*par)
y_noise=y+0.8*np.random.randn(len(y))
def errf(p,x,y):
return y-myfunc(x,*p)
c,rv=optimize.leastsq(errf,[1,1,1,1],args=(x,y_noise))
#c返回找到的最小二乘估計
plt.plot(x,y_noise,'x',x,y,x,myfunc(x,*c),':')
plt.legend(['data','actual','leastsq'])
plt.show()
曲線擬合
可以不定義誤差函數(shù),用函數(shù) optimize.curve_fit() 直接對函數(shù)myfunc的參數(shù)直接進行擬合。
p,e=optimize.curve_fit(myfunc,x,y_noise)
print('p是對參數(shù)的估計值:\n',p)
print('e是4個估計參數(shù)的協(xié)方差矩陣:\n',e)
p是對參數(shù)的估計值:
[3.28292536 1.90102739 1.2478838 0.78989363]
e是4個估計參數(shù)的協(xié)方差矩陣:
[[ 0.17453746 -0.05248031 0.01959142 -0.06158022]
[-0.05248031 0.01606779 -0.00572988 0.01801028]
[ 0.01959142 -0.00572988 0.00271714 -0.00854062]
[-0.06158022 0.01801028 -0.00854062 0.02707182]]
稀疏矩陣(Sparse Matrix)是 只有少部分元素值是非零的矩陣 。如果按照正常方式存儲所有元素,則這些矩陣將占用巨大空間,因此,稀疏矩陣只保存非零值及對應的位置。
SciPy.sparse 是SciPy中負責稀疏矩陣的模塊。在SciPy中,根據(jù)存儲方式的不同,可以將稀疏矩陣分為以下幾類:
由于稀疏矩陣數(shù)據(jù)量大,一般不使用普通矩陣作為參數(shù)來構(gòu)建,而是采用非零數(shù)據(jù)點及坐標的形式構(gòu)建。
import numpy as np
from scipy import sparse
sparse.coo_matrix((2,3)) #創(chuàng)建空的稀疏矩陣
A=sparse.coo_matrix([[1,2,0],[0,1,0],[2,0,0]])
#將普通矩陣轉(zhuǎn)為稀疏矩陣
print(A)
print(type(A)) #查看A的類型
print(type(A.tocsc())) #不同類型的稀疏矩陣可以相互轉(zhuǎn)換
v=np.array([1,3,-3])
print(A*v)
data=[1,2,3,4]
rows=[0,0,1,2]
cols=[0,1,2,2]
W=sparse.coo_matrix(data,(rows,cols))
print('稀疏矩陣W:\n',W)
r,c,d=sparse.find(W)
#find()函數(shù)返回非零元素的行、列和具體數(shù)值
print('稀疏矩陣W非零值:\n',r,c,d)
稀疏矩陣W:
(0, 0) 1
(0, 1) 2
(0, 2) 3
(0, 3) 4
稀疏矩陣W非零值:
[0 0 0 0] [0 1 2 3] [1 2 3 4]
簡單的介紹一下SciPy在圖像處理方面的應用,如果專業(yè)做圖像處理當然還是建議使用OpenCV。
圖像平滑是指用于突出圖像的寬大區(qū)域、低頻成分、主干部分或抑制圖像噪聲和干擾高頻成分,使圖像亮度平緩漸變,減小突變梯度,改善圖像質(zhì)量的圖像處理方法。
圖像平滑的方法包括:插值方法,線性平滑方法,卷積法等。
ndimage.median_filter 實現(xiàn)中值濾波。
import numpy as np
from scipy import ndimage
from scipy import misc
import matplotlib.pyplot as plt
%matplotlib inline
image=misc.ascent()
aa=plt.subplot(1,3,1)
plt.title("title")
plt.imshow(image)
plt.axis('off')
plt.subplot(1,3,2)
plt.title("medi_filter")
filter=ndimage.median_filter(image,size=10)
#使用SciPy的中值濾波處理圖片
plt.imshow(filter)
plt.axis('off')
plt.subplot(1,3,3)
plt.title("gausfilter")
blurred_face=ndimage.gaussian_filter(image, sigma=7)
#高斯濾波
plt.imshow(blurred_face)
plt.axis('off')
圖像旋轉(zhuǎn)和銳化
圖像銳化就是補償圖像的輪廓,增強圖像的邊緣及灰度跳變的部分,使圖像變得清晰。圖像銳化處理的目的是 為了使圖像的邊緣、輪廓線以及圖像的細節(jié)變的清晰 。經(jīng)過平滑的圖像變得模糊的根本原因是因為圖像受到了平均或積分運算,因此可以對其進行逆運算(如微分運算)就可以使圖像變的清晰。從頻域來考慮,圖像模糊的實質(zhì)是因為其高頻分量被衰減,因此可以用 高通濾波器來使圖像清晰 。
image=misc.ascent()
#顯示全部圖片
plt.subplot(131)
plt.title("title")
plt.imshow(image)
plt.axis('off')
plt.subplot(132)
rotate=ndimage.rotate(image,60)
plt.title("rotate")
plt.imshow(rotate)
plt.axis('off') #邊緣檢測
plt.subplot(133)
prewitt=ndimage.prewitt(image)
plt.title("prewitt")
plt.imshow(prewitt)
plt.axis('off')
信號處理(signal processing)是指對信號進行提取、變換、分析、綜合等處理,以便抽取出有用信息的過程。信號處理基本的內(nèi)容有變換、濾波、調(diào)制、解調(diào)、檢測以及譜分析和估計等。
Python中的 scipy.signal 模塊專門用于信號處理。
重采樣指將數(shù)據(jù)序列從一個頻率轉(zhuǎn)化為另一個頻率進行處理的過程。將高頻率數(shù)據(jù)轉(zhuǎn)化為低頻率數(shù)據(jù)為降采樣,低頻率轉(zhuǎn)化為高頻率為升采樣。SciPy中的 signal.resample() 函數(shù)可以將信號重采樣成n個點。
卷積是兩個變量在某范圍內(nèi)相乘后求和的結(jié)果。一維卷積常用于序列模型,如自然語言處理領域。二維卷積常用于計算機視覺、圖像處理領域。
卷積是兩個變量在某范圍內(nèi)相乘后求和的結(jié)果。一維卷積常用于序列模型,如自然語言處理領域。二維卷積常用于計算機視覺、圖像處理領域。
信號的表示是信息分析與處理的核心問題之一。在信號分析中,最基本的變量是時間和頻率。
信號一般用時間作為自變量表示,通過時頻變換,信號也可以使用頻率作為自變量表示。常用的變換方法有傅里葉變換、小波變換等。
SciPy中利用 fft 方法將信號從時域變換到頻率,用 ifft 方法 將頻域信號逆變換回時域 。
數(shù)據(jù)擬合的方法: 多項式擬合,最小二乘擬合,曲線擬合
歐式距離distance的代碼:
np.sqrt(np.sum((a-b)**2))
np.hstack((a,b))
每一行中的最大值的代碼。
np.max(array,axis=0)
第二大值的代碼(默認升序排序)
np.unique(array)[-2]
ndmin shape
numpy 維數(shù) 維度
pandas 維度 形狀
Pandas的plot繪制直方圖時,kind取值為hist
密度 kde
散點 scatter
Pandas通過 DataFrame.rename() 函數(shù),傳入需要修改列名的字典形式來修改列名。replace進行數(shù)據(jù)的替換
Pandas要讀取Mysql中的數(shù)據(jù),首先要安裝 MySQLdb 包
Pandas讀取SQL sever中的數(shù)據(jù),首先要安裝 pymssql 包
Matplotlib配置了配色方案和默認設置。有兩種方式可以設置參數(shù),即 全局參數(shù)定制 和 rc參數(shù)設置方法
Matplotlib中繪圖時的參數(shù)alpha用于設置點的透明度。
Seaborn中可以通過 despine 方法移除繪圖上方和右方坐標上不需要的邊框。
在Seaborn中利用 pairplot() 實現(xiàn)數(shù)據(jù)特征的兩兩對比。
pyecharts中通過 Funnel 繪制漏斗圖。
pyecharts利用 Kline 繪制K線圖
pyecharts利用 Gauge 繪制儀表盤。
pyecharts中利用 Sankey 繪制桑基圖。
Scipy中的 constants 模塊包含大量用于科學計算的常數(shù)。
var函數(shù)用作方差統(tǒng)計
使用 rcdefault() 函數(shù)可以將配置文件重置。
處理數(shù)據(jù)缺陷的常用方法 dropna fillna isnull或 notnull
加油!
感謝!
努力!
avaScript 語言中有兩種比較方式,轉(zhuǎn)換類型比較運算符==和嚴格比較運算符===。其中嚴格比較運算符僅當兩個操作數(shù)的類型相同且值相等時才為true。而轉(zhuǎn)換類型比較運算符==會在進行比較之前,將兩個操作數(shù)轉(zhuǎn)換成相同的類型,再來比較。
比較運算符常用語邏輯語句中,它主要是用語判定變量或者值是否相等。
相等運算符==會為兩個不同類型的操作數(shù)轉(zhuǎn)換類型,然后進行嚴格比較。
示例:
console.log(1==1); // true
console.log(1==2); // false
console.log(1==true); // true
console.log(1=='1'); // true
從上述代碼中的1=='1',輸出結(jié)果為 true,就可以看出==相等運算符,在對兩個操作數(shù)進行比較之前,會將兩個操作數(shù)轉(zhuǎn)換成相同的類型。
當使用比較運算符時,如果其中有布爾類型的操作數(shù),值為 true時會轉(zhuǎn)換為1,值為false時會轉(zhuǎn)換為0。
當兩個操作數(shù)都是對象時,JavaScript會比較其內(nèi)部引用,當且僅當他們的引用指向內(nèi)存中的相同對象時才相等,即他們在棧內(nèi)存中的引用地址相同。
嚴格相等運算符===不會對操作數(shù)進行類型轉(zhuǎn)換,只有當值相等并且類型也是相等時才會返回 true。
示例:
console.log(1===1); // true
console.log(1===2); // false
console.log(1===true); // false
console.log(1===false); // false
console.log(1==='1'); // false
從a===c d的比較結(jié)果可以看出,不同類型的值進行比較時,會返回 false。
不等運算符 !=只有當操作數(shù)不相等時才返回true,如果兩操作數(shù)不是同一類型,會將操作數(shù)轉(zhuǎn)為同意類型再進行比較。
示例:
var a=1;
var b=2;
var c='1';
console.log(a !=1); // false
console.log(a !=b); // true
console.log(a !=c); // false
如果兩操作數(shù)為對象類型,JavaScript會比較其內(nèi)部引用地址,僅當他們在內(nèi)存中引用不同對象時不相等。
嚴格不等運算符 !==當操作數(shù)不相等或不同類型時返回 true。
示例:
var a=1;
var b=2;
var c='1';
console.log(a !==1); // false
console.log(a !==b); // true
console.log(a !==c); // true
大于運算符 > ,只有當左操作數(shù)大于右操作數(shù)時才返回 true。
示例:
console.log(5 > 1); // true
console.log(5 > 10); // false
console.log(5 > '5'); // false
大于等于運算符 >=,只有當左操作數(shù)大于或者等于右操作數(shù)時才返回 true。
示例:
console.log(5 >=1); // true
console.log(5 >=5); // true
console.log(5 >=10); // false
console.log(5 >='5'); // true
小于運算符 < ,只有當左操作數(shù)小于右操作數(shù)時才返回 true。
示例:
console.log(5 < 1); // false
console.log(5 < 5); // false
console.log(5 < 10); // true
console.log(5 < '5'); // false
小于運算符 < ,只有當左操作數(shù)小于或者等于右操作數(shù)時才返回 true。
示例:
console.log(5 <=1); // false
console.log(5 <=5); // true
console.log(5 <=10); // true
console.log(5 <='5'); // true
當比較運算涉及類型轉(zhuǎn)換時,JavaScript 會按以下規(guī)則對字符串、數(shù)字、布爾、對象等類型的操作數(shù)進行操作:
s中常用的數(shù)據(jù)類型有:
值類型(基本類型):字符串(String)、數(shù)字(Number)、布爾(Boolean)、對空(Null)、未定義(Undefined)、Symbol。
引用數(shù)據(jù)類型:對象(Object)、數(shù)組(Array)、函數(shù)(Function)。
就以上數(shù)據(jù)類型先舉幾個例子:
// 字符串(String)
let a='word';
// 數(shù)字(Number)
let b=123;
// 布爾(Boolean)
let c=true;
// 對空(Null)
let d=null;
// 未定義(Undefined)
let e;
// Symbol
let f=Symbol('123');
// 對象(Object)
let g={name:'xiangming'};
// 數(shù)組(Array)
let h=[1,2,3,4,5];
// 函數(shù)(Function)
let i=function () {
return 'done';
};
1、最常見的判斷方法:typeof
console.log('a:'+typeof a);
// a:string
console.log('b:'+typeof b);
// b:number
console.log('c:'+typeof c);
// c:boolean
console.log('d:'+typeof d);
// d:object
console.log('e:'+typeof e);
// e:undefined
console.log('f:'+typeof f);
// f:symbol
console.log('g:'+typeof g);
// g:object
console.log('h:'+typeof h);
// h:object
console.log('i:'+typeof i);
// i:function
所以,typeof 在判斷除Object類型的對象時比較方便。
2、判斷已知對象類型的方法:instanceof
console.log('a is string:'+a instanceof String);
// a is string:true
console.log('b is number:'+b instanceof Number);
// b is number:true
console.log('b is number:'+b instanceof number);
// Uncaught ReferenceError: number is not defined
注意:instanceof 后面一定要是對象類型,并且大小寫不能錯,該方法適合一些條件選擇或分支。
3、通用但很繁瑣的方法:prototype(推薦)
// 定義方法獲取變量類型
function var_type(data) {
return Object.prototype.toString.call(data).replace(/^\[object\s(.+)\]$/, '$1').toLowerCase();
}
console.log('a:'+var_type(a));
// a:string
console.log('b:'+var_type(b));
// b:number
console.log('c:'+var_type(c));
// c:boolean
console.log('d:'+var_type(d));
// d:null
console.log('e:'+var_type(e));
// e:undefined
console.log('f:'+var_type(f));
// f:symbol
console.log('g:'+var_type(g));
// g:object
console.log('h:'+var_type(h));
// h:array
console.log('i:'+var_type(i));
// i:function
此方法雖稍顯繁瑣,但只需簡單封裝一個方法即可。
文章最后給大家推薦一個小編自己寫的通用后臺框架云靜Admin通用后臺,小編也是第一次嘗試開源代碼,還望大家不吝賜教。
云靜Admin通用后臺:
http://uadmin.yunj.net.cn/admin
開發(fā)文檔:
https://www.kancloud.cn/worklz/yunj_admin_universal/2009454
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。