Python程式設計遇問題,文科生怎麼辦?

王樹義發表於2017-10-29

敲黑板了啊,答疑時間到。如果你沒有良好的Python程式設計基礎,在嘗試應用資料科學方法時遇到了問題和困難,又不知道該如何有效解決,那麼這篇文章就是為你寫的。請務必認真閱讀喲。

img_25084e20129fd7631afbcda6b582ce6d.jpe

錯誤

幾個月以來,我一直在釋出資料科學類的應用案例文章。我的目標是幫助初學者建立信心,激發興趣。從反饋來看,確實吸引了不少“文科生”來嘗試資料科學方法。

這裡所謂文科生,就是沒有程式設計經驗,卻又對資料科學感興趣,甚至不得不實踐資料科學(這種壓力往往來自於導師、老闆和同儕)的人。

我承認,這麼定義“文科生”,有些利用刻板印象簡化問題的成分。實際上,現在不少文科專業學生,都是高素質複合型人才,程式設計玩兒得比IT類專業都要熟練。如果你恰巧就是個複合型人才,覺得這個稱呼冒犯了你,請你諒解。但至少你得承認,相當多的文科專業同學,還是對技術不夠熟悉,有牴觸甚至是恐懼心理的。

我收到了不少讀者留言和來信,提出了許多疑問。其中有很大一部分,是在實踐程式設計環節,遇到了錯誤提示,向我求助。

對於這一類的反饋,我秉持著“能幫就幫”的原則。一兩句話能夠說明的問題,我就旋即答覆;對於那些需要深入調查的問題,我會讓讀者把Jupyter Notebook或者R notebook檔案以及資料發給我。這裡真得感謝文學化程式設計環境的提供者們,給我和讀者這樣便捷溝通、重現問題的方式。

img_9ea8f8e19af596e9553a41556b74e29f.jpe

但是,按照反饋的情況來看,還有不少讀者遇到了問題,沒有能夠解決,就直接放棄了。

我這樣確信,是因為前些日子給一年級的碩士研究生布置了同樣的練習作業,重現我一系列文章中的結果。他們很快就遭遇到了問題,但是長時間自己瞎折騰,沒有跟我及時溝通。直到最近的一次的工作坊,我用了幾分鐘的時間,消除了一直困擾他們的“疑難雜症”,做出了預期的結果。看他們一個個喜上眉梢的樣子,很享受。

我能夠理解他們的心情。我們總想留給別人聰明、勤奮和積極主動的印象。輕易提出看似異常簡單的“傻問題”,可能會讓我們的自我評價受挫,覺得自己沒有能力,又被別人看作“懶惰”。所以許多情況下,我們遇到問題,喜歡自己先折騰一番。

動手摺騰並不是壞事。以正確的方法嘗試解決問題,會幫你積累認知。所謂的“程式設計經驗”,很多就是從各種失敗嘗試中提煉出來的。但是如果你面對錯誤,嘗試使用的方法低效,甚至根本不得其法,那就得不償失了。我們時常揶揄的“從入門到放棄”,往往就是這麼來的。

本著“授人以魚不如授人以漁”的原則,我今天跟你談談,文科生該如何應對資料科學Python程式設計中可能出現的問題。

許多程式設計師和專業人士可能會對這樣的主題不以為然,甚至嗤之以鼻——除錯(debug)是一門專業的學問,你打算一篇文章講清楚?吹吧!

誠然,我不可能用一篇文章講清楚如何程式設計除錯。我只想給文科生一些建議,因為他們的情況比較特殊。

對他們來說,直接列一個清單,說明如何除錯是不夠滿足需求的。我們們得結合具體的場景來談。

文科生遭遇Python程式設計問題的場景該如何分類呢?

我根據長期的觀察和思考,認為可以分成3類:

  1. 照葫蘆畫葫蘆;
  2. 照葫蘆畫瓢;
  3. 找葫蘆畫瓢。

你可能看得不知所云。簡單解釋一下。

文科生使用Python程式設計,往往沒有程式設計的基礎訓練。他們不是從基礎關鍵詞、語法、資料結構、演算法的路徑學下來的。他們拿到一個任務,一般都有明確的時限,卻沒有解法清單,唯一的線索是“這個問題可以用Python (或者R)來解決”。

