Python編程遇問題锄开,文科生怎么辦?

敲黑板了啊称诗,答疑時(shí)間到萍悴。如果你沒有良好的Python編程基礎(chǔ),在嘗試應(yīng)用數(shù)據(jù)科學(xué)方法時(shí)遇到了問題和困難,又不知道該如何有效解決癣诱,那么這篇文章就是為你寫的计维。請(qǐng)務(wù)必認(rèn)真閱讀喲。

錯(cuò)誤

幾個(gè)月以來撕予,我一直在發(fā)布數(shù)據(jù)科學(xué)類的應(yīng)用案例文章鲫惶。我的目標(biāo)是幫助初學(xué)者建立信心,激發(fā)興趣实抡。從反饋來看欠母,確實(shí)吸引了不少“文科生”來嘗試數(shù)據(jù)科學(xué)方法。

這里所謂文科生吆寨,就是沒有編程經(jīng)驗(yàn)赏淌,卻又對(duì)數(shù)據(jù)科學(xué)感興趣,甚至不得不實(shí)踐數(shù)據(jù)科學(xué)(這種壓力往往來自于導(dǎo)師啄清、老板和同儕)的人六水。

我承認(rèn),這么定義“文科生”辣卒,有些利用刻板印象簡(jiǎn)化問題的成分缩擂。實(shí)際上,現(xiàn)在不少文科專業(yè)學(xué)生添寺,都是高素質(zhì)復(fù)合型人才,編程玩兒得比IT類專業(yè)都要熟練懈费。如果你恰巧就是個(gè)復(fù)合型人才计露,覺得這個(gè)稱呼冒犯了你,請(qǐng)你諒解憎乙。但至少你得承認(rèn)票罐,相當(dāng)多的文科專業(yè)同學(xué),還是對(duì)技術(shù)不夠熟悉泞边,有抵觸甚至是恐懼心理的该押。

我收到了不少讀者留言和來信,提出了許多疑問阵谚。其中有很大一部分蚕礼,是在實(shí)踐編程環(huán)節(jié),遇到了錯(cuò)誤提示梢什,向我求助奠蹬。

對(duì)于這一類的反饋,我秉持著“能幫就幫”的原則嗡午。一兩句話能夠說明的問題囤躁,我就旋即答復(fù);對(duì)于那些需要深入調(diào)查的問題,我會(huì)讓讀者把Jupyter Notebook或者R notebook文件以及數(shù)據(jù)發(fā)給我狸演。這里真得感謝文學(xué)化編程環(huán)境的提供者們言蛇,給我和讀者這樣便捷溝通、重現(xiàn)問題的方式宵距。

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

我這樣確信翩瓜,是因?yàn)榍靶┤兆咏o一年級(jí)的碩士研究生布置了同樣的練習(xí)作業(yè)受扳,重現(xiàn)我一系列文章中的結(jié)果。他們很快就遭遇到了問題兔跌,但是長(zhǎng)時(shí)間自己瞎折騰勘高,沒有跟我及時(shí)溝通。直到最近的一次的工作坊坟桅,我用了幾分鐘的時(shí)間华望,消除了一直困擾他們的“疑難雜癥”,做出了預(yù)期的結(jié)果仅乓±抵郏看他們一個(gè)個(gè)喜上眉梢的樣子,很享受夸楣。

我能夠理解他們的心情宾抓。我們總想留給別人聰明、勤奮和積極主動(dòng)的印象豫喧。輕易提出看似異常簡(jiǎn)單的“傻問題”石洗,可能會(huì)讓我們的自我評(píng)價(jià)受挫,覺得自己沒有能力紧显,又被別人看作“懶惰”讲衫。所以許多情況下,我們遇到問題孵班,喜歡自己先折騰一番涉兽。

動(dòng)手折騰并不是壞事。以正確的方法嘗試解決問題重父,會(huì)幫你積累認(rèn)知花椭。所謂的“編程經(jīng)驗(yàn)”,很多就是從各種失敗嘗試中提煉出來的房午。但是如果你面對(duì)錯(cuò)誤矿辽,嘗試使用的方法低效,甚至根本不得其法,那就得不償失了袋倔。我們時(shí)常揶揄的“從入門到放棄”雕蔽,往往就是這么來的。

本著“授人以魚不如授人以漁”的原則宾娜,我今天跟你談?wù)勁目粕撊绾螒?yīng)對(duì)數(shù)據(jù)科學(xué)Python編程中可能出現(xiàn)的問題。

