玩轉Pandas,讓數據處理更easy系列7
01
系列回顧
玩轉Pandas系列已經連續推送6篇,盡量貼近Pandas的本質原理,結合工作實踐,按照使用Pandas的邏輯步驟,系統地並結合實例推送Pandas的主要常用功能,已經推送的6篇文章:
玩轉Pandas,讓數據處理更easy系列1
玩轉Pandas,讓數據處理更easy系列2
玩轉Pandas,讓數據處理更easy系列3
玩轉Pandas,讓數據處理更easy系列4
玩轉Pandas,讓數據處理更easy系列5
玩轉Pandas,讓數據處理更easy系列6
至此,如果您閱讀了以上6篇文章,應該對使用Pandas有一個比較好的認識和體會了。
其中DataFrame表達的是二維結構,DataFrame實例調用介面返回的結構常用Series來表達,這是一種一維描述。再進一步,這兩種結構都用Index做標籤索引,大家應該意識到任何類型都可以用來做索引,比如list, tuple, str, dict... ,並且每個單元格的取值也可以是任意的。
使用Pandas庫,時刻腦海中要記住這兩個數據結構,二維,一維,切換,介面操作返回的類型等。
Pandas主要能做10件事,下面再看下這些事,哪些還未涉及。
02
Pandas能做什麼
Pandas主要能做10件事,現在已經推送了其中大部分,儘管有些點沒有深入展開:
- 能將Python, Numpy的數據結構靈活地轉換為Pandas的DataFrame結構(玩轉Pandas,讓數據處理更easy系列1; 玩轉Pandas,讓數據處理更easy系列2)
- DataFrame可以方便地實現增加和刪除行、列 ( 玩轉Pandas,讓數據處理更easy系列2)
- 智能地帶標籤的切片,好玩的索引提取大數據集的子集(玩轉Pandas,讓數據處理更easy系列2 )
- 自動數據對齊,完全可以不考慮行、列標籤,直接append list.
- 靈活地對數據集Reshape和按照不同軸變化數據的Pivot操作。玩轉Pandas,讓數據處理更easy系列4
- 強大的I/O操作。提供介面: CSV and delimited, Excel files, databases, and saving / loading data from the ultrafast HDF5 format.(玩轉Pandas,讓數據處理更easy系列2)
- 通俗易懂地在DataFrame結構上實現merge和join操作(merge操作見:玩轉Pandas,讓數據處理更easy系列3, concat: 玩轉Pandas,讓數據處理更easy系列5)
- 善於處理missing data,如NaN, non-floating數據(玩轉Pandas,讓數據處理更easy系列5)
- 強大而靈活的分組功能,在數據集上實現分-應用-合的操作,達到整合和改變數據形狀的目的 (玩轉Pandas,讓數據處理更easy系列6)
- 時間序列的處理功能,生成 data range,移動的時間窗,時間移動和lagging等。
對於時間序列的處理也是Pandas的重要方面,Pandas提供了什麼數據結構支撐,常用的操作介面都有哪些呢?
03
日期時間模塊簡介
Pandas已經成功運用在了對時間序列數據的處理上,尤其是在金融數據分析領域。大家都知道,Pandas是建立在Numpy之上的,所以時間序列處理上也基於Numpy的datetime64和timedelta64類型,它又創建了一些列好用的功能來處理時間序列。
Pandas提供了一個相對緊湊的介面處理以下日期時間處理,對時間處理的特長在於:
- 創建基於一定頻率的日期和時間序列;
- 轉化時間序列為特定的頻次;
- 計算相對日期的能力強大,比如計算某年的最後一個工作日前的5個工作日序列;
04
時間索引:DateTimeIndex
創建日期序列用date_range介面,傳入日期的開始日期,周期,頻次按天還是小時等,個數一共為72個,截取前5個顯示如下,返回值的類型為DateTimeIndex,因此也是一個Index實例,自然可以當做 index.
rng = pd.date_range(1/1/2011, periods=72, freq=H)
用創建的rng當做index創建Series實例:
ts = pd.Series(np.random.randn(len(rng)), index=rng)
ts.head(5)
另Pandas還提供了修改時間周期的介面 asfreq, 直接拿Series實例調用asfreq,如下所示:
ts.asfreq(45Min, method=pad)
還可以按天統計數據值得平均值,得到1-1到1-3日的平均值:
ts.resample(D).mean()
上面說到,date_range可以創建DateTimeIndex類實例,通過以下方式也可以創建出DateTimeIndex實例,
to_datetime,
pd.to_datetime( [2018-3-28,2018-3-29] )
DatetimeIndex構造函數也可以構建。
bdate_range() 也可以創建DateTimeIndex,它生成的是只有工作日的時間索引。
另,pd.date_range(1/1/2011, periods=72, freq=H) 中的freq可以有多種配置,
如 freq 配置為 W,表示只生成周末的日期索引,其他用到再查詢文檔就行。
05
時間戳和Period
時間戳是一個具體的時間點,2018-1-1 12:00:00, 它與接下來說的Period不同,Period是一個日期範圍,比如 2018-01-01,2018-01.
pd.Timestamp(2018-5-1)
生成的實例為:Timestamp(2018-05-01 00:00:00),可以看到是帶有日期和時間的結合。
而Period實例是這樣的,是一個月份,如下,大家注意區分兩者不同。
pd.Period(2018-05)
Period(2018-05, M)
pd.Period(2018-05, freq=D)
Period(2018-05-01, D)
如何將一個Series實例轉化為一個時間戳呢?如下所示的實例,調用to_datetime轉化為時間戳。
ts1 = pd.Series([Jul 31, 2009, 2010-01-10, None])
pd.to_datetime(ts1)
另,還可以按照一定的時間格式轉化,將如下的時間格式,轉化為默認的時間格式,
pd.to_datetime(12-11-2010 00:00, format=%d-%m-%Y %H:%M)
輸出結果:Timestamp(2010-11-12 00:00:00)
另,還提供Epoch轉化為時間格式等功能, 詳見官方文檔。
06
PeriodIndex
Period也對應自己的索引,構建一個Series實例,其中ts2.index就是一個PeriodsIndex實例。
periods = [pd.Period(2012-01), pd.Period(2012-02), pd.Period(2012-03)]
ts2 = pd.Series(np.random.randn(3), periods)ts2.index
07
時間偏移相關對象
原python庫中已經有了時間偏移相關的處理類,主要用到以下幾個:
import datetime
from dateutil.relativedelta import relativedelta
Pandas在原python模塊基礎上也做了一些封裝改進成了 DateOffset。
原python的寫法:
d = datetime.datetime(2008, 8, 18, 9, 0)
d + relativedelta(months=4, days=5)
調用Pandas中的DateOffset後,
from pandas.tseries.offsets import *
d + DateOffset(months=4, days=5)
DateOffset主要方便之處在於可以直接做加減,比如,今天往回退5個工作日的時間戳:
d = pd.Timestamp(2018-03-28 09:00:00)
d- 5 * BDay()
返回結果:
Timestamp(2018-03-21 09:00:00)
其他更多功能,詳細過程在參考官方文檔:
http://pandas.pydata.org/pandas-docs/stable/timeseries.html
如想下載以上代碼,請後台回復: pandas
小編對所推文章分類整理,歡迎後台回複數字,查找感興趣的文章: 1. 排序演算法
2. 圖演算法(含樹)
3. 動態規劃
4. LeetCode
5. Python
6. 數據處理三劍客 7. 數學知識
8. 數據預處理
9. 機器學習演算法實例大全 10. 深度學習
11. Tensorflow
12. 自然語言處理 13. 上海沙龍
更多文章:
深度學習|大師之作,必是精品
演算法channel關鍵詞和文章索引
邏輯回歸| 原理解析及代碼實現
邏輯回歸| 演算法兌現為python代碼
決策樹
對決策樹剪枝
sklearn分類和回歸
提煉出分類器演算法
貝葉斯分類
樸素貝葉斯分類器:例子解釋
樸素貝葉斯分類:拉普拉斯修正
單詞拼寫糾正器python實現
半樸素貝葉斯分類器
支持向量機參數求解
支持向量機之軟間隔和核函數
如果文章對您有幫助,歡迎點贊、轉發。你的支持=彼此的進步
演算法channel ∣原創乾貨分享
http://weixin.qq.com/r/cjhGXpjE88WMrdw9921g (二維碼自動識別)
微信群: gz113097485 QQ交流群:646901659
推薦閱讀:
※手把手教你使用ggplot2繪製折線圖
※坐擁百億級數據的劉濤 如何窺探數據背後的深意
※數據缺失值的4種處理方法
※閑話國內大數據發展簡史&產業化落地
※《Python數據挖掘》筆記(四) 網路分析