有人說,這就像是某人被塞了一把傘,然後推到颱風中心。我覺得挺形象的。

所以,他們首先尋找的,不會是Python(或者R)的基礎教科書,而是樣例

如果恰好有個樣例,講如何繪製詞雲如何做中文情感分析如何用決策樹分類如何抽取海量文字的主題……恰好跟他們的任務一致,那他們自然如釋重負。

於是他們就開始了第一步,照葫蘆畫葫蘆,先把樣例中的程式碼重複實踐一遍,確定本地可以執行。

做好了第一步,出了正確的結果,他們也就來了信心。下面需要做的,是把自己的資料扔進去,看能否出預期的結果,這一部分,就算作“照葫蘆畫瓢”。

許多人只需要前兩步,就能完成任務,高高興興收工了。但是如果很不幸,你的任務和樣例有一些區別,那你就得在樣例基礎上,新增新的程式碼,呼叫新的軟體包來嘗試完成任務。你無法自己從頭造瓢出來,這一部分就得“自己找葫蘆畫瓢”了。

對大部分“文科生”來說,場景就是這三類了。出離這樣的要求,要麼外包,要麼自己從頭學程式設計。等他紮紮實實學會了,也就不算文科生了。

下面我們們分別看看,在這三種不同的情境下,文科生遇到Python程式設計中的問題,該如何有效嘗試解決。

說明一下,雖然本文以Python為例講解方法,但是其中的原理同樣使用於大部分資料科學類程式語言和工具,例如R等。學習時請舉一反三

畫葫蘆

我們先看第一種場景,也就是“照葫蘆畫葫蘆”。

例如說,你打算用決策樹做分類,於是找到了我這篇《貸還是不貸:如何用Python和機器學習幫你決策?》,開始實踐,重現結果。

前面還好,一直很順利。你的信心在逐漸積累。聽說下面這段程式碼可以幫你繪製出決策樹的圖形,你異常欣喜,期待的心情,就如同小時候等著父母出差回家給你帶來玩具一樣。

with open("safe-loans.dot", `w`) as f:
     f = tree.export_graphviz(clf,
                              out_file=f,
                              max_depth = 3,
                              impurity = True,
                              feature_names = list(X_train),
                              class_names = [`not safe`, `safe`],
                              rounded = True,
                              filled= True )

from subprocess import check_call
check_call([`dot`,`-Tpng`,`safe-loans.dot`,`-o`,`safe-loans.png`])

from IPython.display import Image as PImage
from PIL import Image, ImageDraw, ImageFont
img = Image.open("safe-loans.png")
draw = ImageDraw.Draw(img)
img.save(`output.png`)
PImage("output.png")

可是事與願違,執行後圖形沒有出來,卻見到了一大堆錯誤資訊。

img_d2d4a80d2483c5b4138df7fffd9919d8.png

看到錯誤資訊,你已經很緊張了。更要命的是,它們還是英文的。

於是,你一下子茫然無措了。

喝了一杯水,緩了口氣,你往後翻文章,到了討論區。發現其他人也遇到了同樣的問題,你眼前一亮。

img_4a301612b7ab6720dae8d308410a2f4b.jpe

趕緊往後翻,看看有沒有解決辦法,你看到了作者的答覆:

img_5e42b7af14d1d0196053380ffe47b5e9.jpe

好像裝了Graphviz,問題就可以解決。你趕緊搜尋這個軟體,並且下載安裝了。

img_a7819bd7b8b7206593c3b722ba0bb0b3.jpe

安裝結束後,你的開始選單裡面,可以看到Graphviz目錄。證明你安裝成功。

你回到Jupyter Notebook下面,重新執行到這一步。按下“Shift+Enter”按鍵之前,你又激動不已了。

然而,你看到的執行結果,竟然還是這樣子的:

img_d2d4a80d2483c5b4138df7fffd9919d8.png

你後悔自己肯定遺漏了討論區裡面的一些重要資訊,趕緊返回尋找,你看到了這樣的對話:

img_25627bcd93c13996af1bd5793aa1c781.jpe

