如何系統地學習Python 中 matplotlib, numpy, scipy, pandas?

最近在學習python繪製圖形的相關知識,學習到了這幾個庫,所以想請教一下各位知友。希望用python來做數據挖掘相關的任務。

想問問各位知友,python做數據挖掘是否足夠強大?學習數據挖掘需要學習哪些知識呢?我是一個本科生,本科學習的話能從事數據挖掘相關工作嗎?


總結一下自己學習,接觸了Numpy,Pandas,Matplotlib,Scipy,Scikit-learn,也算是入門,給出自己的軌跡(略去安裝),並總結一下其他人的答案,最後有彩蛋。

Numpy:

來存儲和處理大型矩陣,比Python自身的嵌套列表(nested list structure)結構要高效的多,本身是由C語言開發。這個是很基礎的擴展,其餘的擴展都是以此為基礎。數據結構為ndarray,一般有三種方式來創建。

  1. Python對象的轉換
  2. 通過類似工廠函數numpy內置函數生成:np.arange,np.linspace.....
  3. 從硬碟讀取,loadtxt

快速入門:Quickstart tutorial

Pandas:
基於NumPy 的一種工具,該工具是為了解決數據分析任務而創建的。Pandas 納入了大量庫和一些標準的數據模型,提供了高效地操作大型數據集所需的工具。最具有統計意味的工具包,某些方面優於R軟體。數據結構有一維的Series,二維的DataFrame(類似於Excel或者SQL中的表,如果深入學習,會發現Pandas和SQL相似的地方很多,例如merge函數),三維的Panel(Pan(el) + da(ta) + s,知道名字的由來了吧)。學習Pandas你要掌握的是:

  1. 匯總和計算描述統計,處理缺失數據 ,層次化索引
  2. 清理、轉換、合併、重塑、GroupBy技術
  3. 日期和時間數據類型及工具(日期處理方便地飛起)

快速入門:10 Minutes to pandas

Matplotlib:

Python中最著名的繪圖系統,很多其他的繪圖例如seaborn(針對pandas繪圖而來)也是由其封裝而成。創世人John Hunter於2012年離世。這個繪圖系統操作起來很複雜,和R的ggplot,lattice繪圖相比顯得望而卻步,這也是為什麼我個人不丟棄R的原因,雖然調用

plt.style.use("ggplot")

繪製的圖形可以大致按照ggplot的顏色顯示,但是還是感覺很雞肋。但是matplotlib的複雜給其帶來了很強的定製性。其具有面向對象的方式及Pyplot的經典高層封裝。

需要掌握的是:

  1. 散點圖,折線圖,條形圖,直方圖,餅狀圖,箱形圖的繪製。
  2. 繪圖的三大系統:pyplot,pylab(不推薦),面向對象
  3. 坐標軸的調整,添加文字注釋,區域填充,及特殊圖形patches的使用
  4. 金融的同學注意的是:可以直接調用Yahoo財經數據繪圖(真。。。)

Pyplot快速入門:Pyplot tutorial

Scipy:
方便、易於使用、專為科學和工程設計的Python工具包.它包括統計,優化,整合,線性代數模塊,傅里葉變換,信號和圖像處理,常微分方程求解器等等。

基本可以代替Matlab,但是使用的話和數據處理的關係不大,數學系,或者工程系相對用的多一些。(略)
近期發現有個statsmodel可以補充scipy.stats,時間序列支持完美

Scikit-learn:

關注機器學習的同學可以關注一下,很火的開源機器學習工具,這個方面很多例如去年年末Google開源的TensorFlow,或者Theano,caffe(賈揚清),Keras等等,這是另外方面的問題。

主頁:An introduction to machine learning with scikit-learn

圖書:

  1. Pandas的創始者:利用Python進行數據分析 (豆瓣)(力薦)
  2. 教材的集合:Scipy Lecture Notes(寫的非常棒!遺憾缺少Pandas)
  3. 提升自己:機器學習實戰 (豆瓣)


Update: 17/3/29:

網站下線,之後以離線版HTML格式提供下載,見GitHub-release。


Update: 16/2/20:
這些天在和@萬雋舒一起翻譯這份文檔,戳http://scipy-lectures.cn/ ,水平有限,不足之處還望指正。有興趣的朋友可以一起來,詳情見GitHub - jayleicn/scipy-lecture-notes-zh-CN: 中文版scipy-lecture-notes.

