c++输出txt格式循环一组数据后换行再循环一次_numpy、pandas以及用pandas做数据分析的案例...
????本文也是秦路老師python教程的學習筆記。這篇也是發給超哥看的:很多人說python很簡單很好學,也有很多人說python沒有java和c的功能強大。但是這都不重要,重要的是我們想學了,想畫圖也好做數據分析也罷,想學了就直接開始就好。聽一個python的課程,大概20個小時,復習加練習40個小時,其實只要一個月就可以上手了。
????如文章所示,基本是課程內容的復現與基本概念的介紹,行文邏輯混亂,排版也不好看。但是,沒關系,學習就是從模仿開始的。因為想學就去做,just to do it,不要求自己做出來東西好看,質量高,只是要求行動起來。想學python就去直接去學,不想學更沒關系沒必要因為別人在做這個就去學。說給超哥,也說給自己。想做的就去做,哪怕做的不夠好,都沒關系的。
目錄:
1?numpy
2?pandas
3?用pandas做數據分析案例
1 numpy
??? numpy的數據結構是n維的數組ndarray。Python的list雖然也能表示,但是不高效。首先載入numpy,as是命名為別名,np是numpy公認的的簡寫。
? ? 數組的創建使用numpy中array函數,前面加np。如圖所示將列表list轉換成了numpy的數組。
????嵌套列表會被轉換為多維數組,也可以叫做矩陣。array數組要注意的是,它內部的元素必須是相同類型,比如數值或者字符串??梢杂胐type查詢其類型,不用加括號。
??? numpy的數據類型比較豐富,當我們轉換數據格式的時候,可以使用astype函數。
????數組的計算很方便,不要大量的循環就可以批量運算。
????數組索引和列表相同,使用方括號和數字,也可以直接賦值。
? ? 用遞歸對多維數組進行篩選,如果省略了后面的索引,則返回次一級的維度,這和list一樣。
? ? 就數據分析而言,pandas是一個更常使用的包,有點像我們熟悉的excel和sql。
2?pandas
??? pandas有兩個主要的數據結構,Series和DataFrame。Series類似于一維數組,和numpy的array接近,由一組數據和數據標簽組成。數據標簽有索引的作用。
? 2.1 Series
?加載pandas包,通過Series函數生成一個對象。我們很明顯地看到,在jupyter上它的樣式不同于array,它是豎著的。右邊是我們輸入的一組數據,左邊是數據的索引,即標簽。數據標簽是pandas區分于numpy的重要特征。索引不一定是從0開始的數字,它可以被定義。
????索引的概念有點像SQL中的主鍵,不過它的功能更強大,分析師能夠很輕松的通過索引選取一個數據或者一組數據。
??? index函數可以顯示Series的索引。Series和array一樣,通過方括號選取數據,當要選擇多個數據時,需要使用列表。如果數據是一個字典,也能直接創建Series。
? ? 這時候,字典的key就是Series的索引。
??? Series有自動對齊索引的功能,當自定義的索引qinqin和字典隊員不上時,會自動選擇NaN,即結果為空,表示缺失。缺失值的處理會在后續講解。
2.2 DataFrame
??? Series是一維的數據結構,DataFrame是一個表格型的數據結構,它含有不同的列,每列都是不同的數據類型。我們可以把DataFrame看作Series組成的字典,它既有行索引也有列索引。它類似一張excel表格或者SQL,只是功能更強大。構建DataFrame的方法有很多,最簡單的的是導入一個字典。
??? DataFrame會自動補充索引,并且將字典的key作為列標簽,即column。在這里,dict的key順序是DataFame的順序,不再是無序的。DataFrame中可以通過info函數直接查看數據類型和統計。
????列名后面是列的非空值統計量,以及數據類型,最后一行是DataFrame占用的內存大小,對于pandas來說,千萬行幾百兆的數據處理起來都很方便。
??? DataFrame的數據類型變更和numpy一樣,用astype就行。df.age = df.age.astype。DataFrame的索引方式和Series一樣,它選取的是列。
? 返回的是一組Series,索引和原DataFrame一致。除了方括號選取,DataFrame還有更簡單的選取方法。
????行可以直接以切片的形式獲取行,切片的作用和數組一樣。但是,切片無法用單獨的數字選取,只能用冒號切選范圍。列可以通過賦值的方式修改和添加,當列的名稱是全新,則會在DataFrame的最右邊自動加上新的一列。
????列表和數組都可以賦值到列,長度必須匹配,列表是按照順序,數組的話,可以按index參數設置的索引對應,若為空,則填上缺失值。DataFrame的index不能改變,這是為了數據的安全性,但是可以通過index函數獲取詳情。
??? DataFrame在數據選取方面也很方便。
????它支持常用的邏輯判斷,比如通過布爾數組過濾出我們需要的結果。
??? df.sex == '男'返回了一個布爾數組(ps:是兩個等號,一個等號是賦值),然后通過布爾數組找出df中符合條件為true的結果?,F在我們希望找年齡在20以下,且性別為男的樣本。
????這里用到布爾類型數據的計算公式,true and true 為true,false and true 為false。pandas中的邏輯符號,并且是&,或者是|。接下來過濾出性別為女,或者年齡為18的人。
????當邏輯條件復雜的時候,這種寫法并不好看,比如性別為男,且年齡在18歲,以及性別為女,且年齡在18歲以上的兩類人群,這種過濾條件就比較復雜了。pandas中可以用query函數以類SQL語言執行查詢。
??? query中可以直接使用列名,它的功能遠不至于此,大家有興趣可以深入學習。
??? DataFrame可以直接在列上進行運算,當DataFrame和DataFrame之間運算時,按索引進行加減乘除。
????如果直接用加法,若列名匹配不上,會產生NaN 的缺失值,我們可以在后續后續fillna函數填充。另外一種方法是add函數,它可以直接通過參數選擇填充值。減乘除對應sub、mul、div。DataFrame還有兩個常用函數,又特別容易搞混的是,iloc和loc。
????它們都是通過索引選取行,iloc是通過所在行的數字為索引,loc是所在行的標簽為索引,簡單講,iloc是第幾行,loc是標簽。當索引沒有標簽時,loc和iloc等價。兩者支持冒號的范圍選擇。當行和列需要同時選擇的時候,用逗號分割,逗號前是想要選擇的行,逗號后是想要選擇的列。
3?用pandas做數據分析案例
數據分析的過程包括數據讀取、數據概述、數據清洗,整理分析和數據可視化。
????????首先加載數據。
????在pandas中,常用的載入函數是read_csv、read_excel、read_table和read_sql。這里用read_csva,read_csv有幾個重要參數:①encoding用來讀取csv格式的編碼,包括gb2312和utf-8;②sep是分割符,有些csv文件用逗號分割列,有些是分號,有些是\t,這些都需要具體設置;③header表示是否使用表頭作為列名,默認是;④names可以為列設置額外的名字,比如csv中的表頭是中文,使用name可以轉換成英文。
????因為數據集df的數據太多,如果我們只是大致瀏覽一下,可以使用head()或者tail()來看前5行或者后5行,也可以用sample(5)隨機選取5行看一下。
? ? 在這個數據集中,薪資中的數據是最臟的,后續需要拆成兩列,看一下有沒有重復數據。
??? unique函數可返回唯一值,數據集中positionId是職位ID,唯一值。配合len函數計算出唯一值共有5031個,說明有多出來的重復值。這里使用drop_duplicates清洗掉。ps:建議每次刪除數據后都重新設置一下索引。
??? drop_duplicates函數中也有一些重要參數:keep是保留方式,first是留第一個,last還是刪除前面,保留最后一個。duplicated函數功能類似,不過它返回的是布爾值。接下來處理salary薪資。目的是計算出薪資下限以及薪資上限。
????數據類型轉換為數字,使用匿名函數lamba。很多時候我們并不需要復雜地使用def定義函數,而用lamdba作為一次性函數。axis是apply中的參數,axis=1表示將函數用在行,axis=0則是列。
? ? 到這里,數據清洗的工作完成。
????對數據進行幾個描述統計。
??? value_counts是計數,統計所有非零元素的個數,以降序的方式輸出Series。數據中可以看到北京招募的數據分析師是最多的。ps:北京的崗位是多一些,包括風控策略的崗位在上海深圳杭州都沒有北京多。我們可以再分析數據分析師的學歷要求,工作年限要求等。針對數據分析師的薪資,我們用describe函數。
? ? 數據分析師的薪資的平均數是17k,中位數是15k,差別不大,最大薪資在75k,應該是數據科學家或者數據分析總監檔位的水平。標準差在8.99k,有一定的波動性,大部分分析師薪資在17+—9k之間。一般分類數據用value_counts,數值數據用describe,這是最常用的兩個統計函數。說了這么多文字,還是不夠直觀,我們用圖表說話。pandas自帶繪圖函數,它是以matplotlib包為基礎封裝,所以兩者能夠結合使用。
????%matplotlib inline是jupyter自帶的方式,允許圖表在cell中輸出。
????用hist函數很方便的就繪制除出直方圖,比excel快多了。圖表列出了數據分析師薪資的分布,因為大部分薪資集中20k以下,為了更細的粒度。將直方圖的寬距縮小。
????數據分布呈雙峰狀,因為原始數據來源于招聘網站的爬取,薪資非常容易集中在某個區間,不是真實薪資的反應(10~20k的區間,以本文的計算公式,只會粗暴地落在15k,而非均勻分布)。數據分析的一大思想是細分維度,現在觀察不同城市、不同學歷對薪資的影響。箱線圖是最佳的觀測方式。
????圖表的標簽出了問題,出現了白框,主要是圖表默認用英文字體,而這里的都是中文,導致了沖突。所以需要改用matplotlib。
????首先加載字體管理包,設置一個載入中文字體的變量,不同系統的路徑不一樣。boxplot是我們調用的箱線圖函數,column選擇箱線圖的數值,by是選擇分類變量,figsize是尺寸。ax.get_xticklabels獲取坐標軸刻度,即無法正確顯示城市名的白框,利用set_fontpeoperties更改字體。于是獲得了我們想要的箱線圖。改變字體還有其他方法,大家可以網上搜索關鍵字「matplotlib 中文字體」,都有相應教程。從圖上我們看到,北京的數據分析師薪資高于其他城市,尤其是中位數。上海和深圳稍次,廣州甚至不如杭州。
????從學歷看,博士薪資遙遙領先,雖然在top區域不如本科和碩士,這點我們要后續分析。大專學歷稍有弱勢。
????工作年限看,薪資的差距進一步拉大,畢業生和工作多年的不在一個梯度。雖然沒有其他行業的數據對比,但是可以確定,數據分析師的職場上升路線還是挺光明的。到目前為止,我們了解了城市、年限和學歷對薪資的影響,但這些都是單一的變量,現在想知道北京和上海這兩座城市,學歷對薪資的影響。
????在by傳遞多個值,箱線圖的刻度自動變成元組,也就達到了橫向對比的作用(這方法其實并不好,以后會講解其他方式)。這種方法并不適宜元素過多的場景。從圖上可以看到,不同學歷背景下,北京都是稍優于上海的,北京愿意花費更多薪資吸引數據分析師,而在博士這個檔次,也是一個大幅度的跨越。我們不妨尋找其中的原因。在pandas中,需要同時用到多個維度分析時,可以用groupby函數。它和SQL中的group by差不多,能將不同變量分組。
????上圖是標準的用法,按city列,針對不同城市進行了分組。不過它并沒有返回分組后的結果,只返回了內存地址。這時它只是一個對象,沒有進行任何的計算,現在調用groupby的count方法。
????它返回的是不同城市的各列計數結果,因為沒有NaN,每列結果都是相等的?,F在它和value_counts等價。
????換成mean,計算出了不同城市的平均薪資。因為mean方法只針對數值,而各列中只有avgSalary是數值,于是返回了這個唯一結果。
??? groupby可以傳遞一組列表,這時得到一組層次化的Series。按城市和學歷分組計算了平均薪資。
????后面再調用unstack方法,進行行列轉置,這樣看的就更清楚了。在不同城市中,博士學歷最高的薪資在深圳,碩士學歷最高的薪資在杭州。北京綜合薪資最好。這個分析結論有沒有問題呢?不妨先看招聘人數。
????這次換成count,我們在groupby后面加一個avgSalary,說明只統計avgSalary的計數結果,不用混入相同數據。圖上的結果很明確了,要求博士學歷的崗位只有6個,所謂的平均薪資,也只取決于公司開出的價碼,波動性很強,畢竟這只是招聘薪資,不代表真實的博士在職薪資。這也解釋了上面幾個圖表的異常。groupby其實和數據透視表很相似。pandas其實有專門的數據透視函數,在另外一方面,groupby確實能完成不少透視工作。接下來計算不同公司招聘的數據分析師數量,并且計算平均數。
????這里使用了agg函數,同時傳入count和mean方法,然后返回了不同公司的計數和平均值兩個結果。所以前文的mean,count,其實都省略了agg。agg除了系統自帶的幾個函數,它也支持自定義函數。
????上圖用lamba函數,返回了不同公司中最高薪資和最低薪資的差值。agg是一個很方便的函數,它能針對分組后的列數據進行豐富多彩的計算。但是在pandas的分組計算中,它也不是最靈活的函數。
????自定義了函數topN,將傳入的數據計數,并且從大到小返回前五的數據。然后以city聚合分組,因為求的是前5的公司,所以對companyShortName調用topN函數。同樣的,如果我想知道不同城市,各職位招聘數前五,也能直接調用topN
????可以看到,雖說是數據分析師,其實有不少的開發工程師,數據產品經理等。這是抓取下來數據的缺點,它反應的是不止是數據分析師,而是數據領域。不同城市的需求不一樣,北京的數據產品經理看上去要比上海高。agg和apply是不同的,雖然某些方法相近,比如求sum,count等,但是apply支持更細的粒度,它能按組進行復雜運算,將數據拆分合并,而agg則必須固定為列。運用group by,我們已經能隨意組合不同維度。接下來配合group by作圖。
????多重聚合在作圖上面沒有太大差異,行列數據轉置不要混淆即可。
????上述的圖例我們都是用pandas封裝過的方法作圖,如果要進行更自由的可視化,直接調用matplotlib的函數會比較好,它和pandas及numpy是兼容的。plt已經在上文中調用并且命名。
????上圖將上海和北京的薪資數據以直方圖的形式進行對比。因為北京和上海的分析師人數相差較遠,所以無法直接對比,需要用normed參數轉化為密度。設置alpha透明度,它比箱線圖更直觀。另外一種分析思路是對數據進行深加工。我們將薪資設立出不同的level。
??? cut的作用是分桶,它也是數據分析常用的一種方法,將不同數據劃分出不同等級,也就是將數值型數據加工成分類數據,在機器學習的特征工程中應用比較多。cut可以等距劃分,傳入一個數字就好。這里為了更好的區分,我傳入了一組列表進行人工劃分,加工成相應的標簽。
????用lambda轉換百分比,然后作堆積百分比柱形圖(matplotlib好像沒有直接調用的函數)。這里可以較為清晰的看到不同等級在不同地區的薪資占比。它比箱線圖和直方圖的好處在于,通過人工劃分,具備業務含義。0~3是實習生的價位,3~6是剛畢業沒有基礎的新人,整理數據那種,6~10是有一定基礎的,以此類推。現在只剩下最后一列數據沒有處理,標簽數據。
????現在的目的是統計數據分析師的標簽。它只是看上去干凈的數據,元素中的[]是無意義的,它是字符串的一部分,和數組沒有關系。你可能會想到用replace這類函數。但是它并不能直接使用。df_clean.positionLables.replace會報錯,為什么呢?因為df_clean.positionLables是Series,并不能直接套用replace。apply是一個好方法,但是比較麻煩。這里需要str方法。
??? str方法允許我們針對列中的元素,進行字符串相關的處理,這里的[1:-1]不再是DataFrame和Series的切片,而是對字符串截取,這里把[]都截取掉了。如果漏了str,就變成選取Series第二行至最后一行的數據,切記。
????使用完str后,它返回的仍舊是Series,當我們想要再次用replace去除空格。還是需要添加str的。現在的數據已經干凈不少。positionLables本身有空值,所以要刪除,不然容易報錯。再次用str.split方法,把元素中的標簽按「,」拆分成列表。
????這里是重點,通過apply和value_counts函數統計標簽數。因為各行元素已經轉換成了列表,所以value_counts會逐行計算列表中的標簽,apply的靈活性就在于此,它將value_counts應用在行上,最后將結果組成一張新表。
????用unstack完成行列轉換,看上去有點怪,因為它是統計所有標簽在各個職位的出現次數,絕大多數肯定是NaN。
????將空值刪除,并且重置為DataFrame,此時level_0為標簽名,level_1為df_index的索引,也可以認為它對應著一個職位,0是該標簽在職位中出現的次數,之前我沒有命名,所以才會顯示0。部分職位的標簽可能出現多次,這里忽略它。
????最后用groupby計算出標簽出現的次數。到這里,已經計算出我們想要的結果。
總結
以上是生活随笔為你收集整理的c++输出txt格式循环一组数据后换行再循环一次_numpy、pandas以及用pandas做数据分析的案例...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 正则表达式 组合_java基础
- 下一篇: python 将两幅图拼接_清华王教授典