許多程序員和專業(yè)人士可能會(huì)對(duì)這樣的主題不以為然前塔,甚至嗤之以鼻——除錯(cuò)(debug)是一門專業(yè)的學(xué)問嚣艇,你打算一篇文章講清楚?吹吧华弓!

誠(chéng)然食零,我不可能用一篇文章講清楚如何編程除錯(cuò)。我只想給文科生一些建議寂屏,因?yàn)樗麄兊那闆r比較特殊贰谣。

對(duì)他們來說,直接列一個(gè)清單迁霎,說明如何除錯(cuò)是不夠滿足需求的吱抚。咱們得結(jié)合具體的場(chǎng)景來談。

文科生遭遇Python編程問題的場(chǎng)景該如何分類呢考廉?

我根據(jù)長(zhǎng)期的觀察和思考秘豹,認(rèn)為可以分成3類:

  1. 照葫蘆畫葫蘆;
  2. 照葫蘆畫瓢昌粤;
  3. 找葫蘆畫瓢憋肖。

你可能看得不知所云。簡(jiǎn)單解釋一下婚苹。

文科生使用Python編程,往往沒有程序設(shè)計(jì)的基礎(chǔ)訓(xùn)練鸵膏。他們不是從基礎(chǔ)關(guān)鍵詞膊升、語法、數(shù)據(jù)結(jié)構(gòu)谭企、算法的路徑學(xué)下來的廓译。他們拿到一個(gè)任務(wù),一般都有明確的時(shí)限债查,卻沒有解法清單非区,唯一的線索是“這個(gè)問題可以用Python (或者R)來解決”。

有人說盹廷,這就像是某人被塞了一把傘征绸,然后推到臺(tái)風(fēng)中心。我覺得挺形象的。

所以管怠,他們首先尋找的淆衷,不會(huì)是Python(或者R)的基礎(chǔ)教科書,而是樣例渤弛。

如果恰好有個(gè)樣例祝拯,講如何繪制詞云如何做中文情感分析她肯,如何用決策樹分類佳头,如何抽取海量文本的主題……恰好跟他們的任務(wù)一致,那他們自然如釋重負(fù)晴氨。

于是他們就開始了第一步康嘉,照葫蘆畫葫蘆,先把樣例中的代碼重復(fù)實(shí)踐一遍瑞筐,確定本地可以運(yùn)行凄鼻。

做好了第一步,出了正確的結(jié)果聚假,他們也就來了信心块蚌。下面需要做的,是把自己的數(shù)據(jù)扔進(jìn)去膘格,看能否出預(yù)期的結(jié)果峭范,這一部分,就算作“照葫蘆畫瓢”瘪贱。

許多人只需要前兩步纱控,就能完成任務(wù),高高興興收工了菜秦。但是如果很不幸甜害,你的任務(wù)和樣例有一些區(qū)別,那你就得在樣例基礎(chǔ)上球昨,添加新的代碼尔店,調(diào)用新的軟件包來嘗試完成任務(wù)。你無法自己從頭造瓢出來主慰,這一部分就得“自己找葫蘆畫瓢”了嚣州。

對(duì)大部分“文科生”來說,場(chǎng)景就是這三類了共螺。出離這樣的要求该肴,要么外包,要么自己從頭學(xué)編程藐不。等他扎扎實(shí)實(shí)學(xué)會(huì)了匀哄,也就不算文科生了秦效。

下面咱們分別看看,在這三種不同的情境下拱雏,文科生遇到Python編程中的問題涩笤,該如何有效嘗試解決裕便。

說明一下顾复,雖然本文以Python為例講解方法侄刽,但是其中的原理同樣使用于大部分?jǐn)?shù)據(jù)科學(xué)類編程語言和工具,例如R等鹊汛。學(xué)習(xí)時(shí)請(qǐng)舉一反三蒲赂。

畫葫蘆

我們先看第一種場(chǎng)景,也就是“照葫蘆畫葫蘆”刁憋。

例如說滥嘴,你打算用決策樹做分類,于是找到了我這篇《貸還是不貸:如何用Python和機(jī)器學(xué)習(xí)幫你決策至耻?》若皱,開始實(shí)踐,重現(xiàn)結(jié)果尘颓。

前面還好走触,一直很順利。你的信心在逐漸積累疤苹。聽說下面這段代碼可以幫你繪制出決策樹的圖形互广,你異常欣喜,期待的心情卧土,就如同小時(shí)候等著父母出差回家給你帶來玩具一樣惫皱。

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")