看到別人安裝了Graphviz後,問題依然沒有解決。你於是決定放棄了。而且可能還會懷疑,那個叫做大衛的傢伙,應該是作者的托兒吧。

其實你冤枉大衛了。安裝了Graphviz以後,他確實成功做出了結果。問題到底處在哪兒?請你往下看。

我先說說面對程式給你的這一大堆報錯,你該怎麼辦?

首先你要看看,錯誤出現在哪裡。

WindowsError                              Traceback (most recent call last)
<ipython-input-14-da79615505d3> in <module>()
     10
     11 from subprocess import check_call
---> 12 check_call([`dot`,`-Tpng`,`safe-loans.dot`,`-o`,`safe-loans.png`])
     13
     14 from IPython.display import Image as PImage

錯誤提示的第一段已經告訴你了,問題發生在check_call這一行,行號為12。

這就意味著,前面11行,其實都沒有問題。這一大段程式碼用空行分割,一共是3個部分。前面10行是第一部分。中間2行第二部分,後面是第三部分。我們把它拆分成3個Jupyter中的程式碼段落,單獨執行。

img_c9e81f021d937e366f6dc3475ef7fd08.png

上面的執行結果,證明我們的猜測是對的。第一段執行起來沒問題,第二段只有兩句,第一句不報錯,只有check_call這一行報錯。這樣問題就聚焦了。

這種拆分複雜問題到簡單部分,然後各個擊破的方法,可以追溯到笛卡爾。他老人家曾經說過:

Divide each difficulty into as many parts as is feasible and necessary to resolve it.

注意,這種方法適合於我們此處展示的線性環節。所謂線性,就是順序執行的若干步驟。前面的改動會對後面有影響,但是後面的改動對前面沒有影響。

如果你遭遇的是個迴圈問題,那就要小心了。這種解決方法可能會失效。

check_call這一行到底遇到了什麼問題呢?我們還是要回到報錯資訊裡,尋找線索。

這麼長的報錯資訊,該看哪裡呢?我的經驗是,問題發生位置要看開頭(我們剛才已經做完了),問題癥結十有八九要看末尾。

我們看看報錯資訊的末尾是什麼:

C:UsersuserAnaconda2libsubprocess.pyc in _execute_child(self, args, executable, preexec_fn, close_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, to_close, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite)
    638                                          env,
    639                                          cwd,
--> 640                                          startupinfo)
    641             except pywintypes.error, e:
    642                 # Translate pywintypes.error to WindowsError, which is

WindowsError: [Error 2]

你可能又暈了,這一大堆的術語,我如何懂得?

你不需要懂那些東西,看最後的報錯資訊,叫做“WindowsError: [Error 2]”。

這是一個錯誤程式碼,但是包含資訊不夠。我們需要查詢一下,2號Windows錯誤程式碼,究竟是什麼意思。

這時候,就該搜尋引擎出場了。我們搜尋“WindowsError: [Error 2]”,結果如下:

img_70df8930d5bd03dc142b6e2c60842f16.jpe

我知道,你的吸引力立刻就被圖中的中文文字抓住了。但是我告訴你,更應該看的,不是語言種類,而是資訊來源。你會注意到,其中一些搜尋結果,來自於“stackoverflow.com”這個網站。

這個網站,彙集了全世界程式設計中遇到的各種問題和可能的解決辦法。你可以把它想想成全球程式設計師的“知乎”。

開啟其中的第二條搜尋結果。

img_0e5ce008c0c2abfc0a41d729c6e8fdf2.jpe

標題資訊就已經非常清楚地告訴了你,所謂的“WindowsError: [Error 2]”,是指“系統找不到你指定的檔案”。

這樣我們再次回頭審視出問題的程式碼句:

check_call([`dot`,`-Tpng`,`safe-loans.dot`,`-o`,`safe-loans.png`])

其實,我們是讓Python呼叫一個Graphviz的命令,叫做dot,用它來把我們前面生成的 safe-loans.dot檔案,轉換成png格式的圖片。

系統找不到什麼檔案呢?我們開啟當前的demo目錄,你會看到 safe-loans.dot檔案赫然在目。而png檔案此時還沒有生成。因此,我們鎖定了問題,系統找不到的,是dot這個命令。