當然,還是推薦大家閱讀英文原版。

--------------------
以下原文
--------------------
推薦一個很用心的教程 Scipy Lecture Notes

One document to learn numerics, science, and data with Python

----------------------------------------------
這份教程由易到難分為三個層次

  1. Numpy, Matplotlib, Scipy的入門以及如何利用官方的doc查詢函數的用法;
  2. Numpy, Scipy的高級用法,常用的幾個數據處理方法,以及Python和C/C++的混合編程;
  3. 其它常用數據處理/機器學習庫Sympy, Scikit-image, Mayavi, Scikit-learn的入門及應用。

從內容上來說與題主要求完美契合,同時也涉及到了許多相關的庫和技巧。

----------------------------------------------
什麼? 嫌在線看教程不方便?

在網站主頁的右上角,提供了離線教程的下載鏈接。 不僅有和在線版完全一致HTML版的離線教程,也有兩個PDF版本可以選擇! 不得不說是業界良心。 另外所有教程的源碼都是可以在GitHub下載到的。

最後,答主也同樣是本科生,目前在漫漫的數據處理入門階段。即為同行者,望共勉之! 希望對題主有幫助。

----------------------------------------------

附上教程目錄

1. Getting started with Python for science1.1. Scientific computing with tools and workflow1.2. The Python language1.3. NumPy: creating and manipulating numerical data1.4. Matplotlib: plotting1.5. Scipy : high-level scientific computing1.6. Getting help and finding documentation

2. Advanced topics2.1. Advanced Python Constructs2.2. Advanced Numpy2.3. Debugging code2.4. Optimizing code2.5. Sparse Matrices in SciPy2.6. Image manipulation and processing using Numpy and Scipy2.7. Mathematical optimization: finding minima of functions2.8. Interfacing with C

3. Packages and applications3.1. Statistics in Python3.2. Sympy : Symbolic Mathematics in Python3.3. Scikit-image: image processing3.4. Traits: building interactive dialogs3.5. 3D plotting with Mayavi3.6. scikit-learn: machine learning in Python


1、Python做數據挖掘很強大,最近幾年很火的機器學習以及較為前沿的自然語言處理也會選用Python作為基礎工具。下面是我之前寫的一點Python數分挖掘的簡單案例,代碼均有,可以看下:你用 Python 做過什麼有趣的數據挖掘/分析項目? - 據數的回答 寫的簡單且亂,輕拍!

2、樓主提到Python作圖,提到了matplotlib庫。其實樓主可以試一下seaborn,簡單易上手而且結果美觀:

Seaborn

Matplotlib是Python主要的繪圖庫。但是,我不建議你直接使用它,原因與開始不推薦你使用NumPy是一樣的。雖然Matplotlib很強大,它本身就很複雜,你的圖經過大量的調整才能變精緻。因此,作為替代,我推薦你一開始使用Seaborn。Seaborn本質上使用Matplotlib作為核心庫(就像Pandas對NumPy一樣)。我將簡短地描述下seaborn的優點。具體來說,它可以:

  1. 默認情況下就能創建賞心悅目的圖表。(只有一點,默認不是jet colormap)
  2. 創建具有統計意義的圖
  3. 能理解pandas的DataFrame類型,所以它們一起可以很好地工作。

上述引用來源:Python和數據科學的起步指南

一兩行代碼就可以做出類似下面的圖:

詳細學習資料可查看:Seaborn: statistical data visualization

https://pypi.python.org/pypi/seaborn/

3、本科能否從事數據挖掘這個就難說了。如果樓主聰明好學,數學+統計基礎不錯,而且有一定編程能力,再加上上學期間找一些相關的數據挖掘實習練習一些項目,這樣很大概率是可以的!或者樓主雖是本科,但是有較好的學校專業背景,那也是可以的! 其它情況不敢保證!

以上!僅供參考!


題主的問題主要是兩個方向,一是如何系統學習Python中跟數據分析數據挖掘相關的庫,二是對本科生從事數據挖掘行業的疑問。

先來講講如何系統地學習Python中有關數據分析挖掘相關的庫

