- 數(shù)據(jù)準(zhǔn)備和特征工程:數(shù)據(jù)工程師必知必會技能
- 齊偉
- 6125字
- 2020-06-05 17:00:52
1.1 文件中的數(shù)據(jù)
文件是計算機科學(xué)中的常用術(shù)語。文件能用于保存數(shù)據(jù),而且是多種多樣的,如文本文件、圖像文件和辦公軟件生成的二進制文件等。不同文件中的數(shù)據(jù)也有差別,有的數(shù)據(jù)是結(jié)構(gòu)化的,有的數(shù)據(jù)是非結(jié)構(gòu)化的。本節(jié)將向讀者介紹數(shù)據(jù)科學(xué)項目中常用到的三種文件,并重點演示如何從文件中讀取數(shù)據(jù)。
結(jié)構(gòu)化數(shù)據(jù)是指關(guān)系型數(shù)據(jù)庫中用二維表格表達和存儲的數(shù)據(jù),每個數(shù)據(jù)有嚴(yán)格的數(shù)據(jù)格式和規(guī)范。非結(jié)構(gòu)化數(shù)據(jù)(如圖像、視頻等)則不能用二維表格形式表達和存儲。
1.1.1 CSV文件
CSV(Comma-Separated Values,逗號分隔值)是以純文本方式保存數(shù)據(jù)的常用文件格式,其中的數(shù)據(jù)屬于結(jié)構(gòu)化數(shù)據(jù)。
基礎(chǔ)知識
用電子表格工具軟件可以打開CSV文件,如圖1-1-1所示。

圖1-1-1 用電子表格工具軟件打開的CSV文件
處理電子表格文件的常用工具,包括微軟的Excel和WPS中的電子表格軟件,也可以使用在線電子表格,如騰訊文檔。
讀者對電子表格軟件一定不陌生,本書不再贅述操作方法。在數(shù)據(jù)科學(xué)項目實踐中,也會有很多場景應(yīng)用這類軟件,請讀者不要排斥。一切工具的目的都是得到符合預(yù)期的數(shù)據(jù)。只不過因為電子表格軟件不是本書的重點內(nèi)容,所以后面不再提及該工具,但不意味著不可以應(yīng)用它。
下面重點說明使用Python編程語言讀取CSV文件的數(shù)據(jù)。

path是本書開發(fā)環(huán)境中的數(shù)據(jù)集目錄,讀者要根據(jù)自己的開發(fā)環(huán)境進行修改。
In[1]第5行里的“# ①”表示注釋,程序執(zhí)行時忽略此內(nèi)容。


老齊教室微信掃描二維碼,關(guān)注我的公眾號
為了便于學(xué)習(xí),可以按照“前言”中的說明關(guān)注與本書相關(guān)的微信公眾號,從而獲得學(xué)習(xí)用數(shù)據(jù)集和加入在線實驗平臺。在代碼示例中,用“/jiangsu/cities.csv”方式表示此文件在數(shù)據(jù)源目錄中的地址。
附錄A:簡要介紹Jupyter。
以上代碼在Jupyter notebook中調(diào)試。Jupyter是數(shù)據(jù)科學(xué)中常用的工具——詳細(xì)使用方法請閱讀“擴展探究”中推薦的資料。
用Python標(biāo)準(zhǔn)庫的csv模塊能夠讀取CSV文件內(nèi)容,但在In[1]的①中得到的是一個迭代器對象,必須使用循環(huán)語句才能將文件中每一行讀入內(nèi)存,這使得后續(xù)操作很不方便。開發(fā)者不允許存在任何“不方便”,因為會降低工作效率,并且,CSV文件是常見的保存數(shù)據(jù)的文件。因此,必然有更簡單且能夠更適用于后續(xù)操作的方法——如果沒有,則是創(chuàng)新的機會。
Python語言生態(tài)中的Pandas提供了實現(xiàn)上述訴求的函數(shù)——關(guān)于Pandas的使用方法請閱讀“擴展探究”中推薦的資料。當(dāng)然,如果讀者對In[2]的②所示的函數(shù)不滿意,也可以自己創(chuàng)造。
關(guān)于“迭代器”對象,請參閱《Python大學(xué)實用教程》(電子工業(yè)出版社出版)。
附錄C:簡要介紹Pandas。