可是事與愿違,運(yùn)行后圖形沒有出來尤莺,卻見到了一大堆錯(cuò)誤信息旅敷。

看到錯(cuò)誤信息,你已經(jīng)很緊張了颤霎。更要命的是扫皱,它們還是英文的。

于是捷绑,你一下子茫然無措了。

喝了一杯水氢妈,緩了口氣粹污,你往后翻文章,到了討論區(qū)首量。發(fā)現(xiàn)其他人也遇到了同樣的問題壮吩,你眼前一亮进苍。

趕緊往后翻,看看有沒有解決辦法鸭叙,你看到了作者的答復(fù):

好像裝了Graphviz觉啊,問題就可以解決。你趕緊搜索這個(gè)軟件沈贝,并且下載安裝了杠人。

安裝結(jié)束后,你的開始菜單里面宋下,可以看到Graphviz目錄嗡善。證明你安裝成功。

你回到Jupyter Notebook下面学歧,重新執(zhí)行到這一步罩引。按下“Shift+Enter”按鍵之前,你又激動(dòng)不已了枝笨。

然而袁铐,你看到的執(zhí)行結(jié)果,竟然還是這樣子的:

你后悔自己肯定遺漏了討論區(qū)里面的一些重要信息横浑,趕緊返回尋找剔桨,你看到了這樣的對(duì)話:

看到別人安裝了Graphviz后,問題依然沒有解決伪嫁。你于是決定放棄了领炫。而且可能還會(huì)懷疑,那個(gè)叫做大衛(wèi)的家伙张咳,應(yīng)該是作者的托兒吧帝洪。

其實(shí)你冤枉大衛(wèi)了。安裝了Graphviz以后脚猾,他確實(shí)成功做出了結(jié)果葱峡。問題到底處在哪兒?請(qǐng)你往下看龙助。

我先說說面對(duì)程序給你的這一大堆報(bào)錯(cuò)砰奕,你該怎么辦?

首先你要看看提鸟,錯(cuò)誤出現(xiàn)在哪里军援。

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

錯(cuò)誤提示的第一段已經(jīng)告訴你了,問題發(fā)生在check_call這一行称勋,行號(hào)為12胸哥。

這就意味著,前面11行赡鲜,其實(shí)都沒有問題空厌。這一大段代碼用空行分割庐船,一共是3個(gè)部分。前面10行是第一部分嘲更。中間2行第二部分筐钟,后面是第三部分。我們把它拆分成3個(gè)Jupyter中的代碼段落赋朦,單獨(dú)執(zhí)行篓冲。

上面的運(yùn)行結(jié)果,證明我們的猜測(cè)是對(duì)的北发。第一段運(yùn)行起來沒問題纹因,第二段只有兩句,第一句不報(bào)錯(cuò)琳拨,只有check_call這一行報(bào)錯(cuò)瞭恰。這樣問題就聚焦了。

這種拆分復(fù)雜問題到簡(jiǎn)單部分狱庇,然后各個(gè)擊破的方法惊畏,可以追溯到笛卡爾。他老人家曾經(jīng)說過:

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

注意密任,這種方法適合于我們此處展示的線性環(huán)節(jié)颜启。所謂線性,就是順序執(zhí)行的若干步驟浪讳。前面的改動(dòng)會(huì)對(duì)后面有影響缰盏,但是后面的改動(dòng)對(duì)前面沒有影響。

如果你遭遇的是個(gè)循環(huán)問題淹遵,那就要小心了口猜。這種解決方法可能會(huì)失效。

check_call這一行到底遇到了什么問題呢透揣?我們還是要回到報(bào)錯(cuò)信息里济炎,尋找線索。

這么長(zhǎng)的報(bào)錯(cuò)信息辐真,該看哪里呢须尚?我的經(jīng)驗(yàn)是,問題發(fā)生位置要看開頭(我們剛才已經(jīng)做完了)侍咱,問題癥結(jié)十有八九要看末尾耐床。

我們看看報(bào)錯(cuò)信息的末尾是什么:

C:\Users\user\Anaconda2\lib\subprocess.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]

你可能又暈了,這一大堆的術(shù)語楔脯,我如何懂得撩轰?

你不需要懂那些東西,看最后的報(bào)錯(cuò)信息,叫做“WindowsError: [Error 2]”钧敞。

這是一個(gè)錯(cuò)誤代碼,但是包含信息不夠麸粮。我們需要查詢一下溉苛,2號(hào)Windows錯(cuò)誤代碼,究竟是什么意思弄诲。