什麼是系統地學習?可能有人會覺得這是個偽命題,個人覺得,系統地學習就是一個先搭知識框架體系然後不斷填充知識,不斷更新迭代的過程。類似於蓋樓房,先做地基,再往上一層一層走。

既然要系統地學習Python中有關數據分析挖掘相關的庫,那麼pandas, numpy, scipy, matplotlib, 以及scikit-learn就是知識框架體系中的必備部分: pandas用來做數據處理,numpy用來做高維度矩陣運算,scipy用來做科學計算,matplotlib用來做數據可視化,scikit-learn用來做機器學習與數據挖掘

上面這幾個庫也就搭建了做數據分析挖掘的經典workflow:拿到數據之後先要做一個數據的預處理(pandas+numpy+scipy),接著會要對數據包含的特徵做一些可視化輸出(matplotlib),之後需要提取特徵建模調參(numpy+scikit-learn),有了模型與結果,最後歸納整理做presentation report.

在明確了知識框架體系和workflow之後,the next step is to get your hands dirty。找一找網上的開源數據集,選一個感興趣的,自己動手做數據分析挖掘項目。用一種project-driven的視角去熟悉使用Python關於數據方面的這幾個庫。在遇到問題的時候,網上搜一搜(知乎,谷歌,StackOverflow),或者直接看Python這幾個庫的documentation(pandas, numpyscipy, matplotlib, scikit-learn),或者翻一翻《利用Python做數據分析》。

除了學習Python的這幾個庫之外,做數據挖掘,對於數學統計方面還是有很高的要求,至少對於線性代數,概率論與數理統計,機器學習都要有一定程度的掌握。比如:在做數據挖掘項目的時候,scikit-learn庫裡面已經涵蓋了基本的演算法。對於特徵、模型與演算法的選擇,一方面是書本知識的累積,你要掌握解決哪一類問題用什麼類型的演算法,而在具體問題時如何調用演算法,則是要反覆實踐的。這就是不斷填充知識 不斷更新迭代,讓自己從小白變成老司機。

簡言之,學習數據挖掘,入門很容易,進門之後放棄,更容易。

所以,多動手實踐,多積累知識,重在平時,貴在堅持。

再來嘗試回答本科生能否從事數據挖掘?

冷靜思考現實:如果不是特別優秀的本科生,可能用人單位更傾向於去招一個學歷更高的人。因為做數據挖掘是理論與實踐相結合的過程,需要對演算法進行深入的研究,更高學歷的求職者,意味著他們在讀取學位的過程中會有更多的時間與精力去做這累積。比如你是一家公司的老闆,想要招聘一個數據挖掘崗位,可能你會更願意跟擁有研究生學歷的求職者先聊聊,普通的本科生可能會被打上"不靠譜"的標籤。

難道本科生就真的沒有機會了么

It depends. 學歷只是相對,個人的努力與能力才決定了上限。多在讀書的時候修一點相關課程,多積累一些個人項目,多參與一些數據挖掘比賽,這都是不斷完善自己數據挖掘素養的過程。而且現在這樣的平台也有很多,美國的kaggle算是數據科學社區的世界NO.1, 上面有很多用戶分享了自己的成果,你也可以組隊參加比賽。

當然,國內也有很棒的平台社區 --- Kesci, Kesci是目前國內唯一一個可以讓你在線運行計算的數據科學平台,並將自己的成果在社區做分享交流。What"s more,這裡也有眾多互聯網公司,電商平台,以及Fintech企業通過在Kesci舉辦數據演算法比賽的方式為自己招募人才。是不是又多了一個思路?哈哈。

學知識,做項目,打比賽,你的努力與堅持,會讓你在數據挖掘的道路上有所斬獲。


首先,下載一個 anaconda,這是一個 Python 發行版,你需要用到的關於科學計算、數據處理的東西基本上都有了。

然後,去圖書館借一本《用 Python 做科學計算》忽略掉環境配置的部分,把裡邊關於 numpy 和 matplotlib 的內容看了。其他的部分根據自己需要選擇閱讀。一般來說每一個科學計算的庫會自成一套體系,但是絕大多數都會基於 numpy,所以 numpy 必須學會。但是你也不用每個模塊都用過,知道常用的函數和 numpy 的設計模式就好。matplotlib 是絕大多數繪圖庫的基礎庫,所以也繞不過去。

