本文目錄一覽:
- 1、請問python tk如何生成圖片這種表格,並且可以在空白處添加內容後保存到新的word?
- 2、python將表格展示的數據生成圖片
- 3、如何用 Python 實現一個圖數據庫(Graph Database)?
- 4、基於python的prosper借貸平台之數據分析
- 5、如何用Python製作優美且功能強大的數據可視
- 6、怎樣使用Python圖像處理
請問python tk如何生成圖片這種表格,並且可以在空白處添加內容後保存到新的word?
如何利用python爬取數據並保存為word文檔?請看下面的經驗吧! 方法/步驟 在做爬取數據之前,你需要下載安裝兩個東西,一個是urllib,另外一個是python-docx. 然後在python的編輯器中輸入import選項,提供這兩個庫的服務 urllib主要負責抓取網頁的數據,單純的抓取網頁數據其實很簡單,輸入如圖所示的命令,後面帶鏈接即可. 抓取下來了,還不算,必須要進行讀取,否則無效. 接下來就是抓碼了,不轉碼是完成不了保存的,將讀取的函數read轉碼.再隨便標記一個比如XA. 最後
如何利用python爬取數據並保存為word文檔?請看下面的經驗吧!
方法/步驟
在做爬取數據之前,你需要下載安裝兩個東西,一個是urllib,另外一個是python-docx。
然後在python的編輯器中輸入import選項,提供這兩個庫的服務
urllib主要負責抓取網頁的數據,單純的抓取網頁數據其實很簡單,輸入如圖所示的命令,後面帶鏈接即可。
抓取下來了,還不算,必須要進行讀取,否則無效。
接下來就是抓碼了,不轉碼是完成不了保存的,將讀取的函數read轉碼。再隨便標記一個比如XA。
最後再輸入三句,第一句的意思是新建一個空白的word文檔。
第二句的意思是在文檔中添加正文段落,將變量XA抓取下來的東西導進去。
第三句的意思是保存文檔docx,名字在括號裏面。
這個爬下來的是源代碼,如果還需要篩選的話需要自己去添加各種正則表達式。
python將表格展示的數據生成圖片
最近有一個需求,在界面對表格進行自動截圖,然後將圖片存起來
第一種: selenium +chromedirver + pillow
使用自動化工具,網頁截圖, 通過元素定位到具體位置,pillow進行裁剪得出最理想結果,此方案還是存在很大誤差,因為表格數據數量非固定的,計算誤差很大,難以精準
第二種: prettytable + pillow
通過prettytable將數據生成簡單表格布局,通過pillow 生成圖片,這個方案簡單容易,但是表格樣式過於醜陋,暫不考慮
第三種: html-table + imgkit
通過html-table將數據生成帶樣式的html文件,然後使用imgkit 轉換成圖片,該方案是目前最理想的
1、環境安裝
2、demo演示
imgkit官方文檔:
如何用 Python 實現一個圖數據庫(Graph Database)?
本文章是 重寫 500 Lines or Less 系列的其中一篇,目標是重寫 500 Lines or Less 系列的原有項目:Dagoba: an in-memory graph database。
Dagoba 是作者設計用來展示如何從零開始自己實現一個圖數據庫( Graph Database )。該名字似乎來源於作者喜歡的一個樂隊,另一個原因是它的前綴 DAG 也正好是有向無環圖 ( Directed Acyclic Graph ) 的縮寫。本文也沿用了該名稱。
圖是一種常見的數據結構,它將信息描述為若干獨立的節點( vertex ,為了和下文的邊更加對稱,本文中稱為 node ),以及把節點關聯起來的邊( edge )。我們熟悉的鏈表以及多種樹結構可以看作是符合特定規則的圖。圖在路徑選擇、推薦算法以及神經網絡等方面都是重要的核心數據結構。
既然圖的用途如此廣泛,一個重要的問題就是如何存儲它。如果在傳統的關係數據庫中存儲圖,很自然的做法就是為節點和邊各自創建一張表,並用外鍵把它們關聯起來。這樣的話,要查找某人所有的子女,就可以寫下類似下面的查詢:
還好,不算太複雜。但是如果要查找孫輩呢?那恐怕就要使用子查詢或者 CTE(Common Table Expression) 等特殊構造了。再往下想,曾孫輩又該怎麼查詢?孫媳婦呢?
這樣我們會意識到,SQL 作為查詢語言,它只是對二維數據表這種結構而設計的,用它去查詢圖的話非常笨拙,很快會變得極其複雜,也難以擴展。針對圖而言,我們希望有一種更為自然和直觀的查詢語法,類似這樣:
為了高效地存儲和查詢圖這種數據結構,圖數據庫( Graph Database )應運而生。因為和傳統的關係型數據庫存在極大的差異,所以它屬於新型數據庫也就是 NoSql 的一個分支(其他分支包括文檔數據庫、列數據庫等)。圖數據庫的主要代表包括 Neo4J 等。本文介紹的 Dagoba 則是具備圖數據庫核心功能、主要用於教學和演示的一個簡單的圖數據庫。
原文代碼是使用 JavaScript 編寫的,在定義調用接口時大量使用了原型( prototype )這種特有的語言構造。對於其他主流語言的用戶來說,原型的用法多少顯得有些彆扭和不自然。
考慮到本系列其他數據庫示例大多是用 Python 實現的,本文也按照傳統,用 Python 重寫了原文的代碼。同樣延續之前的慣例,為了讓讀者更好地理解程序是如何逐步完善的,我們用迭代式的方法完成程序的各個組成部分。
原文在 500lines 系列的 Github 倉庫中只包含了實現代碼,並未包含測試。按照代碼注釋說明,測試程序位於作者的另一個代碼庫中,不過和 500lines 版本的實現似乎略有不同。
本文實現的代碼參考了原作者的測試內容,但跳過了北歐神話這個例子——我承認確實不熟悉這些神祇之間的親緣關係,相信中文背景的讀者們多數也未必了解,雖然作者很喜歡這個例子,想了想還是不要徒增困惑吧。因此本文在編寫測試用例時只參考了原文關於家族親屬的例子,放棄了神話相關的部分,儘管會減少一些趣味性,相信對於入門級的代碼來說這樣也夠用了。
本文實現程序位於代碼庫的 dagoba 目錄下。按照本系列程序的同意規則,要想直接執行各個已完成的步驟,讀者可以在根目錄下的 main.py 找到相應的代碼位置,取消注釋並運行即可。
本程序的所有步驟只需要 Python3 ,測試則使用內置的 unittest , 不需要額外的第三方庫。原則上 Python3.6 以上版本應該都可運行,但我只在 Python3.8.3 環境下完整測試過。
本文實現的程序從最簡單的案例開始,通過每個步驟逐步擴展,最終形成一個完整的程序。這些步驟包括:
接下來依次介紹各個步驟。
回想一下,圖數據庫就是一些點( node )和邊( edge )的集合。現在我們要做出的一個重大決策是如何對節點/邊進行建模。對於邊來說,必須指定它的關聯關係,也就是從哪個節點指向哪個節點。大多數情況下邊是有方向的——父子關係不指明方向可是要亂套的!
考慮到擴展性及通用性問題,我們可以把數據保存為字典( dict ),這樣可以方便地添加用戶需要的任何數據。某些數據是為數據庫內部管理而保留的,為了明確區分,可以這樣約定:以下劃線開頭的特殊字段由數據庫內部維護,類似於私有成員,用戶不應該自己去修改它們。這也是 Python 社區普遍遵循的約定。
此外,節點和邊存在互相引用的關係。目前我們知道邊會引用到兩端的節點,後面還會看到,為了提高效率,節點也會引用到邊。如果僅僅在內存中維護它們的關係,那麼使用指針訪問是很直觀的,但數據庫必須考慮到序列化到磁盤的問題,這時指針就不再好用了。
為此,最好按照數據庫的一般要求,為每個節點維護一個主鍵( _id ),用主鍵來描述它們之間的關聯關係。
我們第一步要把數據庫的模型建立起來。為了測試目的,我們使用一個最簡單的數據庫模型,它只包含兩個節點和一條邊,如下所示:
按照 TDD 的原則,首先編寫測試:
與原文一樣,我們把數據庫管理接口命名為 Dagoba 。目前,能夠想到的最簡單的測試是確認節點和邊是否已經添加到數據庫中:
assert_item 是一個輔助方法,用於檢查字典是否包含預期的字段。相信大家都能想到該如何實現,這裡就不再列出了,讀者可參考 Github 上的完整源碼。
現在,測試是失敗的。用最簡單的辦法實現數據庫:
需要注意的是,不管添加節點還是查詢,程序都使用了拷貝後的數據副本,而不是直接使用原始數據。為什麼要這樣做?因為字典是可變的,用戶可以在任何時候修改其中的內容,如果數據庫不知道數據已經變化,就很容易發生難以追蹤的一致性問題,最糟糕的情況下會使得數據內容徹底混亂。
拷貝數據可以避免上述問題,代價則是需要佔用更多內存和處理時間。對於數據庫來說,通常查詢次數要遠遠多於修改,所以這個代價是可以接受的。
現在測試應該正常通過了。為了讓它更加完善,我們可以再測試一些邊緣情況,看看數據庫能否正確處理異常數據,比如:
例如,如果用戶嘗試添加重複主鍵,我們預期應拋出 ValueError 異常。因此編寫測試如下:
為了滿足以上測試,代碼需要稍作修改。特別是按照 id 查找主鍵是個常用操作,通過遍歷的方法效率太低了,最好是能夠通過主鍵直接訪問。因此在數據庫中再增加一個字典:
完整代碼請參考 Github 倉庫。
在上個步驟,我們在初始化數據庫時為節點明確指定了主鍵。按照數據庫設計的一般原則,主鍵最好是不具有業務含義的代理主鍵( Surrogate key ),用戶不應該關心它具體的值是什麼,因此讓數據庫去管理主鍵通常是更為合理的。當然,在部分場景下——比如導入外部數據——明確指定主鍵仍然是有用的。
為了同時支持這些要求,我們這樣約定:字段 _id 表示節點的主鍵,如果用戶指定了該字段,則使用用戶設置的值(當然,用戶有責任保證它們不會重複);否則,由數據庫自動為它分配一個主鍵。
如果主鍵是數據庫生成的,事先無法預知它的值是什麼,而邊( edge )必須指定它所指向的節點,因此必須在主鍵生成後才能添加。由於這個原因,在動態生成主鍵的情況下,數據庫的初始化會略微複雜一些。還是先寫一個測試:
為支持此功能,我們在數據庫中添加一個內部字段 _next_id 用於生成主鍵,並讓 add_node 方法返回新生成的主鍵:
接下來,再確認一下邊是否可以正常訪問:
運行測試,一切正常。這個步驟很輕鬆地完成了,不過兩個測試( DbModelTest 和 PrimaryKeyTest )出現了一些重複代碼,比如 get_item 。我們可以把這些公用代碼提取出來。由於 get_item 內部調用了 TestCase.assertXXX 等方法,看起來應該使用繼承,但從 TestCase 派生基類容易引起一些潛在的問題,所以我轉而使用另一個技巧 Mixin :
實現數據庫模型之後,接下來就要考慮如何查詢它了。
在設計查詢時要考慮幾個問題。對於圖的訪問來說,幾乎總是由某個節點(或符合條件的某一類節點)開始,從與它相鄰的邊跳轉到其他節點,依次類推。所以鏈式調用對查詢來說是一種很自然的風格。舉例來說,要知道 Tom 的孫子養了幾隻貓,可以使用類似這樣的查詢:
可以想像,以上每個方法都應該返回符合條件的節點集合。這種實現是很直觀的,不過存在一個潛在的問題:很多時候用戶只需要一小部分結果,如果它總是不計代價地給我們一個巨大的集合,會造成極大的浪費。比如以下查詢:
為了避免不必要的浪費,我們需要另外一種機制,也就是通常所稱的「懶式查詢」或「延遲查詢」。它的基本思想是,當我們調用查詢方法時,它只是把查詢條件記錄下來,而並不立即返回結果,直到明確調用某些方法時才真正去查詢數據庫。
如果讀者比較熟悉流行的 Python ORM,比如 SqlAlchemy 或者 Django ORM 的話,會知道它們幾乎都是懶式查詢的,要調用 list(result) 或者 result[0:10] 這樣的方法才能得到具體的查詢結果。
在 Dagoba 中把觸發查詢的方法定義為 run 。也就是說,以下查詢執行到 run 時才真正去查找數據:
和懶式查詢( Lazy Query )相對應的,直接返回結果的方法一般稱作主動查詢( Eager Query )。主動查詢和懶式查詢的內在查找邏輯基本上是相同的,區別只在於觸發機制不同。由於主動查詢實現起來更加簡單,出錯也更容易排查,因此我們先從主動查詢開始實現。
還是從測試開始。前面測試所用的簡單數據庫數據太少,難以滿足查詢要求,所以這一步先來創建一個更複雜的數據模型:
此關係的複雜之處之一在於反向關聯:如果 A 是 B 的哥哥,那麼 B 就是 A 的弟弟/妹妹,為了查詢到他們彼此之間的關係,正向關聯和反向關聯都需要存在,因此在初始化數據庫時需要定義的邊數量會很多。
當然,父子之間也存在反向關聯的問題,為了讓問題稍微簡化一些,我們目前只需要向下(子孫輩)查找,可以稍微減少一些關聯數量。
因此,我們定義數據模型如下。為了減少重複工作,我們通過 _backward 字段定義反向關聯,而數據庫內部為了查詢方便,需要把它維護成兩條邊:
然後,測試一個最簡單的查詢,比如查找某人的所有孫輩:
這裡 outcome/income 分別表示從某個節點出發、或到達它的節點集合。在原作者的代碼中把上述方法稱為 out/in 。當然這樣看起來更加簡潔,可惜的是 in 在 Python 中是個關鍵字,無法作為函數名。我也考慮過加個下劃線比如 out_.in_ 這種形式,但看起來也有點怪異,權衡之後還是使用了稍微啰嗦一點的名稱。
現在我們可以開始定義查詢接口了。在前面已經說過,我們計劃分別實現兩種查詢,包括主動查詢( Eager Query )以及延遲查詢( Lazy Query )。
它們的內在查詢邏輯是相通的,看起來似乎可以使用繼承。不過遵循 YAGNI 原則,目前先不這樣做,而是只定義兩個新類,在滿足測試的基礎上不斷擴展。以後我們會看到,與繼承相比,把共同的邏輯放到數據庫本身其實是更為合理的。
接下來實現訪問節點的方法。由於 EagerQuery 調用查詢方法會立即返回結果,我們把結果記錄在 _result 內部字段中。雖然 node 方法只返回單個結果,但考慮到其他查詢方法幾乎都是返回集合,為統一起見,讓它也返回集合,這樣可以避免同時支持集合與單結果的分支處理,讓代碼更加簡潔、不容易出錯。此外,如果查詢對象不存在的話,我們只返回空集合,並不視為一個錯誤。
查詢輸入/輸出節點的方法實現類似這樣:
查找節點的核心邏輯在數據庫本身定義:
以上使用了內部定義的一些輔助查詢方法。用類似的邏輯再定義 income ,它們的實現都很簡單,讀者可以直接參考源碼,此處不再贅述。
在此步驟的最後,我們再實現一個優化。當多次調用查詢方法後,結果可能會返回重複的數據,很多時候這是不必要的。就像關係數據庫通常支持 unique/distinct 一樣,我們也希望 Dagoba 能夠過濾重複的數據。
假設我們要查詢某人所有孩子的祖父,顯然不管有多少孩子,他們的祖父應該是同一個人。因此編寫測試如下:
現在來實現 unique 。我們只要按照主鍵把重複數據去掉即可:
在上個步驟,初始化數據庫指定了雙向關聯,但並未測試它們。因為我們還沒有編寫代碼去支持它們,現在增加一個測試,它應該是失敗的:
運行測試,的確失敗了。我們看看要如何支持它。回想一下,當從邊查找節點時,使用的是以下方法:
這裡也有一個潛在的問題:調用 self.edges 意味着遍歷所有邊,當數據庫內容較多時,這是巨大的浪費。為了提高性能,我們可以把與節點相關的邊記錄在節點本身,這樣要查找邊只要看節點本身即可。在初始化時定義出入邊的集合:
在添加邊時,我們要同時把它們對應的關係同時更新到節點,此外還要維護反向關聯。這涉及對字典內容的部分複製,先編寫一個輔助方法:
然後,將添加邊的實現修改如下:
這裡的代碼同時添加正向關聯和反向關聯。有的朋友可能會注意到代碼略有重複,是的,但是重複僅出現在該函數內部,本着「三則重構」的原則,暫時不去提取代碼。
實現之後,前面的測試就可以正常通過了。
在這個步驟中,我們來實現延遲查詢( Lazy Query )。
延遲查詢的要求是,當調用查詢方法時並不立即執行,而是推遲到調用特定方法,比如 run 時才執行整個查詢,返回結果。
延遲查詢的實現要比主動查詢複雜一些。為了實現延遲查詢,查詢方法的實現不能直接返回結果,而是記錄要執行的動作以及傳入的參數,到調用 run 時再依次執行前面記錄下來的內容。
如果你去看作者的實現,會發現他是用一個數據結構記錄執行操作和參數,此外還有一部分邏輯用來分派對每種結構要執行的動作。這樣當然是可行的,但數據處理和分派部分的實現會比較複雜,也容易出錯。
本文的實現則選擇了另外一種不同的方法:使用 Python 的內部函數機制,把一連串查詢變換成一組函數,每個函數取上個函數的執行結果作為輸入,最後一個函數的輸出就是整個查詢的結果。由於內部函數同時也是閉包,儘管每個查詢的參數形式各不相同,但是它們都可以被閉包「捕獲」而成為內部變量,所以這些內部函數可以採用統一的形式,無需再針對每種查詢設計額外的數據結構,因而執行過程得到了很大程度的簡化。
首先還是來編寫測試。 LazyQueryTest 和 EagerQueryTest 測試用例幾乎是完全相同的(是的,兩種查詢只在於內部實現機制不同,它們的調用接口幾乎是完全一致的)。
因此我們可以把 EagerQueryTest 的測試原樣不變拷貝到 LazyQueryTest 中。當然拷貝粘貼不是個好注意,對於比較冗長而固定的初始化部分,我們可以把它提取出來作為兩個測試共享的公共函數。讀者可參考代碼中的 step04_lazy_query/tests/test_lazy_query.py 部分。
程序把查詢函數的串行執行稱為管道( pipeline ),用一個變量來記錄它:
然後依次實現各個調用接口。每種接口的實現都是類似的:用內部函數執行真正的查詢邏輯,再把這個函數添加到 pipeline 調用鏈中。比如 node 的實現類似下面:
其他接口的實現也與此類似。最後, run 函數負責執行所有查詢,返回最終結果;
完成上述實現後執行測試,確保我們的實現是正確的。
在前面我們說過,延遲查詢與主動查詢相比,最大的優勢是對於許多查詢可以按需要訪問,不需要每個步驟都返回完整結果,從而提高性能,節約查詢時間。比如說,對於下面的查詢:
以上查詢的意思是從孫輩中找到一個符合條件的節點即可。對該查詢而言,主動查詢會在調用 outcome(‘son’) 時就遍歷所有節點,哪怕最後一步只需要第一個結果。而延遲查詢為了提高效率,應在找到符合條件的結果後立即停止。
目前我們尚未實現 take 方法。老規矩,先添加測試:
主動查詢的 take 實現比較簡單,我們只要從結果中返回前 n 條記錄:
延遲查詢的實現要複雜一些。為了避免不必要的查找,返回結果不應該是完整的列表( list ),而應該是個按需返回的可迭代對象,我們用內置函數 next 來依次返回前 n 個結果:
寫完後運行測試,確保它們是正確的。
從外部接口看,主動查詢和延遲查詢幾乎是完全相同的,所以用單純的數據測試很難確認後者的效率一定比前者高,用訪問時間來測試也並不可靠。為了測試效率,我們引入一個節點訪問次數的概念,如果延遲查詢效率更高的話,那麼它應該比主動查詢訪問節點的次數更少。
為此,編寫如下測試:
我們為 Dagoba 類添加一個成員來記錄總的節點訪問次數,以及兩個輔助方法,分別用於獲取和重置訪問次數:
然後瀏覽代碼,查找修改點。增加計數主要在從邊查找節點的時候,因此修改部分如下:
此外還有 income/outcome 方法,修改都很簡單,這裡就不再列出。
實現後再次運行測試。測試通過,表明延遲查詢確實在效率上優於主動查詢。
不像關係數據庫的結構那樣固定,圖的形式可以千變萬化,查詢機制也必須足夠靈活。從原理上講,所有查詢無非是從某個節點出發按照特定方向搜索,因此用 node/income/outcome 這三個方法幾乎可以組合出任意所需的查詢。
但對於複雜查詢,寫出的代碼有時會顯得較為瑣碎和冗長,對於特定領域來說,往往存在更為簡潔的名稱,例如:母親的兄弟可簡稱為舅舅。對於這些場景,如果能夠類似 DSL (領域特定語言)那樣允許用戶根據專業要求自行擴展,從而簡化查詢,方便閱讀,無疑會更為友好。
如果讀者去看原作者的實現,會發現他是用一種特殊語法 addAlias 來定義自己想要的查詢,調用方法時再進行查詢以確定要執行的內容,其接口和內部實現都是相當複雜的。
而我希望有更簡單的方法來實現這一點。所幸 Python 是一種高度動態的語言,允許在運行時向類中增加新的成員,因此做到這一點可能比預想的還要簡單。
為了驗證這一點,編寫測試如下:
無需 Dagoba 的實現做任何改動,測試就可以通過了!其實我們要做的就是動態添加一個自定義的成員函數,按照 Python 對象機制的要求,成員函數的第一個成員應該是名為 self 的參數,但這裡已經是在 UnitTest 的內部,為了和測試類本身的 self 相區分,新函數的參數增加了一個下劃線。
此外,函數應返回其所屬的對象,這是為了鏈式調用所要求的。我們看到,動態語言的靈活性使得添加新語法變得非常簡單。
到此,一個初具規模的圖數據庫就形成了。
和原文相比,本文還缺少一些內容,比如如何將數據庫序列化到磁盤。不過相信讀者都看到了,我們的數據庫內部結構基本上是簡單的原生數據結構(列表+字典),因此序列化無論用 pickle 或是 JSON 之類方法都應該是相當簡單的。有興趣的讀者可以自行完成它們。
我們的圖數據庫實現為了提高查詢性能,在節點內部存儲了邊的指針(或者說引用)。這樣做的好處是,無論數據庫有多大,從一個節點到相鄰節點的訪問是常數時間,因此數據訪問的效率非常高。
但一個潛在的問題是,如果數據庫規模非常大,已經無法整個放在內存中,或者出於安全性等原因要實現分佈式訪問的話,那麼指針就無法使用了,必須要考慮其他機制來解決這個問題。分佈式數據庫無論採用何種數據模型都是一個棘手的問題,在本文中我們沒有涉及。有興趣的讀者也可以考慮 500lines 系列中關於分佈式和集群算法的其他一些文章。
本文的實現和系列中其他數據庫類似,採用 Python 作為實現語言,而原作者使用的是 JavaScript ,這應該和作者的背景有關。我相信對於大多數開發者來說, Python 的對象機制比 JavaScript 基於原型的語法應該是更容易閱讀和理解的。
當然,原作者的版本比本文版本在實現上其實是更為完善的,靈活性也更好。如果想要更為優雅的實現,我們可以考慮使用 Python 元編程,那樣會更接近於作者的實現,但也會讓程序的複雜性大為增加。如果讀者有興趣,不妨對照着去讀讀原作者的版本。
基於python的prosper借貸平台之數據分析
項目介紹:
p2p 借貸業務具有門檻低,渠道成本低的特性,風險防控對於出借企業來說非常重要。本項目需要
從大量借貸者的數據集中分析出容易違約和不容易違約的人群畫像特徵,以給業務做貸前決策使
用。同時使用機器學習算法,實現自動識別風險人群(精準率為 89.86%),加快人工審查效率。
項目具體內容:
1、使用 python pandas 工具進行數據清洗、缺失值、異常值處理以及特徵指標篩選。
2、使用 python matplotlib 可視化工具進行探索式數據分析,展示用戶關鍵特徵如月收入、信用卡
透支情況對於違約率的影響情況。
3、使用機器學習隨機森林進行建模分析,使用學習曲線、網格搜索、交叉驗證,最終得到了一個評
分為 84.9%、精準率為 89.86%、召回率為 80.70%、auc 面積為 0.9337 數據預測模型。
本次數據訓練使用的模型是隨機森林分類算法,通過對預處理過的數據集進行訓練,使用學習曲線、網格搜索、交叉驗證。最終得到了一個評分為84.9%、精準率為89.86%、召回率為80.70%、 auc面積為0.9337 數據預測模型。
數據預處理的基本流程與思路:
1、首先要明確有多少特徵,哪些是連續的,哪些是類別的。
2、檢查有沒有缺失值,對確實的特徵選擇恰當方式進行彌補,使數據完整。
3、對連續的數值型特徵進行標準化,使得均值為0,方差為1。
4、對類別型的特徵進行one-hot編碼。
5、將需要轉換成類別型數據的連續型數據進行二值化。
6、為防止過擬合或者其他原因,選擇是否要將數據進行正則化。
7、在對數據進行初探之後發現效果不佳,可以嘗試使用多項式方法,尋找非線性的關係。
8、根據實際問題分析是否需要對特徵進行相應的函數轉換。
導入數據集,並查看數據基本情況。可以看到prosper原始數據量比較龐大,一個有113937個樣本,80個特徵列,1個標籤列。
1.1、特徵較多,先共刪減一部分無用的特徵。
1.2 查看數據缺失情況,可以看到有40個特徵是存在數據缺失的,缺失率從0.000219-0.882909不等。下面處理缺失數據。
1.2.1 刪除缺失值比較多的特徵
下面兩個特徵缺失率太高,且與我們要分析的相關性不大,直接刪除掉。
1.2.2 獲取數據類型是分類變量的所有特徵,並使用unknown進行填充
1.2.3 特殊變量使用計算公式進行填充
1.2.4 去掉意義重複列
1.2.5 刪除缺失率比較少的特徵的缺失數據行
處理完缺失數據後,樣本量為106290,特徵量為55
1.3 數據過濾
1.3.1 從2009年7月開始,Prosper調整了對客戶的評估方式,此次我們只對2009-07-01後的貸款進行分析。
過濾完數據後,樣本量變為82931,特徵量為54
2.1單變量分析
0為未違約人數,1位違約人數,可以看到2009.07以後,違約率為22.90%
2.1.1不同地區貸款數量分佈
從圖中可以看到加利福尼亞州貸款數量遠比其他州的數量高。由於prosper總部就位於加利福尼亞州,這與實際情況一致。其他排名靠前的分別是得克薩斯、紐約、佛羅里達、伊利諾伊,貸款數據均超過了5000條。根據2015年美國各州的GDP排名,這5個州剛好排名前五,而且順序也是一致的。說明Prosper平台的用戶主要分佈在美國經濟發達的地區。
2.1.2 貸款人收入情況分佈
年薪在25000美金以上在美國屬於技術性白領或者有一定學歷的職員,50000美金已經是近金領階層,比如:大學教授,醫生等。從圖中可以看出Prosper平台用戶的收入水平都相對較高,有利於用戶還款,利於平台和投資者的風險控制。
2.1.3貸款人職業分佈
從圖中可以看出,除了不願意透露具體職業的人,大部分用戶是教授、程序員、企業高管等具有一定社會地位的人,這部分人受過高等教育,信用有一定保障。另外,這與之前看到的收入情況相符。
2.1.4貸款人債務收入比分佈
大部分用戶的債務收入比在0.2左右,超過0.5的占很少部分。說明Prosper平台用戶的還款能力還是比較樂觀的
2.1.5 貸款者信用卡使用情況
BankcardUtilization代表的是信用卡使用金額和信用卡額度的比值,可以體現用戶的資金需求。Prosper用戶多是0.5~1之間,說明用戶每個月還有信用卡要還,降低了其還款能力。
2.2 相關的關鍵因素對貸款違約率的影響
2.2.1借貸人收入IncomeRange對違約率的影響
從圖中可以看出:
1.一般來說收入越高違約率越低
2.貸款的人員主要集中在中等收入群體
2.2.2 債務收入比DebtToIncomeRatio對違約率的影響
從上圖可以看出:
1.債務收入比小於0.6時,違約數明顯小於未違約數,
2.當債務收入比大於0.6時,兩者的差距不是很明顯甚至違約數大於未違約數,說明了債務收入比越大的人越容易違約
2.2.3 借款人BankcardUtilization對違約率的影響
1.總的來說,隨着信用卡的透支比例越來越高,違約率也越來越高
2.SuperUse的違約率到了37.5%,這部分人群需要嚴格了監控,No Use人群也有31%的違約率,當初將信用卡透支比例為0和NA的數據都歸類為No Use,顯然沒有這麼簡單,應該是大部分人群的NA值是為了隱藏自己的高透支比例而填寫的
2.2.4 消費信用分CreditScoreRange對違約率的影響
從上圖可以看出:
1.隨着信用分數CreditScore的上升,它的違約率在下降
2.大部分貸款者的信用分為650-800,違約率在0.06-0.02
2.2.5 過去7年借款人違約次數DelinquenciesLast7Years對違約率的影響
過去七年違約次數(DelinquenciesLast7Years)能夠衡量一個人在過去七年中徵信情況,違約一次或以上的人在借款時違約概率更大。
從上圖可以看出:
1.總體來說過去7年違約次數越多,違約率越高
2.過去7年未違約的人數相對來說比其他違約的人數高很多,具體看下面的分析
3.1 數據轉化
3.1.1類變量進行啞變量化
樣本量變為82931,特徵量為127
3.1.2 標籤變量進行二分類
已完成貸款的樣本量變為26365,特徵量為127
未違約率為:0.7709084012895885;違約率為0.22909159871041151
3.2 至此,數據預處理的工作就告一段落,保存預處理好的數據。
導入經過預處理的prosper借貸數據集
4.1 手工挑選特徵查看一下建模效果
準確率為0.7695
4.2 使用模型自己選取特徵
準確率為0.7780
4.3 使用學習曲線選取最優n_estimators
在0-200/20內學習,得到最優n_estimators=161,score = 0.8508
在151-171/20內學習,得到最優n_estimators=163,score = 0.8511
4.4 使用網格搜索調其他參數
在0-60/5內學習,得到最優max_depth=41
在0-60/5內學習,得到最優max_features=16
這裡由於比較耗時,沒有進一步細化選擇更高的參數
4.4 最終模型效果
最終準確率 0.8490528905289052
混淆矩陣 :
[[5552 554]
[1175 4914]]
精準率 : [0.82533076 0.89868325]
召回率 : [0.90926957 0.80702907]
roc和auc面積為0.9337
4.5 查看各特徵的重要性
4.6 數據預測
預測的違約率0.0427
如何用Python製作優美且功能強大的數據可視
主要方法,用於添加圖表的數據和設置各種配置項
print_echarts_options()
打印輸出圖表的所有配置項
render()
默認將會在根目錄下生成一個 render.html 的文件,支持 path 參數,設置文件保存位置,如 render(r」e:\my_first_chart.html」),文件用瀏覽器打開。
Note: 可以按右邊的下載按鈕將圖片下載到本地,如果想要提供更多實用工具按鈕,請在 add() 中設置 is_more_utils 為 True
from pyecharts import Bar
bar = Bar(“我的第一個圖表”, “這裡是副標題”)
bar.add(“服裝”,
[“襯衫”, “羊毛衫”, “雪紡衫”, “褲子”, “高跟鞋”, “襪子”], [5, 20, 36, 10, 75, 90],
is_more_utils=True)
bar.render()
怎樣使用Python圖像處理
Python圖像處理是一種簡單易學,功能強大的解釋型編程語言,它有簡潔明了的語法,高效率的高層數據結構,能夠簡單而有效地實現面向對象編程,下文進行對Python圖像處理進行說明。
當然,首先要感謝「戀花蝶」,是他的文章「用Python圖像處理 」 幫我堅定了用Python和PIL解決問題的想法,對於PIL的一些介紹和基本操作,可以看看這篇文章。我這裡主要是介紹點我在使用過程中的經驗。
PIL可以對圖像的顏色進行轉換,並支持諸如24位彩色、8位灰度圖和二值圖等模式,簡單的轉換可以通過Image.convert(mode)函數完 成,其中mode表示輸出的顏色模式。例如”L”表示灰度,”1”表示二值圖模式等。
但是利用convert函數將灰度圖轉換為二值圖時,是採用固定的閾 值127來實現的,即灰度高於127的像素值為1,而灰度低於127的像素值為0。為了能夠通過自定義的閾值實現灰度圖到二值圖的轉換,就要用到 Image.point函數。
深度剖析Python語法功能
深度說明Python應用程序特點
對Python數據庫進行學習研究
Python開發人員對Python經驗之談
對Python動態類型語言解析
Image.point函數有多種形式,這裡只討論Image.point(table, mode),利用該函數可以通過查表的方式實現像素顏色的模式轉換。其中table為顏色轉換過程中的映射表,每個顏色通道應當有256個元素,而 mode表示所輸出的顏色模式,同樣的,”L”表示灰度,”1”表示二值圖模式。
可見,轉換過程的關鍵在於設計映射表,如果只是需要一個簡單的箝位值,可以將table中高於或低於箝位值的元素分別設為1與0。當然,由於這裡的table並沒有什麼特殊要求,所以可以通過對元素的特殊設定實現(0, 255)範圍內,任意需要的一對一映射關係。
示例代碼如下:
import Image # load a color image im = Image.open(”fun.jpg”) # convert to grey level image Lim = im.convert(”L”) Lim.save(”fun_Level.jpg”) # setup a converting table with constant threshold threshold = 80 table = [] for i in range(256): if i threshold: table.append(0) else: table.append(1) # convert to binary image by the table bim = Lim.point(table, ”1”) bim.save(”fun_binary.jpg”)
IT部分通常要完成的任務相當繁重但支撐這些工作的資源卻很少,這已經成為公開的秘密。任何承諾提高編碼效率、降低軟件總成本的IT解決方案都應該進行 周到的考慮。Python圖像處理所具有的一個顯著優勢就是可以在企業的軟件創建和維護階段節約大量資金,而這兩個階段的軟件成本佔到了軟件整個生命周期中總成本 的50%到95%。
Python清晰可讀的語法使得軟件代碼具有異乎尋常的易讀性,甚至對那些不是最初接觸和開發原始項目的程序員都 能具有這樣的強烈感覺。雖然某些程序員反對在Python代碼中大量使用空格。
不過,幾乎人人都承認Python圖像處理的可讀性遠勝於C或者Java,後兩 者都採用了專門的字符標記代碼塊結構、循環、函數以及其他編程結構的開始和結束。提倡Python的人還宣稱,採用這些字符可能會產生顯著的編程風格差 異,使得那些負責維護代碼的人遭遇代碼可讀性方面的困難。轉載
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/186095.html