這時(shí)候愚战,就該搜索引擎出場(chǎng)了。我們搜索“WindowsError: [Error 2]”齐遵,結(jié)果如下:

我知道寂玲,你的吸引力立刻就被圖中的中文文字抓住了。但是我告訴你梗摇,更應(yīng)該看的拓哟,不是語言種類,而是信息來源伶授。你會(huì)注意到断序,其中一些搜索結(jié)果,來自于“stackoverflow.com”這個(gè)網(wǎng)站糜烹。

這個(gè)網(wǎng)站违诗,匯集了全世界程序設(shè)計(jì)中遇到的各種問題和可能的解決辦法。你可以把它想想成全球程序員的“知乎”疮蹦。

打開其中的第二條搜索結(jié)果诸迟。

標(biāo)題信息就已經(jīng)非常清楚地告訴了你,所謂的“WindowsError: [Error 2]”愕乎,是指“系統(tǒng)找不到你指定的文件”阵苇。

這樣我們?cè)俅位仡^審視出問題的代碼句:

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

其實(shí),我們是讓Python調(diào)用一個(gè)Graphviz的命令妆毕,叫做dot慎玖,用它來把我們前面生成的 safe-loans.dot文件,轉(zhuǎn)換成png格式的圖片笛粘。

系統(tǒng)找不到什么文件呢趁怔?我們打開當(dāng)前的demo目錄,你會(huì)看到 safe-loans.dot文件赫然在目薪前。而png文件此時(shí)還沒有生成润努。因此,我們鎖定了問題示括,系統(tǒng)找不到的铺浇,是dot這個(gè)命令。

這就是為什么你必須要先安裝Graphviz包垛膝。你不安裝的話鳍侣,Python當(dāng)然找不到dot文件丁稀。

但是為什么你明明裝了Graphviz包,還會(huì)遭遇報(bào)錯(cuò)呢倚聚?

你確定這時(shí)候Python可以找到dot包了嗎线衫?

我們嘗試一下。到命令提示符下面惑折,執(zhí)行dot試試看授账。

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

怎么辦粗卜?方法其實(shí)并不難屋确,只需要加上必要的路徑,讓電腦知道dot這個(gè)命令在哪里休建,就可以了乍恐。

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

你會(huì)發(fā)現(xiàn),路徑為:

C:\Program Files(x86)\Graphviz2.38\bin\

于是這次你執(zhí)行:

你會(huì)看到砌些,沒有報(bào)錯(cuò)信息了呜投。

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

這次不但沒有報(bào)錯(cuò)存璃,而且你想要的png文件已經(jīng)生成了仑荐。

不過,這些都是你手動(dòng)完成的纵东,咱們還是需要用程序來完成粘招,不是嗎?

于是我們回到Jupyter Notebook里偎球,嘗試給dot命令一樣加上路徑洒扎。

執(zhí)行!

報(bào)錯(cuò)信息又來了衰絮!而且一模一樣芭劾洹!

注意我們做了改動(dòng)猫牡,但是改動(dòng)并沒有成功胡诗。我們就得想想原因是什么了。

這次我們搜索執(zhí)行的Python命令( check_call ),以及輸入路徑中的特征部分(Program Files)煌恢。把這幾個(gè)關(guān)鍵詞放到搜索引擎里骇陈,結(jié)果如下:

注意第一條結(jié)果是幫助文檔,我們把目光聚焦在第二條搜索結(jié)果上瑰抵。因?yàn)樗廊粊碜詓tackoverflow.com缩歪。

我們點(diǎn)擊打開這個(gè)鏈接。

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

被贊同的答題者回答:你應(yīng)該用斜杠(/)习贫,而不是反斜杠(\)。

看了這個(gè)答案千元,你可能覺得恍然大悟了吧苫昌。于是回到Jupyter Notebook里面,把C:\Program Files(x86)\Graphviz2.38\bin\dot改成了C:/Program Files(x86)/Graphviz2.38/bin/dot幸海。

再次運(yùn)行祟身,這部分不再報(bào)錯(cuò)了:

你戰(zhàn)戰(zhàn)兢兢,嘗試一直就沒能正確運(yùn)行到的最后一段代碼:

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

現(xiàn)在我們來回答一下袜硫,為什么評(píng)論里大衛(wèi)的問題獲得了解決,而其他讀者似乎沒能解決問題呢挡篓?