再然後,打開你需要的庫的官網比如 pandas,一般都會有 getting started,先看完上個手。然後直接看 User Guide 或者 Tutorial。

之後根據自己的需求定向學習就好。每個第三方庫都有自己內在的設計邏輯,比如 sklearn 就是圍繞著 fit 和 predict 兩個函數來做的,默認行向量是樣本啦 pipline 啊之類的。pandas 核心就是 DataFrame 即就是帶有 index 的 numpy 數組等等。學習一個庫,重要的就是要學習這個庫的內在的設計邏輯,這些一般都在 document 或者 User Guide 裡邊提了。並不需要每個功能/函數都記住,大致知道他有某方面的功能就好了,當你有某個功能的需求的時候猜一下然後直接 Google 就好。

比如我想求一個線性方程組的解,知道了內在邏輯閉上眼睛猜一下也知道這個函數不在 scipy 中就在 numpy 中,於是 Google 一下:solve linear equation numpy,第一條就是:

再比如,我想要合併兩個 pandas 的表。閉上眼睛也知道 pandas 肯定有這個功能,資料庫裡邊學過類似的操作叫做 Join,所以就 Google 一下:

看第二條結果,直接就是三個解決方案,讀一讀對比一下就好。常用的函數查兩遍之後你也就背下了,這樣過一段時間的使用後基本上你就熟練了。對某個庫有興趣想要深入的話可以直接去看他的源代碼。就醬紫,這就是所謂的系統方法~


之前有回答過類似的問題(用 Python 進行數據分析,不懂 Python,求合適的 Python 書籍或資料推薦?),再上來答一記。

系統地學習Python的數據分析庫(Numpy、Scipy、Pandas等)是一個偽命題,真正有效的學習應該是基於數據分析實戰

脫離實戰的學習如紙上談兵,只有經歷過實戰的考驗,才能真正掌握所學的內容。之前答主在學習這些庫的時候,花費了大量的時間研讀練習各種教程,但是在實際項目的過程中,仍然捉襟見肘,需要花費大量的時間查文檔,去Google里搜答案。細想其中緣由,無非是因為表面上「系統」地學習了大量的函數和功能,但是如果不能學以致用,那就無法做到熟能生巧,融會貫通。

對於初學者來講,第一步是根據教程,對這些庫建立基本的認識。可以參考以下材料:

推薦材料:Python for Data Analysis

推薦理由:這本書很全面,講的很細,涵蓋了Numpy、Scipy幾個主要的數據分析庫。但是這本書的缺點和優點一樣明顯,主要在於成書時間太早(2012年最後修改),部分內容有些陳舊,同時由於講的很細,很多內容不太適合初學者。

閱讀建議:前五章認真看一下,複製書里的代碼,並能夠調試運行成功,後面的章節根據需要挑著看。

在建立基本認識之後,需要通過實戰來進行強化,可以參考以下材料:

  1. Harvard CS109 Data Science

之前已經有同學提到過這門課,但是仍然要再安利一下。推薦這門課主要有如下原因

  • 有視頻教程,不會太枯燥。
  • 涵蓋面廣,難度適中,適合入門。
  • 課程包括了概率論、數理統計及機器學習等內容,這些都是實際工作中常用的分析工具。
  • 理論與實踐相結合,並以Python為主要編程語言。
  • 涉及到一點文本分析以及MapReduce、Spark等內容

2. Kaggle競賽

如果想更進一步的了解如何用Python進行數據分析,那麼,Kaggle一定是最好的選擇。這裡彙集了來自全世界各地的數據分析高手,社區非常的活躍,同時也有很多有趣的比賽及項目。從適合初學者入門的數字識別器、泰坦尼克號生存率預測,到獎金幾萬甚至幾十萬美元的競賽,再到由各大公司,如Facebook, Walmart等,舉辦的以招聘為導向的競賽,你總能找到一款適合你的

題主提到的其他問題,我的回答是:

Python做數據挖掘是否足夠強大?

Python做數據挖掘強大,很強大,非常強大。大部分高科技公司的數據部門以Python和R為主,越來越多傳統行業的數據部門也在進行Python數據分析的嘗試。

學習數據挖掘需要學習哪些知識呢?