這就是為什麼你必須要先安裝Graphviz包。你不安裝的話,Python當然找不到dot檔案。

但是為什麼你明明裝了Graphviz包,還會遭遇報錯呢?

你確定這時候Python可以找到dot包了嗎?

我們嘗試一下。到命令提示符下面,執行dot試試看。

img_f1b005d3e19643dbf2cdeeee93e75223.png

真相大白了。你在命令提示符下,自己都找不到dot命令,你能指望Python有多智慧呢?

怎麼辦?方法其實並不難,只需要加上必要的路徑,讓電腦知道dot這個命令在哪裡,就可以了。

我們到C盤的Program Files,或者Program Files(x86)目錄下,去找Graphviz安裝目錄。

你會發現,路徑為:

C:Program Files(x86)Graphviz2.38in

於是這次你執行:

img_082dee4522ceef3e26657418a7b8f33b.png

你會看到,沒有報錯資訊了。

再接再厲,這次你把完整的命令輸入:

img_c122edf7681af54f0f390fb20e8926a5.png

這次不但沒有報錯,而且你想要的png檔案已經生成了。

不過,這些都是你手動完成的,我們們還是需要用程式來完成,不是嗎?

於是我們回到Jupyter Notebook裡,嘗試給dot命令一樣加上路徑。

執行!

img_38e5b024eac5b8b71d2c1c9541b71485.png

報錯資訊又來了!而且一模一樣啊!

注意我們做了改動,但是改動並沒有成功。我們就得想想原因是什麼了。

這次我們搜尋執行的Python命令( check_call ),以及輸入路徑中的特徵部分(Program Files)。把這幾個關鍵詞放到搜尋引擎裡,結果如下:

img_1f031dd392952b80ca45294ccb92b520.jpe

注意第一條結果是幫助文件,我們把目光聚焦在第二條搜尋結果上。因為它依然來自stackoverflow.com。

我們點選開啟這個連結。

img_d23b7d013da626f046fa2785414dff5f.jpe

提問者問,為什麼使用(跟我們類似的)完全路徑,Python依然找不到命令。

被贊同的答題者回答:你應該用斜槓(/),而不是反斜槓()。

看了這個答案,你可能覺得恍然大悟了吧。於是回到Jupyter Notebook裡面,把C:Program Files(x86)Graphviz2.38indot改成了C:/Program Files(x86)/Graphviz2.38/bin/dot

再次執行,這部分不再報錯了:

img_b76ded2c7792ac3e06a6747fece45b74.png

你戰戰兢兢,嘗試一直就沒能正確執行到的最後一段程式碼:

img_31932e4daf9e48e3d2fba72c0a527120.png

是不是有一種想要仰天大笑的感覺?

現在我們來回答一下,為什麼評論裡大衛的問題獲得瞭解決,而其他讀者似乎沒能解決問題呢?

罪魁禍首在於作業系統環境差異。大衛用的是macOS。安裝Graphviz之後,mac作業系統記錄下來了Graphviz的各項可執行命令。Python因此也知道了dot這個命令在哪裡。所以呼叫起來沒有任何問題。

我寫作該文的時候,作業系統也是macOS,所以並沒有意識到Windows上執行環境的這種差異。甚至因為2年多以前我就安裝了Graphviz,所以在初稿寫作的時候甚至都沒有把Graphviz作為環境準備的必要組成部分。

順便說一句,根據部分讀者反映,他們在Windows上安裝了Graphviz後,只需要重啟一遍,系統就會自動識別dot命令的完全路徑,所以根本就不必修改程式碼內容。但是其他讀者反映這樣做了無效。你看,同樣是Windows,環境差異都是如此之大的。

作業系統、Python軟體版本、呼叫的相關軟體包版本……這些環境差異可能直接導致你“照葫蘆畫葫蘆”時候出現嚴重問題,也是最容易踩到的坑。不過通過我們們前面的敘述,相信你已經找到了從坑裡爬起來,甚至是避開坑的方法了。

畫瓢

當你完整重現樣例或教程中的執行結果後,就該開始照著葫蘆畫瓢了。畢竟你需要分析的,是自己獨特的資料