罪魁禍?zhǔn)自谟诓僮飨到y(tǒng)環(huán)境差異婉陷。大衛(wèi)用的是macOS。安裝Graphviz之后官研,mac操作系統(tǒng)記錄下來了Graphviz的各項(xiàng)可執(zhí)行命令秽澳。Python因此也知道了dot這個(gè)命令在哪里。所以調(diào)用起來沒有任何問題戏羽。

我寫作該文的時(shí)候担神,操作系統(tǒng)也是macOS,所以并沒有意識(shí)到Windows上運(yùn)行環(huán)境的這種差異始花。甚至因?yàn)?年多以前我就安裝了Graphviz妄讯,所以在初稿寫作的時(shí)候甚至都沒有把Graphviz作為環(huán)境準(zhǔn)備的必要組成部分。

順便說一句衙荐,根據(jù)部分讀者反映捞挥,他們?cè)赪indows上安裝了Graphviz后,只需要重啟一遍忧吟,系統(tǒng)就會(huì)自動(dòng)識(shí)別dot命令的完全路徑砌函,所以根本就不必修改代碼內(nèi)容。但是其他讀者反映這樣做了無效。你看讹俊,同樣是Windows垦沉,環(huán)境差異都是如此之大的。

操作系統(tǒng)仍劈、Python軟件版本厕倍、調(diào)用的相關(guān)軟件包版本……這些環(huán)境差異可能直接導(dǎo)致你“照葫蘆畫葫蘆”時(shí)候出現(xiàn)嚴(yán)重問題,也是最容易踩到的坑贩疙。不過通過咱們前面的敘述讹弯,相信你已經(jīng)找到了從坑里爬起來,甚至是避開坑的方法了这溅。

畫瓢

當(dāng)你完整重現(xiàn)樣例或教程中的運(yùn)行結(jié)果后组民,就該開始照著葫蘆畫瓢了。畢竟你需要分析的悲靴,是自己獨(dú)特的數(shù)據(jù)臭胜。

但是一定要注意,務(wù)必在“畫葫蘆”完成后癞尚,開始畫瓢耸三。來信和留言中的許多問題,都是讀者在沒有完整重現(xiàn)教程結(jié)果時(shí)浇揩,就開始了改動(dòng)仪壮,把不同層次的問題混雜在了一起,就很難發(fā)現(xiàn)和解決了睛驳。

這里咱們舉的例子,是這位讀者的來信膜廊。

他看了我那篇《如何用Python做輿情時(shí)間序列可視化乏沸?》之后,完全重現(xiàn)了結(jié)果爪瓜。然后灌入了自己的數(shù)據(jù)蹬跃。我展示的樣例用的是飯館點(diǎn)評(píng)信息,他用的是外賣評(píng)論信息铆铆。

這是我原文中讀入后數(shù)據(jù)的樣例:

這是他的數(shù)據(jù):

看起來很相似蝶缀,不是嗎?可是前面情感分析等環(huán)節(jié)都沒有問題薄货。到了最后的繪制圖形翁都,又是一堆報(bào)錯(cuò)信息。

復(fù)習(xí)一下谅猾,我們說過報(bào)錯(cuò)信息的開頭和結(jié)尾最為重要柄慰。開頭是確定位置鳍悠。因?yàn)檫@里本來就只有一行語句,所以可以忽略坐搔。那我們看看結(jié)尾吧藏研。

注意,這里提示的是取值錯(cuò)誤(ValueError)概行,并且標(biāo)出了問題蠢挡,就是評(píng)論時(shí)間,例如“2017-02-27”凳忙。

回顧一下业踏,在原文中,評(píng)論時(shí)間的格式為Python可以識(shí)別的時(shí)間單位涧卵,這樣最后繪出的圖形才是這樣的:

而這里堡称,時(shí)間顯示為“2017-02-27”,應(yīng)該沒錯(cuò)啊艺演。

數(shù)據(jù)框中的時(shí)間是從新到舊排列的。我們顯示最后一條數(shù)據(jù)桐臊,就是“2017-02-27”胎撤。

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

type()

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

這一下子断凶,原形畢露了伤提。數(shù)據(jù)框里面的每一個(gè)時(shí)間條目,存儲(chǔ)的格式都不是Python日期认烁,而是簡(jiǎn)單的字符串肿男!難怪當(dāng)我們需要繪制時(shí)間序列圖形的時(shí)候,會(huì)報(bào)錯(cuò)却嗡。

明白了問題舶沛,方法也就容易找到了。我們?cè)俅斡盟阉饕娲凹郏檎襊andas里如庭,把字符串轉(zhuǎn)換為日期的方法。