可以參考熱帖:如何成為一名數據科學家? 數據挖掘是數據科學家應該具備的技能之一,大牛們已經給出了如何成為一名數據科學家的方法,照著做就可以了。

我是一個本科生,本科學習的話能從事數據挖掘相關工作嗎?

能,但是比較難,需要有很出彩的地方。


更新:Enthought已不再提供免費的Traning on Demand教育版訂閱和續期。Sigh.

——————————————————————————————————————————

又看到這個問題,答一記。

你只要有edu郵箱就可免費獲取Enthought - Scientific Computing Solutions的教育版。他們家還有免費的培訓課程Python Training on Demand,包括:

  • Python Development Tools such as IPython
  • Python Essentials for Scientists, Engineers, and Analysts
  • NumPy: the core numeric and analytic Python library
  • SciPy: the core scientific Python library
  • Advanced Python Tools
  • Interfacing with Lower Level Languages such as C and C++
  • Object-Oriented Programming
  • See the full course catalog


Python for Data Analysis (豆瓣)

先學這本書

然後去官網下載對應的refer,跟著做就好

系統的學習沒啥意思,這些函數太多了,你工作中用不到的話即使學了也很快忘記

可以大致的過一遍,然後再項目中不斷的翻refer


整理下這塊的材料。

———————————————— matplotlib——————————————————————

matplotlib是python最著名的繪圖庫,它提供了一整套和matlab相似的命令API,十分適合互動式地進行製圖。而且也可以方便地將它作為繪圖控制項,嵌入GUI應用程序中。它的文檔相當完備,並且Gallery頁面中有上百幅縮略圖,打開之後都有源程序。因此如果你需要繪製某種類型的圖,只需要在這個頁面中瀏覽/複製/粘貼一下,基本上都能搞定。

Matplotlib中的pyplot子庫提供了和matlab類似的繪圖API.

import matplotlib.pyplot as plt #導入pyplot子庫

plt.figure(figsize=(8, 4)) #創建一個繪圖對象, 並設置對象的寬度和高度, 如果不創建直接調用plot, Matplotlib會直接創建一個繪圖對象

plt.plot([1, 2, 3, 4]) #此處設置y的坐標為[1, 2, 3, 4], 則x的坐標默認為[0, 1, 2, 3]在繪圖對象中進行繪圖, 可以設置label, color和linewidth關鍵字參數

plt.ylabel("some numbers") #給y軸添加標籤, 給x軸加標籤用xlable

plt.title("hello"); #給2D圖加標題

plt.show() #顯示2D圖

折線圖

import numpy as np

import matplotlib.pyplot as plt

x = [0, 1, 2, 4, 5, 6]

y = [1, 2, 3, 2, 4, 1]

plt.plot(x, y, "-*r") # 虛線, 星點, 紅色

plt.xlabel("x-axis")

plt.ylabel("y-axis")

plt.show()

多線圖

import numpy as np

import matplotlib.pyplot as plt

x = [0, 1, 2, 4, 5, 6]

y = [1, 2, 3, 2, 4, 1]

z = [1, 2, 3, 4, 5, 6]

plt.plot(x, y, "--*r", x, z, "-.+g")

plt.xlabel("x-axis")

plt.ylabel("y-axis")

plt.title("hello world")

plt.show()

柱狀圖

import numpy as np

import matplotlib.pyplot as plt

x = [0, 1, 2, 4, 5, 6]

y = [1, 2, 3, 2, 4, 1]

z = [1, 2, 3, 4, 5, 6]

plt.bar(x, y)

plt.xlabel("x-axis")

plt.ylabel("y-axis")

plt.show()

子圖

import numpy as np

import matplotlib.pyplot as plt

x = [0, 1, 2, 4, 5, 6]

y = [1, 2, 3, 2, 4, 1]

z = [1, 2, 3, 4, 5, 6]

plt.figure(1)

plt.subplot(211)

plt.plot(x, y, "-+b")

plt.subplot(212)

plt.plot(x, z, "-.*r")

plt.show()

文本添加

import numpy as np

import matplotlib.pyplot as plt

x = [0, 1, 2, 4, 5, 6]

y = [1, 2, 3, 2, 4, 1]

plt.plot(x, y, "-.*r")