但是一定要注意,務必在“畫葫蘆”完成後,開始畫瓢。來信和留言中的許多問題,都是讀者在沒有完整重現教程結果時,就開始了改動,把不同層次的問題混雜在了一起,就很難發現和解決了。

這裡我們們舉的例子,是這位讀者的來信。

img_a70d6e08b6e0ff6c74ad26639b74e00b.jpe

他看了我那篇《如何用Python做輿情時間序列視覺化?》之後,完全重現了結果。然後灌入了自己的資料。我展示的樣例用的是飯館點評資訊,他用的是外賣評論資訊。

這是我原文中讀入後資料的樣例:

img_83725348bea7b2eb1a8cfeb26d4c5269.jpe

這是他的資料:

img_3d628a82eae17acb0ed2a06d8b2bfb9c.jpe

看起來很相似,不是嗎?可是前面情感分析等環節都沒有問題。到了最後的繪製圖形,又是一堆報錯資訊。

img_c3e50fed023260c78c6e701e04fbd1f8.jpe

複習一下,我們說過報錯資訊的開頭和結尾最為重要。開頭是確定位置。因為這裡本來就只有一行語句,所以可以忽略。那我們看看結尾吧。

img_aa61ad46740ce3a996a8aea7c12b2f68.jpe

注意,這裡提示的是取值錯誤(ValueError),並且標出了問題,就是評論時間,例如“2017-02-27”。

回顧一下,在原文中,評論時間的格式為Python可以識別的時間單位,這樣最後繪出的圖形才是這樣的:

img_fd2390ea39ea2bea5af2a0129e826ab8.jpe

而這裡,時間顯示為“2017-02-27”,應該沒錯啊。

資料框中的時間是從新到舊排列的。我們顯示最後一條資料,就是“2017-02-27”。

img_acb99184e4ff4a22b2b22019868c1f26.jpe

這裡我們就需要記住一條非常重要的命令:

type()

它可以幫助我們搞清楚取值的型別。

img_f90e25c78f1d2056c2b202502d278896.jpe

這一下子,原形畢露了。資料框裡面的每一個時間條目,儲存的格式都不是Python日期,而是簡單的字串!難怪當我們需要繪製時間序列圖形的時候,會報錯。

明白了問題,方法也就容易找到了。我們再次用搜尋引擎,查詢Pandas裡,把字串轉換為日期的方法。

img_fa900c9b0431be848fbe76ba5f70fe8b.jpe

其實Google已經非常聰明地把最相關的結果擺在前面了。但是我們依然可以用老方法,找stackoverflow連結,並且點選進入。

img_da479f10cce91b56ab11096e2616c85d.jpe

選定答案裡面清晰明白地告訴我們——使用Pandas資料框的to_datetime函式,並且給出了詳細的樣例。

好的,我們試試看。

df.time = pd.to_datetime(df.time)

然後我們重新執行剛才的兩條語句:

img_7b37851de7f67185af95979220a72a64.jpe

看,這次Python正確識別出日期格式。

然後我們再繪圖:

img_20fdf6aa5bd37a2cb706e6aa544cfb52.jpe

雖然由於資料量過大,後半部分看不大清楚。不過結果已經初步顯現了。下面就是分段擷取資料,細緻地進行視覺化的工作了。

問題出在哪裡呢?對比一下原文使用的excel資料檔案,和讀者來信裡面附帶的資料檔案,你就能看出端倪了。

這是原文使用的餐館評論原始資料:

img_a4262556570a19ae8d2183fdbb253a3d.jpe

這是讀者使用的外賣評論原始資料:

img_8ad9257bd35dbeb172d73fba8b7ef473.jpe

你會看到,原先資料裡面不僅有日期,還有時間。雖然時間不過都是些“00:00:00”,但Pandas在讀入的時候,會將其自動轉化為日期時間格式。

然而讀者資料裡只有日期,沒有具體的時間。Pandas讀入資料時,不確定要不要做轉化,預設就當成字串來處理了。

所以你看,如果你需要“照葫蘆畫瓢”,一定要仔細對比資料格式,即便是這樣微小的差異,都會造成後續執行結果的區別,乃至報錯。