其實(shí)Google已經(jīng)非常聰明地把最相關(guān)的結(jié)果擺在前面了撼港。但是我們依然可以用老方法坪它,找stackoverflow鏈接,并且點(diǎn)擊進(jìn)入帝牡。

選定答案里面清晰明白地告訴我們——使用Pandas數(shù)據(jù)框的to_datetime函數(shù)往毡,并且給出了詳細(xì)的樣例。

好的靶溜,我們?cè)囋嚳础?/p>

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

然后我們重新執(zhí)行剛才的兩條語句:

看开瞭,這次Python正確識(shí)別出日期格式懒震。

然后我們?cè)倮L圖:

雖然由于數(shù)據(jù)量過大,后半部分看不大清楚惩阶。不過結(jié)果已經(jīng)初步顯現(xiàn)了悯仙。下面就是分段截取數(shù)據(jù)食店,細(xì)致地進(jìn)行可視化的工作了。

問題出在哪里呢?對(duì)比一下原文使用的excel數(shù)據(jù)文件悟泵,和讀者來信里面附帶的數(shù)據(jù)文件,你就能看出端倪了赘风。

這是原文使用的餐館評(píng)論原始數(shù)據(jù):

這是讀者使用的外賣評(píng)論原始數(shù)據(jù):

你會(huì)看到髓考,原先數(shù)據(jù)里面不僅有日期,還有時(shí)間舞痰。雖然時(shí)間不過都是些“00:00:00”土榴,但Pandas在讀入的時(shí)候,會(huì)將其自動(dòng)轉(zhuǎn)化為日期時(shí)間格式响牛。

然而讀者數(shù)據(jù)里只有日期玷禽,沒有具體的時(shí)間。Pandas讀入數(shù)據(jù)時(shí)呀打,不確定要不要做轉(zhuǎn)化矢赁,默認(rèn)就當(dāng)成字符串來處理了。

所以你看贬丛,如果你需要“照葫蘆畫瓢”撩银,一定要仔細(xì)對(duì)比數(shù)據(jù)格式,即便是這樣微小的差異豺憔,都會(huì)造成后續(xù)運(yùn)行結(jié)果的區(qū)別额获,乃至報(bào)錯(cuò)。

找葫蘆

如果樣例里面沒有提供某個(gè)功能恭应,但是你確實(shí)需要用到它抄邀,怎么辦?

這個(gè)時(shí)候似乎手頭沒有葫蘆可以照著畫昼榛,你得自己找葫蘆撤摸。

例如讀完了我那篇《如何用Python做詞云?》后褒纲,有讀者在微信公眾號(hào)后臺(tái)留言准夷,詢問我如何在繪制詞云的時(shí)候,把詞云變成需要的形狀莺掠。

讀者想要的衫嵌,其實(shí)是這樣的效果:

但是我那篇文章里,并沒有提供這樣的樣例彻秆,只能做出下面這種四四方方的詞云圖楔绞。

如果你也遇到了類似的問題结闸,我的建議是,按圖索驥查詢?cè)嘉臋n酒朵。

你先看看文中桦锄,我們究竟用了哪個(gè)詞云繪制工具包。

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

這里蔫耽,我們注意wordcloud這個(gè)關(guān)鍵詞结耀,然后結(jié)合python,到搜索引擎里面查找匙铡。

這回我們不再專門去找stackoverflow網(wǎng)站鏈接了图甜。因?yàn)槲覀冇龅降模皇菆?bào)錯(cuò)信息鳖眼,而是一項(xiàng)暫時(shí)還不懂得如何使用的功能黑毅。

搜索結(jié)果里的第一項(xiàng),就是wordcloud詞云包的官方github站點(diǎn)钦讳。我們點(diǎn)開看看矿瘦。

Github是目前全球最主要的代碼托管與分享站點(diǎn)。我也曾經(jīng)把思維導(dǎo)圖秒變成幻燈代碼發(fā)布在github上面愿卒。右上方幾個(gè)統(tǒng)計(jì)數(shù)字很重要缚去,尤其是Star,說明了該項(xiàng)目受歡迎程度掘猿。wordcloud軟件包的受歡迎數(shù)字超過3000,可以說是非常棒的唇跨。相較之下稠通,我的代碼Star數(shù)量只有20,相形見絀啊买猖。

我們把網(wǎng)頁(yè)往下翻改橘,可以找到Example部分。