比較Out[2]和In[1]的輸出,此處的結(jié)果在顯示方式上友好了很多。不僅如此,這里所得到的對象(變量df引用)是數(shù)據(jù)科學(xué)項目中用途最廣泛的DataFrame類型的對象。
In[2]的②使用Pandas的read_csv函數(shù)讀取了指定的CSV文件,此函數(shù)的完整參數(shù)列表是:
DataFrame是Pandas中的一種對象類型,類似于二維表格。

不需要對這些參數(shù)的含義死記硬背,可以使用幫助文檔了解。建議讀者瀏覽一遍pd.read_csv函數(shù)的幫助文檔,當(dāng)以后需要處理某個特殊問題的時候,可以再次借助幫助文檔,查詢相應(yīng)參數(shù)。

在Jupyter中輸入In[3]的代碼并執(zhí)行,能夠顯示函數(shù)read_csv的完整文檔,其中包含對所有參數(shù)的解釋。
例如,在Out[2]輸出的二維數(shù)據(jù)表格中,以數(shù)字序號表示索引。在讀取此CSV文件的時候,也可以通過參數(shù)指定文件中的某一列作為索引。

In[4]中函數(shù)read_csv增設(shè)了參數(shù)index_col=0,意思是用CSV文件的第0列作為索引,最終得到了Out[4]輸出效果。
在In[2]的②中讀取到CSV文件之后,返回的是DataFrame對象(②中用變量df引用此對象),有的資料將DataFrame翻譯為“數(shù)據(jù)框”,本書使用英文名稱。
推薦閱讀《跟老齊學(xué)Python:數(shù)據(jù)分析》(電子工業(yè)出版社出版),系統(tǒng)化了解Pandas的各項知識。
項目案例
1.項目描述
讀取“/kaggle/diabetes.csv”數(shù)據(jù),并了解此數(shù)據(jù)集的概況。
2.實現(xiàn)過程

In[5]的③讀取指定的CSV文件,得到了變量diabetes引用的DataFrame對象。④通過DataFrame實例的屬性shape得到了diabetes的形狀,Out[5]的輸出結(jié)果表示diabetes共有765行、9列。如果直接調(diào)用diabetes,就會將所有內(nèi)容顯示出來(讀者可以在Jupyter中嘗試),在頁面上占用較多篇幅,為避免這種情況,可以顯示部分樣本。

In[6]中出現(xiàn)的head方法是DataFrame對象常用的顯示部分樣本的方法,默認(rèn)顯示前5個,傳入整數(shù)類型的參數(shù),就可以根據(jù)指定數(shù)量顯示樣本。
與head方法類似的,還有tail和sample方法。

比較In[7]和In[8]的執(zhí)行結(jié)果,了解二者的異同。

In[7]和In[8]的功能類似,能夠顯示出DataFrame對象中每列的數(shù)據(jù)類型。
動手練習(xí)
1.先在github.com網(wǎng)站完成用戶注冊和登錄操作,然后完成如下操作。
●在本地計算機安裝git,熟悉常用的git命令。
●在github.com網(wǎng)站創(chuàng)建個人公開代碼倉庫。
●應(yīng)用git的push命令將本地指定目錄中的文件上傳到個人的代碼倉庫中。
git是源碼管理工具,目前已經(jīng)被普遍采用。
本題目與《Python大學(xué)實用教程》的“練習(xí)和編程1”第5題相呼應(yīng),建議讀者查閱有關(guān)資料,完成本題各項操作。
2.參考本書附錄或者推薦的書籍,完成如下操作。
(1)在本地計算機安裝并運行Jupyter。
(2)在本地計算機安裝Pandas、Numpy。
3.用Pandas讀取“/bicycle/Bicycle_Counts.csv”文件的數(shù)據(jù),并完成如下操作。
(1)以第1列為索引,并顯示前10個樣本。
(2)返回此數(shù)據(jù)集的樣本總數(shù)。
(3)將(1)所顯示的數(shù)據(jù)保存到一個新的CSV文件中。