找葫蘆

如果樣例裡面沒有提供某個功能,但是你確實需要用到它,怎麼辦?

這個時候似乎手頭沒有葫蘆可以照著畫,你得自己找葫蘆。

例如讀完了我那篇《如何用Python做詞雲?》後,有讀者在微信公眾號後臺留言,詢問我如何在繪製詞雲的時候,把詞雲變成需要的形狀。

img_a5f380bc1cb62b2f842407b95b80d857.jpe

讀者想要的,其實是這樣的效果:

img_e7b5ec4a532984bb10b3647a41d207d1.jpe

但是我那篇文章裡,並沒有提供這樣的樣例,只能做出下面這種四四方方的詞雲圖。

img_96f9983defc202b4e99168afd731c655.jpe

如果你也遇到了類似的問題,我的建議是,按圖索驥查詢原始文件。

你先看看文中,我們究竟用了哪個詞雲繪製工具包。

from wordcloud import WordCloud
wordcloud = WordCloud().generate(mytext)

這裡,我們注意wordcloud這個關鍵詞,然後結合python,到搜尋引擎裡面查詢。

img_215e11fdcfc40c6ff1d304888998e79e.jpe

這回我們不再專門去找stackoverflow網站連結了。因為我們遇到的,不是報錯資訊,而是一項暫時還不懂得如何使用的功能。

搜尋結果裡的第一項,就是wordcloud詞雲包的官方github站點。我們點開看看。

img_f1af0ec42cf68f862f524857eda61353.jpe

Github是目前全球最主要的程式碼託管與分享站點。我也曾經把思維導圖秒變成幻燈程式碼釋出在github上面。右上方几個統計數字很重要,尤其是Star,說明了該專案受歡迎程度。wordcloud軟體包的受歡迎數字超過3000,可以說是非常棒的。相較之下,我的程式碼Star數量只有20,相形見絀啊。

我們把網頁往下翻,可以找到Example部分。

img_ee0c57e27a54bf2b002d1e1ca41c16c8.jpe

你是不是眼前一亮啊?對,你需要的繪圖結果就在這裡,而且人家有專門連結直達使用方式。

點選一下,你就能看到官方的masked詞雲樣例程式碼了。

img_913bb950c6b4f423fb0b469028a8bef3.jpe

瀏覽程式碼,你會發現這一段有集中註釋:

# read the mask image
# taken from
# http://www.stencilry.org/stencils/movies/alice%20in%20wonderland/255fk.jpg
alice_mask = np.array(Image.open(path.join(d, "alice_mask.png")))

這裡告訴你,如果打算把詞雲繪製成特殊的圖形外觀,你需要在這裡指定一個mask影像檔案。樣例裡面的檔案叫做alice_mask.png。

我們來看看,這個檔案是什麼樣子的。因為原始碼就在這裡,指定的檔案也沒有加入完全路徑,因此它只可能放在樣例程式碼檔案的相同目錄下。

我們點選頁面上方的路徑連結,返回到上層目錄。

img_e8057ad198483e292e85e545042482d9.jpe

目錄裡面所有的檔案都在這裡了。我們找到alice_mask.png,點開看看。

img_7c938b730789a985ee21bcc6d8c9c1ed.jpe

原來你需要提供這樣一張黑白影像,詞雲會顯示在其中的黑色區域內。

但是這樣的影像需要我自己來繪製嗎?

這就考驗你看程式碼的時候是不是細緻了。有沒有注意到這一句?

# http://www.stencilry.org/stencils/movies/alice%20in%20wonderland/255fk.jpg

這是alice_mask.png影像檔案原始地址。我們點選看看。

img_e18cb0b3315449d12bc239cfcacf1b32.jpe

原來這個網站上的檔案直接就可以用來做詞雲影像設定。我們看到上方的路徑按鈕,點選上一層,進入“movies”。

img_b0b43f6503ab9c1a8e2ec9e04ffd4191.jpe

居然有這麼多的電影影像可以使用啊。

我們再進入到上一層,看看還有哪些其他類別影像可用。

img_0e28f8ceea03aeb3cc423b2d7c06d685.jpe