你是不是眼前一亮坝窨亍飞主?對(duì),你需要的繪圖結(jié)果就在這里高诺,而且人家有專門鏈接直達(dá)使用方式碌识。

點(diǎn)擊一下,你就能看到官方的masked詞云樣例代碼了虱而。

瀏覽代碼筏餐,你會(huì)發(fā)現(xiàn)這一段有集中注釋:

# 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")))

這里告訴你,如果打算把詞云繪制成特殊的圖形外觀牡拇,你需要在這里指定一個(gè)mask圖像文件魁瞪。樣例里面的文件叫做alice_mask.png穆律。

我們來看看,這個(gè)文件是什么樣子的导俘。因?yàn)樵创a就在這里峦耘,指定的文件也沒有加入完全路徑,因此它只可能放在樣例代碼文件的相同目錄下旅薄。

我們點(diǎn)擊頁(yè)面上方的路徑鏈接辅髓,返回到上層目錄。

目錄里面所有的文件都在這里了赋秀。我們找到alice_mask.png利朵,點(diǎn)開看看。

原來你需要提供這樣一張黑白圖像猎莲,詞云會(huì)顯示在其中的黑色區(qū)域內(nèi)绍弟。

但是這樣的圖像需要我自己來繪制嗎?

這就考驗(yàn)?zāi)憧创a的時(shí)候是不是細(xì)致了著洼。有沒有注意到這一句樟遣?

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

這是alice_mask.png圖像文件原始地址。我們點(diǎn)擊看看身笤。

原來這個(gè)網(wǎng)站上的文件直接就可以用來做詞云圖像設(shè)置豹悬。我們看到上方的路徑按鈕,點(diǎn)擊上一層液荸,進(jìn)入“movies”瞻佛。

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

我們?cè)龠M(jìn)入到上一層娇钱,看看還有哪些其他類別圖像可用伤柄。

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

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

回到Jupyter Notebook里面,按照我們從原始說明文檔里找到的新葫蘆硝皂,開始畫瓢常挚。

如果你做出了下面的結(jié)果,那么恭喜你稽物,“找葫蘆畫瓢”工作圓滿完成待侵。

小結(jié)

小結(jié)一下,對(duì)文科生來說姨裸,編程中遇到的問題秧倾,需要依據(jù)不同的場(chǎng)景怨酝,分別采取不同的思考清單來嘗試有效解決。

對(duì)于“照葫蘆畫葫蘆”類場(chǎng)景那先,方法如下:

  1. 確認(rèn)你的運(yùn)行環(huán)境盡量和作者的運(yùn)行環(huán)境一致(安裝相同的軟件版本)农猬。如果環(huán)境不一致(例如操作系統(tǒng)差異),遇到問題的時(shí)候要時(shí)刻意識(shí)到這種差異可能是造成無法重復(fù)結(jié)果的元兇售淡。
  2. 把遇到問題的代碼拆解開斤葱。聚焦到實(shí)際產(chǎn)生了問題的代碼片段上。這就是所謂的“分而治之”揖闸。
  3. 認(rèn)真閱讀報(bào)錯(cuò)信息揍堕,里面有非常重要的線索。尤其是開頭和結(jié)尾部分汤纸。
  4. 善用搜索引擎衩茸,輸入可以準(zhǔn)確定義問題的關(guān)鍵字。
  5. 明白stackoverflow網(wǎng)站的重要性贮泞,其中被支持的答案可能一語道破你百思不得其解的問題啃擦。

對(duì)于“照葫蘆畫瓢”類場(chǎng)景令蛉,方法如下:

  1. 確認(rèn)你已經(jīng)圓滿完成了“照葫蘆畫葫蘆”過程蝎宇。
  2. 確保你自己的數(shù)據(jù)格式與樣例中數(shù)據(jù)格式一致函卒。
  3. 認(rèn)真閱讀報(bào)錯(cuò)信息,從中找到問題的大致方向腕巡。
  4. 利用搜索引擎查找類似問題的已知有效解決方法。尤其要注意stackoverflow網(wǎng)站的相關(guān)鏈接择懂。

對(duì)于“找葫蘆畫瓢”類場(chǎng)景谦去,方法如下:

  1. 依照類似的功能要糊,按圖索驥找到提供相應(yīng)功能的軟件包飘痛。
  2. 閱讀其官方說明文檔,最好能找到特定功能的樣例代碼。
  3. 讀代碼的時(shí)候務(wù)必注意注釋信息,其中包含了注意事項(xiàng)和重要資源。
  4. 自己實(shí)踐的第一步兼都,是用找到的“新葫蘆”畫出“葫蘆”來慎王,然后再嘗試“畫瓢”漫蛔。