plt.text(1, 2, "I"m a text") //前兩個參數表示文本坐標, 第三個參數為要添加的文本

plt.show()

圖例簡介

import numpy as np

import matplotlib.pyplot as plt

line1, = plt.plot([1, 2, 3])

line2, = plt.plot([3, 2, 1], "--b")

plt.legend((line1, line2), ("line1", "line2"))

plt.show()

———————————————— numpy——————————————————————

NumPy提供了大量的數值編程工具,可以方便地處理向量、矩陣等運算,極大地便利了人們在科學計算方面的工作。另一方面,Python是免費,相比於花費高額的費用使用Matlab,NumPy的出現使Python得到了更多人的青睞。

初窺NumPy對象:數組

NumPy中的基本對象是同類型的多維數組(homogeneous multidimensional array),這和C++中的數組是一致的,例如字元型和數值型就不可共存於同一個數組中。先上例子:

import numpy as np

a=np.arange(20)

print a

可以通過"type"函數查看a的類型,這裡顯示a是一個array:

type(a)

&

通過函數"reshape",我們可以重新構造一下這個數組,例如,我們可以構造一個4*5的二維數組,其中"reshape"的參數表示各維度的大小,且按各維順序排列(兩維時就是按行排列,這和R中按列是不同的):

a = a.reshape(4, 5)

print a

[[ 0 1 2 3 4]

[ 5 6 7 8 9]

[10 11 12 13 14]

[15 16 17 18 19]]

既然a是array,我們還可以調用array的函數進一步查看a的相關屬性:"ndim"查看維度;"shape"查看各維度的大小;"size"查看全部的元素個數,等於各維度大小的乘積;"dtype"可查看元素類型;"dsize"查看元素佔位(bytes)大小。

[0, 1)區間的隨機數數組:

數組操作

簡單的四則運算已經重載過了,全部的"+","-","*","/"運算都是基於全部的數組元素的,以加法為例:

a = np.array([[1.0, 2], [2, 4]])

print "a:"

print a

b = np.array([[3.2, 1.5], [2.5, 4]])

print "b:"

print b

print "a+b:"

print a+b

需要知道二維數組的最大最小值怎麼辦?想計算全部元素的和、按行求和、按列求和怎麼辦?for循環嗎?不,NumPy的ndarray類已經做好函數了:

a = np.arange(20).reshape(4,5)

print "a:"

print a

print "sum of all elements in a: " + str(a.sum())

print "maximum element in a: " + str(a.max())

print "minimum element in a: " + str(a.min())

print "maximum element in each row of a: " + str(a.max(axis=1))

print "minimum element in each column of a: " + str(a.min(axis=0))

數組和矩陣元素的訪問可通過下標進行,以下均以二維數組(或矩陣)為例:

a = np.array([[3.2, 1.5], [2.5, 4]])

print a[0][1]

print a[0, 1]

可使用where函數查找特定值在數組中的位置:

loc = numpy.where(a==11)

print loc

print a[loc[0][0], loc[1][0]]

數組操作

a = np.random.rand(2,4)

print "a:"

print a

a = np.transpose(a)

print "a is an array, by using transpose(a):"

print a

b = np.random.rand(2,4)

b = np.mat(b)

print "b:"

print b

print "b is a matrix, by using b.T:"

print b.T

numpy函數更多可以參考Numpy_Example_List

———————————————— scipy——————————————————————

numpy替我們搞定了向量和矩陣的相關操作,基本上算是一個高級的科學計算器。scipy基於numpy提供了更為豐富和高級的功能擴展,在統計、優化、插值、數值積分、時頻轉換等方面提供了大量的可用函數,基本覆蓋了基礎科學計算相關的問題。

導入模塊

import numpy as np

import scipy.stats as stats

import scipy.optimize as opt

生成隨機數

我們從生成隨機數開始,這樣方便後面的介紹。生成n個隨機數可用rv_continuous.rvs(size=n)或rv_discrete.rvs(size=n),其中rv_continuous表示連續型的隨機分布,如均勻分布(uniform)、正態分布(norm)、貝塔分布(beta)等;rv_discrete表示離散型的隨機分布,如伯努利分布(bernoulli)、幾何分布(geom)、泊松分布(poisson)等。我們生成10個[0, 1]區間上的隨機數和10個服從參數a=4,b=2的貝塔分布隨機數:

rv_unif = stats.uniform.rvs(size=10)

print rv_unif

rv_beta = stats.beta.rvs(size=10, a=4, b=2)

print rv_beta

更多操作參考優礦

———————————————— pandas——————————————————————

在處理實際的金融數據時,一個條數據通常包含了多種類型的數據,例如,股票的代碼是字元串,收盤價是浮點型,而成交量是整型等。在C++中可以實現為一個給定結構體作為單元的容器,如向量(vector,C++中的特定數據結構)。在Python中,pandas包含了高級的數據結構Series和DataFrame,使得在Python中處理數據變得非常方便、快速和簡單。

import numpy as np

from pandas import Series, DataFrame

具體案例和操作參考文獻:

pandas: powerful Python data analysis toolkit

優礦


ppt和論文的圖表都用pyplot做


Talk is cheap, show you the code.

官方文檔很詳細,不過比較厚重,今天給大家推薦一個輕量級點的文檔,讀起來給人感覺像一個老司機手把手教你,而且這個老司機是華盛頓大學的一位數據科學家,同時參與開發的項目包括sklearn, matplotlib, scipy。文末會分享這位作者在python大會教sklearn的鏈接,包括全部代碼的github鏈接。

言歸正傳,這份文檔鏈接在這裡Python數據科學手冊。不僅免費公開,並且提供網頁在線學習,感覺讀完一本書速度快了不少。適合快速進階,之後再去精讀官方文檔,效果更佳。

下面截取一些代碼演示給大家看。(我稍作修改用了自己的數據)

pandas

03.01-introducing-pandas-objects

# 一個Series是一列數據
series1 = pd.Series(data=[i for i in range(20) if i%2==0], index=range(100,110), dtype=int, name="偶數")
series2 = pd.Series(data=[i for i in range(20) if i%2==1], index=range(100,110), dtype=int, name="奇數")

# 多個Series橫向合併後是一個DataFrame
df = pd.concat([series1, series2], axis=1)

03.02-data-indexing-and-selection

# 截取條件數據用loc
df.loc[df["偶數"]&>=8, ["奇數"]]

# 截取指定行用iloc
df.iloc[0:5, ]

03.03-operations-in-pandas

# 對一列進行數據(正弦)變換,生成新的一列
df["正弦值"] = np.sin(np.pi*df["奇數"]/6)

03.04-missing-values

# 刪除某一列為NA的數據條目
df.loc[df["偶數"].notnull(), ]
# 填充NA數據
df.fillna(0)

03.06-concat-and-append

# 讀取多個excel文件,合併成一個DataFrame
# 這裡讀取英格蘭超級聯賽3個年份的賽事比分
data = []
for f in ["2014-2015.csv", "2015-2016.csv", "2016-2017.csv"]:
_df = pd.read_csv(f)
_df.dropna(inplace=True)
data.append(_df)
df = pd.concat(data)
df.reset_index(drop=True, inplace=True)

03.08-aggregation-and-grouping

# 按球隊分組,統計每一支隊進球總數
# 以及:單場進球之最
df.groupby("球隊名")[["進球數"]].agg(["sum", "max"])

03.07-merge-and-join

# 關係型資料庫
df3 = df1.merge(df2, on=["姓名"], how="left")

有時間再補充吧。

附錄:

  1. Jake Vanderplas GitHub
  2. Pycon2015 sklearn教程


Python for Data Analysis (豆瓣)

Data Science from Scratch (豆瓣)


去github上面搜下對應的notebook 然後做個kaggle的 比賽 就基本熟 了


大菜鳥恬不知恥地來回答一個。

大部分工作做的就是用pandas整理數據,提取特徵,所以就針對pandas寫一點自己知道的,工作中用的最多的一些方法吧。

1.右連接。場景是根據幾個主鍵把兩個特徵集拼起來。

merge(data1,data2,how="left",on=["userID","date"])

2.合併。場景是把兩個特徵都一樣的數據集合併起來,比如把3月份的數據集合併到4月份來,這樣樣本就會比單用4月份的多了。

concat((data1,data2))

它是按列名合併的,所以列的順序沒關係

3.刪除列。merge時,除主鍵(on里指定的列)以外,兩個數據集其他的同名列,會被重名名成,"sex_x","sex_y",所以如果兩列的內容相同,建議在合併之前刪掉其中一個數據集中的列。

#單單刪除一列
del data1["sex"]
#多列一起刪除
data1.drop(["sex","haha"],axis=1,inplace=True)
#記得加inplace=True,或者
data1 = data1.drop(["sex","haha"],axis=1)
#按列順序序號,刪除某些列
data1.drop(data.columns[[0,1]],axis=1,inplace=True)

4.重命名列。

data1.rename(columns={"sex_x":"sex_y"},inplace=True)

5. 分組。比如,一個用戶有很多條消費記錄,需要從中提取消費總額、消費筆數等特徵。

for userID,user_data in data.groupby("userID"):
#取會員卡卡號
card = user_data.loc[user_data.index[0],"card_no"]
#消費筆數
consumption_num = user_data.shape[0]
#消費總額
consumption_sum = user_data["amount"].sum()
#最後一筆消費後的卡上餘額,不知道與沒有更好的辦法?
card_left_amount = user_data[user_data["date"]==user_data["date"].max(),"card_amount"]

6.篩選。比如,某些不符合要求的客戶需要剔除

data = data[((data["consumption_num"]&>5)(data["consumption_sum"]&>50)(~data["userID"]).isin(black_list))]

或用的是 `|`,且用的是 ``,非用的是 `~`

7.修改符合條件行的某個值。比如,符合消費額度到1000的客戶,打標籤為優質客戶。

data["target"] = 0
data.loc[data["consumption_sum"]&>1000,"target"] = 1

8.某列轉日期。

data["date"] = pandas.to_datetime(data["date"])

9.對某列進行比較特殊的處理。在個人工作中,用的比較多和時間相關的,所以推薦個時間加減的方法。

#新建一列,為下個月
from dateutil.relativedelta import relativedelta
data["next_month"] = data["date"].map(lambda x:x+relativedelta(months=1))

10.保持數據到csv

#index=None不加,會將行號輸出到文件中
data.to_csv("data.csv",index=None)

———————————————————————————————————————————

就這麼多,以後工作中又用到一些再添加。


matplob是畫圖工具,numpy 是矩陣運算庫,scipy 是數學運算工具,pandas是數據處理的工具。題主想學python 將來做數據挖掘,那麼熟悉這些庫是必備的,但對於數據挖掘的工作不僅要熟練使用這些庫,數據挖掘的演算法也是要深入研究的。與此同時,分散式處理框架也需要深入研究,所以單單學習這幾個python 的庫是遠遠不足以讓你勝任數據挖掘的工作。


1. python做數據挖掘足夠強大,不用懷疑。

2. 如果你已經有些python的基礎,建議看一下python for data analyze,有中文版,pandas作者寫的,可以大致了解一些pandas及numpy的原理性東西。然後以具體的應用為牽引,不停的coding,不懂的查手冊。

3. 成熟的演算法首先找sklearn等庫的手冊,再不行就github,不要重複造輪子。

4. 數據挖掘如何學和語言已沒有什麼關係,關鍵是數學了,python是術層面的東西,數據挖掘基礎理論是道方面的東西,道方面的東西很難有什麼捷徑,認真推公式理解演算法吧。


首先要確認自己能用python寫代碼解決問題,也就是說學會了編程。

matplotlib, numpy, scipy, pandas 這些都是第三方庫的使用,看官方文檔和例子。

數據挖掘首先要學好數學,微積分,線性代數、概率、統計等。

學會了python編程和數學,數據挖掘不是問題。努力學習吧!

加油!


如果想看視頻學習numpy等多種庫的話,

這裡有個比較好的教程視頻: morvanzhou的自頻道

集中了基礎視頻和科學計算的視頻,他還在一次次不斷更新中


直接看文檔


可以去看我Github上的教程

ZeweiChu/numpy-tutorial

ZeweiChu/pandas-tutorial


推薦閱讀:

國內在線圖表工具,你能說出幾個?
國內哪家數據公司有實力?
請問如何收集到論文寫作需要的數據?
2016 年美国大选的民调准确率如何?如何提高民调的准确率?
入行大數據需要掌握哪些技能?

TAG:Python | 數據挖掘 | 數據分析 | Python庫 | 數據科學家 |