看了之後,是不是有一種“芝麻開門”的感覺?

可惜的是,tv類別下面,並沒有原文提到的“Yes, minister”可供選擇。我們隨便選一張世界地圖來試試看。

img_b84f8a1c70c3010e618d65af81180ddd.jpe

回到Jupyter Notebook裡面,按照我們從原始說明文件裡找到的新葫蘆,開始畫瓢。

如果你做出了下面的結果,那麼恭喜你,“找葫蘆畫瓢”工作圓滿完成。

img_c5c07740fcda5f9a7354d28a41c9cb33.png

小結

小結一下,對文科生來說,程式設計中遇到的問題,需要依據不同的場景,分別採取不同的思考清單來嘗試有效解決。

對於“照葫蘆畫葫蘆”類場景,方法如下:

  1. 確認你的執行環境儘量和作者的執行環境一致(安裝相同的軟體版本)。如果環境不一致(例如作業系統差異),遇到問題的時候要時刻意識到這種差異可能是造成無法重複結果的元凶。
  2. 把遇到問題的程式碼拆解開。聚焦到實際產生了問題的程式碼片段上。這就是所謂的“分而治之”。
  3. 認真閱讀報錯資訊,裡面有非常重要的線索。尤其是開頭和結尾部分。
  4. 善用搜尋引擎,輸入可以準確定義問題的關鍵字。
  5. 明白stackoverflow網站的重要性,其中被支援的答案可能一語道破你百思不得其解的問題。

對於“照葫蘆畫瓢”類場景,方法如下:

  1. 確認你已經圓滿完成了“照葫蘆畫葫蘆”過程。
  2. 確保你自己的資料格式與樣例中資料格式一致。
  3. 認真閱讀報錯資訊,從中找到問題的大致方向。
  4. 利用搜尋引擎查詢類似問題的已知有效解決方法。尤其要注意stackoverflow網站的相關連結。

對於“找葫蘆畫瓢”類場景,方法如下:

  1. 依照類似的功能,按圖索驥找到提供相應功能的軟體包。
  2. 閱讀其官方說明文件,最好能找到特定功能的樣例程式碼。
  3. 讀程式碼的時候務必注意註釋資訊,其中包含了注意事項和重要資源。
  4. 自己實踐的第一步,是用找到的“新葫蘆”畫出“葫蘆”來,然後再嘗試“畫瓢”。

不論對於哪一類場景,你都要明白遇到的問題可能會成為你未來的財富。但前提是你必須把它們及時記錄下來,並且養成定期回顧的好習慣。

如果實在解決不了問題,最後的一招,就是提問了。但是請你在發問之前,確定自己已經通過上述步驟和流程嘗試了可能有效的方法。這不僅是《提問的智慧》裡面要求的,更是為了你自己能夠學有所得。提問的時候,要注意提供你的執行程式碼(最好是ipynb這樣的格式,包含完整的報錯資訊)、用到的實際資料,以及你的嘗試過程等。資訊越詳細,別人就越有能力幫助你。

向誰提問呢?當然可以問老師、問作者。但是別忘了你一直在使用的stackoverflow網站,本來就是一個讓你提問的好地方啊。通過觀察別人的問題和答案,你應該不難發現,網站上的高手們,大都非常熱心助人。

另外,不要滿足於永遠當一個“文科生”。如果你打算在資料科學的路徑上走得足夠遠、足夠穩,夯實基礎就是必要的。畢竟人工智慧都要進入中小學課程體系了,不是嗎?

如果你打算好好學習Python基礎知識,歡迎閱讀《如何高效學Python?》一文。

討論

你用Python或者其他程式語言做過資料科學分析任務嗎?中間遇到過問題或障礙嗎?你是如何處理的,成功了嗎?有什麼獨特的好經驗?歡迎留言,分享你的經驗和心得,我們一起交流討論。

喜歡請點贊。還可以微信關注和置頂我的公眾號“玉樹芝蘭”(nkwangshuyi)

如果你對資料科學感興趣,不妨閱讀我的系列教程索引貼《如何高效入門資料科學?》,裡面還有更多的有趣問題及解法。


相關文章