不論對(duì)于哪一類場(chǎng)景毯盈,你都要明白遇到的問題可能會(huì)成為你未來的財(cái)富脑奠。但前提是你必須把它們及時(shí)記錄下來轰豆,并且養(yǎng)成定期回顧的好習(xí)慣。

如果實(shí)在解決不了問題,最后的一招祷杈,就是提問了云茸。但是請(qǐng)你在發(fā)問之前冤今,確定自己已經(jīng)通過上述步驟和流程嘗試了可能有效的方法。這不僅是《提問的智慧》里面要求的茂缚,更是為了你自己能夠?qū)W有所得龟糕。提問的時(shí)候,要注意提供你的運(yùn)行代碼(最好是ipynb這樣的格式悔耘,包含完整的報(bào)錯(cuò)信息)讲岁、用到的實(shí)際數(shù)據(jù),以及你的嘗試過程等衬以。信息越詳細(xì)缓艳,別人就越有能力幫助你。

向誰提問呢看峻?當(dāng)然可以問老師阶淘、問作者。但是別忘了你一直在使用的stackoverflow網(wǎng)站互妓,本來就是一個(gè)讓你提問的好地方啊舶治。通過觀察別人的問題和答案,你應(yīng)該不難發(fā)現(xiàn)车猬,網(wǎng)站上的高手們霉猛,大都非常熱心助人。

另外珠闰,不要滿足于永遠(yuǎn)當(dāng)一個(gè)“文科生”惜浅。如果你打算在數(shù)據(jù)科學(xué)的路徑上走得足夠遠(yuǎn)、足夠穩(wěn)伏嗜,夯實(shí)基礎(chǔ)就是必要的坛悉。畢竟人工智能都要進(jìn)入中小學(xué)課程體系了,不是嗎承绸?

如果你打算好好學(xué)習(xí)Python基礎(chǔ)知識(shí)裸影,歡迎閱讀《如何高效學(xué)Python?》一文军熏。

討論

你用Python或者其他編程語言做過數(shù)據(jù)科學(xué)分析任務(wù)嗎轩猩?中間遇到過問題或障礙嗎?你是如何處理的,成功了嗎均践?有什么獨(dú)特的好經(jīng)驗(yàn)晤锹?歡迎留言,分享你的經(jīng)驗(yàn)和心得彤委,我們一起交流討論鞭铆。

喜歡請(qǐng)點(diǎn)贊。還可以微信關(guān)注和置頂我的公眾號(hào)“玉樹芝蘭”(nkwangshuyi)焦影。

如果你對(duì)數(shù)據(jù)科學(xué)感興趣车遂,不妨閱讀我的系列教程索引貼《如何高效入門數(shù)據(jù)科學(xué)?》斯辰,里面還有更多的有趣問題及解法艰额。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市椒涯,隨后出現(xiàn)的幾起案子柄沮,更是在濱河造成了極大的恐慌,老刑警劉巖废岂,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祖搓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡湖苞,警方通過查閱死者的電腦和手機(jī)拯欧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來财骨,“玉大人镐作,你說我怎么就攤上這事÷÷幔” “怎么了该贾?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)捌臊。 經(jīng)常有香客問我杨蛋,道長(zhǎng),這世上最難降的妖魔是什么理澎? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任逞力,我火速辦了婚禮,結(jié)果婚禮上糠爬,老公的妹妹穿的比我還像新娘寇荧。我一直安慰自己,他們只是感情好执隧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布揩抡。 她就那樣靜靜地躺著户侥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捅膘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天滚粟,我揣著相機(jī)與錄音寻仗,去河邊找鬼。 笑死凡壤,一個(gè)胖子當(dāng)著我的面吹牛署尤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播亚侠,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼曹体,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了硝烂?” 一聲冷哼從身側(cè)響起箕别,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎滞谢,沒想到半個(gè)月后串稀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狮杨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年母截,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片橄教。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡清寇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出护蝶,到底是詐尸還是另有隱情华烟,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布持灰,位于F島的核電站垦江,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏搅方。R本人自食惡果不足惜比吭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望姨涡。 院中可真熱鬧衩藤,春花似錦、人聲如沸涛漂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瓢剿,卻和暖如春逢慌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背间狂。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工攻泼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鉴象。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓忙菠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親纺弊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子牛欢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容