擴展探究
1.Jupyter是基于瀏覽器的代碼編輯工具,在數(shù)據(jù)科學(xué)中被廣泛采用,其官方網(wǎng)站是https://jupyter.org/。建議讀者根據(jù)網(wǎng)站文檔安裝此工具,并學(xué)會使用。
2.Numpy和Pandas是Python語言在數(shù)據(jù)科學(xué)中的重要工具,使用Python語言的數(shù)據(jù)科學(xué)項目都必須使用它們。本書在后續(xù)各種操作中會對涉及的一些函數(shù)(方法)給予必要的介紹,但是不能替代讀者系統(tǒng)化學(xué)習(xí)。建議閱讀《跟老齊學(xué)Python:數(shù)據(jù)分析》,系統(tǒng)學(xué)習(xí)Numpy和Pandas的有關(guān)知識。

3.在數(shù)據(jù)科學(xué)中,安裝第三方模塊(包)的方式,依然可以使用Python語言中常用的pip命令(參閱《Python大學(xué)實用教程》)。此外,還有另一個專門的數(shù)據(jù)科學(xué)集成開發(fā)工具Anaconda(官方網(wǎng)站:https://www.anaconda.com/),安裝此工具之后,數(shù)據(jù)科學(xué)中常用的模塊(包)就已經(jīng)集成在其中,未集成進來的其他模塊一般也提供了conda命令的安裝方法。更詳細(xì)的內(nèi)容請查閱官方文檔(https://docs.anaconda.com/)。
1.1.2 Excel文件
Excel文件也是常用于保存數(shù)據(jù)的文件,《Python大學(xué)實用教程》的9.2.2節(jié)專門介紹了如何使用Python第三方包讀/寫此類文件,請讀者參閱。本節(jié)將重點介紹如何用Pandas從Excel文件中讀取數(shù)據(jù)。
基礎(chǔ)知識
在Jupyter中輸入pd.read_,然后按下Tab鍵,就可以出現(xiàn)如圖1-1-2所示的效果,從這里可以看到多個以“read”開始的函數(shù)名稱——Python中規(guī)范的命名方式遵循著“望文生義”的原則。

圖1-1-2 Tab鍵輔助記憶
利用Tab鍵可以查找函數(shù),減輕記憶負(fù)擔(dān)。
在學(xué)習(xí)和工作過程中,都應(yīng)該充分利用幫助文檔。In[3]演示了獲得pd.read_csv函數(shù)幫助信息的方法,用同樣的方法,也可以查看pd.read_excel函數(shù)的文檔內(nèi)容。

依然建議讀者認(rèn)真閱讀文檔內(nèi)容,了解此函數(shù)的基本使用方法。在幫助文檔的后面,通常還會有學(xué)習(xí)示例。
下面就使用這個函數(shù)讀取Excel文件的數(shù)據(jù)。

path為In[1]中創(chuàng)建的變量。

除了如In[10]中的代碼那樣讀取Excel文件,還可以利用電子表格軟件將Excel文件轉(zhuǎn)化為CSV文件,然后利用Pandas的read_csv函數(shù)讀取文件。
如果將已有的數(shù)據(jù),如DataFrame類的數(shù)據(jù),保存為Excel或者CSV文件,應(yīng)當(dāng)如何操作?
繼續(xù)使用如圖1-1-2所示的方法,在Jupyter中輸入“jiangsu.to_”,然后按Tab鍵,顯示如圖1-1-3所示的結(jié)果。

圖1-1-3 保存為某種文件的函數(shù)
從這里可以看到,DataFrame對象實例保存為某種格式文件的方法(用這種方法找到解決1.1.1節(jié)“動手練習(xí)”中第3題所需要的方法)。讀者應(yīng)該認(rèn)真觀察圖1-1-2和圖1-1-3顯示的函數(shù)(方法)名稱,從而了解到Pandas可以讀、寫什么格式的文件。

在Jupyter中執(zhí)行shell命令查看當(dāng)前目錄內(nèi)容的方式:

即在命令前面寫上“!”符號(英文狀態(tài))。
如果沒有報錯和其他顯示,則說明已經(jīng)保存成功。若不放心,可以到目錄中查看是否已有保存的文件。
項目案例
1.項目描述
從“國家數(shù)據(jù)”網(wǎng)站(http://data.stats.gov.cn/)下載“全國居民消費價格分類指數(shù)”,并用柱形圖表示指數(shù)的變化。
2.實現(xiàn)過程
打開“國家數(shù)據(jù)”網(wǎng)站,完成注冊、登錄步驟,然后根據(jù)導(dǎo)航信息,進入如圖1-1-4所示的界面,下載所顯示的數(shù)據(jù)。

圖1-1-4 下載“全國居民消費類價格分類指數(shù)”
由于日期不同,讀者打開此頁面所看到的數(shù)據(jù)可能與圖1-1-4有所差異。
將下載的文件更名為cpi.xls,用電子表格軟件打開之后的基本樣式如圖1-1-5所示。

圖1-1-5 Excel文件內(nèi)容部分截圖
可以利用電子表格軟件對數(shù)據(jù)進行整理。因本書為了演示Pandas的應(yīng)用,故在此無過多的操作。
在Jupyter中,利用pd.read_excel函數(shù)讀入此文件。

因受篇幅所限,以上只顯示部分列,請讀者在調(diào)試的時候查看全部列的內(nèi)容。
對照圖1-1-5,理解缺失值產(chǎn)生的原因。
從顯示內(nèi)容可知,這個數(shù)據(jù)集不能直接用于繪圖,比如第0行,都是缺失值(用NaN表示);第1行是所統(tǒng)計的年月。因此,對該數(shù)據(jù)需要整理。

⑥是DataFrame的切片操作。
In[13]中的代碼,使用了多種DataFrame對象有關(guān)方法和切片操作,最終將Out[12]所顯示的數(shù)據(jù)變換為如Out[13]顯示的樣子。下面對In[13]中的代碼逐行進行簡要說明:
⑤替換了數(shù)據(jù)集中列的名稱,變成對應(yīng)的年月。
⑥截取Out[12]所顯示的第2行及其以下的數(shù)據(jù)。
⑦刪除索引號為11和12的兩行,并更新原有數(shù)據(jù)集(inplace=True)。
⑧增加一列,對應(yīng)于每行的統(tǒng)計指標(biāo),即簡化原來的“指標(biāo)”列的表述。
⑨刪除“指標(biāo)”列,并更新數(shù)據(jù)集。
⑩重新規(guī)劃索引,刪除原來的,實現(xiàn)從0開始重建索引,并更新數(shù)據(jù)集。
?將列索引的名字設(shè)置為空,并更新數(shù)據(jù)集。

注意區(qū)分由數(shù)字組成的字符串與整數(shù)、浮點數(shù)的不同。字符串不能參與數(shù)學(xué)運算。
這個反饋信息表明,每列中的數(shù)字,比如102.3,直觀地看是浮點數(shù),但Pandas并不認(rèn)為它是浮點數(shù)(顯示為object),所以,還要將每列的數(shù)據(jù)類型轉(zhuǎn)換成浮點數(shù)。

In[15]的操作是“特征數(shù)值化”(詳見3.1節(jié))。
cpi.columns[: -1]得到的是數(shù)據(jù)集中除最右列名稱外的其他列名稱,然后用循環(huán)語句將每列的數(shù)據(jù)轉(zhuǎn)換為浮點數(shù)(pd.to_numeric(cpi[column])。
下面使用Matplotlib繪制柱形圖。為了簡化,僅繪制一個指標(biāo)的各月指數(shù)的柱形圖。

對于In[16]第1行代碼中的“#?”,讀者在調(diào)試程序的時候不要輸入。

建議讀者參閱“動手練習(xí)”中的第1題,繼續(xù)優(yōu)化此圖不完美(如圖底部數(shù)字重疊)的顯示結(jié)果。
用類似方法,可以繪制其他各項指標(biāo)的柱形圖。
但是,請讀者特別注意,上述圖示并非完美。這里只初步了解實現(xiàn)數(shù)據(jù)可視化的方法。
?的作用是聲明將所繪制圖像插入當(dāng)前Jupyter所在瀏覽器中。注意,這一句必須在且只能在代碼塊的第1行。
?引入繪圖模塊,通常更名為plt。
?繪制柱形圖,兩個參數(shù)分別為x軸和y軸的數(shù)據(jù)。
?為柱形圖繪制網(wǎng)格,以便比較觀察各個柱的高度。
動手練習(xí)
1.在本地計算機上安裝Matplotlib,并根據(jù)有關(guān)資料掌握初步的繪圖方法。推薦以下文獻資料:
①《跟老齊學(xué)Python:數(shù)據(jù)分析》。
②在線圖書《案例上手Python數(shù)據(jù)可視化》(通過本書作者微信公眾號“老齊教室”查閱)。
2.讀取數(shù)據(jù)“/jiangsu/jiangsu.xls”,并繪制各個城市面積(area列)的柱形圖。
3.改進“基礎(chǔ)知識”中In[10]讀取Excel文件的方法,要求將原Excel文件的第1列(“name”列)指定為所得到的DataFrame對象的索引。
4.利用Matplotlib,繪制In[10]所得數(shù)據(jù)中“population”列的箱線圖。
箱線圖(Box plot)是一種常見的統(tǒng)計圖,能顯示數(shù)據(jù)集中的最大、最小值;上、中、下分位數(shù);平均值;離群值。
擴展探究
1.查閱有關(guān)統(tǒng)計學(xué)資料,理解常見的柱形圖、餅圖、折線圖、箱線圖、散點圖等統(tǒng)計圖的含義。
2.?dāng)?shù)據(jù)可視化是數(shù)據(jù)科學(xué)項目中普遍應(yīng)用的技術(shù)。Matplotlib是用途廣泛且歷史悠久的數(shù)據(jù)可視化工具,其官方網(wǎng)站是https://matplotlib.org/。建議讀者熟練掌握此工具的基本應(yīng)用方法。
1.1.3 圖像文件
圖像文件很常見,“它里面也保存了數(shù)據(jù)嗎?”
通常,圖像可以分為“位圖”和“矢量圖”兩類。文件擴展名為“.jpg”“.jif”“.png”的圖像文件是位圖;文件擴展名為“.swf”“.pdf”“.svg”的是矢量圖。位圖由很多點組成(稱為“點陣”,點就是像素),每個點以0~255之間的整數(shù)表示一種灰度級別,不同的灰度級別代表了紅、綠、藍(RGB)的比例,即表示了一種顏色。矢量圖記錄的是繪制圖像的方法,不是點陣數(shù)據(jù),方法中包含了點的坐標(biāo)值和填充顏色的值等信息。本書下述內(nèi)容只討論位圖。
基礎(chǔ)知識
在Python語言生態(tài)中,Pillow是常用的圖像處理庫(Python Imaging Library,PIL),具有強大的圖像處理功能,其官方網(wǎng)站是https://pillow.readthedocs.io/。Pillow的基本安裝方法如下:

利用上述方式安裝,可能因為本地缺少某些依賴程序而無法執(zhí)行Pillow。如果遇到此類情況,可先參考官方網(wǎng)站及報錯信息,然后安裝或者升級所缺乏的工具。
很多工具包依賴其他程序。用pip安裝,通常會自動檢查并安裝各種依賴程序。若遇到例外,則需要單獨安裝。
安裝完成之后,用下面的方式實現(xiàn)從本地讀取圖像文件的操作。

In[16]的代碼塊中引入了Pillow包中的Image模塊(如?所示),并用此模塊的open函數(shù)讀入一個圖像文件(如?所示)。?是惰性操作,雖然文件已被打開,但數(shù)據(jù)并未被從文件中讀取到內(nèi)存,直到執(zhí)行后續(xù)操作。
讀入的彩色圖像可以轉(zhuǎn)化為黑白的(灰度圖像)。
對圖像的處理是數(shù)據(jù)科學(xué)的一個重要方向。

In[16]和In[17]得到的是Image類型的實例對象,它具有Numpy的數(shù)組接口,因此能夠執(zhí)行In[18]中的操作。
當(dāng)圖像文件被讀入之后,就可以將其轉(zhuǎn)化為Numpy的數(shù)組類型(也可以轉(zhuǎn)化為矩陣類型)。

In[16]讀入的圖像高為407px(像素)、寬為396px,上面顯示的不論是彩色圖像還是黑白圖像所對應(yīng)的數(shù)組都要有兩個維度對應(yīng)于圖像的高和寬,只是彩色圖像又多出一個維度。
對圖像文件的操作,還有另外一個更常用的庫OpenCV,其官方網(wǎng)站:https://opencv.org/。安裝方法如下:
各種工具包的官方網(wǎng)站都有較詳細(xì)的安裝和使用說明,請務(wù)必認(rèn)真閱讀。

下面演示如何使用OpenCV讀取圖像文件。

In[20]利用OpenCV(?引入的模塊)的imread函數(shù)讀入了圖像文件,其中第2個參數(shù)用0表示將讀入的文件灰度化(轉(zhuǎn)化為黑白圖像)。從結(jié)果可知,讀入文件之后所得對象是數(shù)組類型的對象。要想再次顯示該圖像,可進行如下操作:

In[21]將表示圖像文件的數(shù)組對象轉(zhuǎn)化為圖像,并顯示到當(dāng)前的Jupyter瀏覽器中。此功能還可以使用In[16]代碼塊中引入的Image模塊實現(xiàn):

在Python中,讀入圖像文件的方式不止以上兩種,我們已經(jīng)反復(fù)應(yīng)用的matplotlib也具有此功能。
項目案例
1.項目描述
先讀取一個圖像文件,然后完成如下操作:
●截取圖像的一部分并顯示。
●對得到的黑白圖像進行翻轉(zhuǎn),并顯示翻轉(zhuǎn)后的效果。
2.實現(xiàn)過程
截取圖像表現(xiàn)在對數(shù)組的操作上就是“切片”。先簡單了解數(shù)組的切片操作:
“切片”是數(shù)組、DataFrame對象的重要操作。


更詳細(xì)的“數(shù)組切片”知識,請參閱《跟老齊學(xué)Python:數(shù)據(jù)分析》的第1章內(nèi)容。
下面演示如何用“切片”操作實現(xiàn)“截圖”。

In[26]中的img是形狀為(407, 396)的二維數(shù)組(見In[19]、In[20]),“50: 260”表示對數(shù)組沿0軸方向切片,表現(xiàn)在圖像上為縱向截圖;“100: 280”表示沿1軸方向切片,在圖像上為橫向截圖。最終得到了Out[26]的結(jié)果。
如果“翻轉(zhuǎn)”圖像,可以通過數(shù)組的運算實現(xiàn)。
思考:在“255 - img”中為什么使用255?可以使用其他數(shù)字嗎?

現(xiàn)在廣泛使用數(shù)碼照相技術(shù),此前的相機主要用“膠卷”成像。這種“底片”在醫(yī)院能見到。
“翻轉(zhuǎn)”之后顯示了“底片”效果,實現(xiàn)方式就是執(zhí)行了?的運算。
動手練習(xí)
1.除了“基礎(chǔ)知識”中所演示的讀入圖像文件的方法,還有很多其他途徑,比如matplotlib也提供了實現(xiàn)此操作的方法。請參考matplotlib的官方文檔和其他有關(guān)資料,編寫讀取圖像文件的程序。
2.自選兩幅圖像文件,并利用“項目案例”中所演示的“截圖”方法,各在兩幅圖中截取一部分,然后合并為一幅圖并顯示。
“圖的合并”就是數(shù)組的連接/合并,可以使用pd.concat、pd.merge,兩者的區(qū)別請讀者參閱《跟老齊學(xué)Python:數(shù)據(jù)分析》。
擴展探究
1.在In[26]中,利用OpenCV讀取了彩色的圖像文件之后,將其轉(zhuǎn)化為灰度格式(黑白圖)。函數(shù)imread的完整形式是:

flags表示圖像文件的加載模式。請查閱有關(guān)資料,回答如下問題:
●OpenCV中的圖像文件都有哪些加載模式?參數(shù)flags的可取值及相應(yīng)的含義是什么?
●讀入彩色文件并顯示。對比顏色是否與原來的一致?如果不一致,是什么原因造成的?
2.參考《跟老齊學(xué)Python:數(shù)據(jù)分析》的第1章,全面理解數(shù)組的切片、連接、分割等基本操作。
- 大數(shù)據(jù)戰(zhàn)爭:人工智能時代不能不說的事
- 腦動力:C語言函數(shù)速查效率手冊
- Hands-On Neural Networks with Keras
- 計算機網(wǎng)絡(luò)應(yīng)用基礎(chǔ)
- 空間傳感器網(wǎng)絡(luò)復(fù)雜區(qū)域智能監(jiān)測技術(shù)
- 讓每張照片都成為佳作的Photoshop后期技法
- 21天學(xué)通Visual C++
- Visual C++編程全能詞典
- 四向穿梭式自動化密集倉儲系統(tǒng)的設(shè)計與控制
- 網(wǎng)絡(luò)安全技術(shù)及應(yīng)用
- Extending Ansible
- 學(xué)練一本通:51單片機應(yīng)用技術(shù)
- 精通LabVIEW程序設(shè)計
- MongoDB 4 Quick Start Guide
- Xilinx FPGA高級設(shè)計及應(yīng)用