全文共2801字,預計學習時長12分鐘數據庫
Pandas爲Python營造了一個高水平的操做環境,還提供了便於操做的數據結構和分析工具編程
無需更多介紹,Pandas已是Python中數據分析的經常使用工具了。做爲一個數據科學家,Pandas是我平常使用的工具,我總會驚歎於它強大的功能。本篇文章將會講解5個我最近學到的,而且極大提高了工做效率的Pandas技巧。數組
對於pandas新手而言,Pandas爲Python編程語言營造了一個高水平的操做環境,還提供了便於操做的數據結構和分析工具。Pandas這個名字是由「面板數據」(panel data)衍生而來,這是一個計量經濟學中的術語,它是一個數據集,由同一個個體在多個時間段內所觀察的結果組成。微信
1. 數據範圍數據結構
從外部應用程序接口(API)或者數據庫中抓取數據的時候,一般須要肯定一個數據範圍。Pandas能夠很好地解決這一問題,它的data_range函數可以產出按日、月、年等方式遞增的日期。框架
假設如今須要一組按天數遞增的數據範圍。dom
date_from ="2019-01-01"編程語言
date_to = "2019-01-12"函數
date_range = pd.date_range(date_from, date_to, freq="D")工具
date_range
把產出的date_range轉化爲開始和結束日期,這一步能夠用後續函數(subsequentfunction)完成。
for i, (date_from, date_to) inenumerate(zip(date_range[:-1], date_range[1:]), 1):
date_from = date_from.date().isoformat()
date_to = date_to.date().isoformat()
print("%d. date_from: %s,date_to: %s" % (i, date_from, date_to))1. date_from: 2019-01-01,date_to: 2019-01-02
2. date_from: 2019-01-02, date_to: 2019-01-03
3. date_from: 2019-01-03, date_to: 2019-01-04
4. date_from: 2019-01-04, date_to: 2019-01-05
5. date_from: 2019-01-05, date_to: 2019-01-06
6. date_from: 2019-01-06, date_to: 2019-01-07
7. date_from: 2019-01-07, date_to: 2019-01-08
8. date_from: 2019-01-08, date_to: 2019-01-09
9. date_from: 2019-01-09, date_to: 2019-01-10
10. date_from: 2019-01-10, date_to: 2019-01-11
11. date_from: 2019-01-11, date_to: 2019-01-12
2. 使用指示符合並
合併兩個數據集就是將它們變成一個數據集的過程,這須要根據它們的公共屬性或欄來對齊其中的每一行。
合併函數中有許多arguments(對應於傳遞給函數的參數的類數組對象),其中指示符(indicator)argument可主要應用到合併過程當中,它在左、右或者兩邊的數據幀(DataFrame)函數添加_merge欄,這一欄就顯示了「數據行是哪裏來的」。用_merge欄來處理更大的數據集會很是有用,尤爲是須要檢查合併操做的正確率時。
left = pd.DataFrame({"key":["key1", "key2", "key3", "key4"],"value_l": [1, 2, 3, 4]})
right = pd.DataFrame({"key":["key3", "key2", "key1", "key6"],"value_r": [3, 2, 1, 6]})
df_merge = left.merge(right,on='key', how='left',indicator=True)
_merge欄能夠用來檢查是否獲得了咱們預期的行數,並且它反映的是來自兩個數據框架的預期值。
df_merge._merge.value_counts()both 3
left_only 1
right_only 0
Name: _merge, dtype: int64
3. 最近合併(Nearest merge)
在處理像股票或者加密貨幣一類的金融數據時,還須要把報價(價格變化)與實際交易結合。如今,假設目的是但願將每筆交易與以前幾毫秒產生的報價合併起來。Pandas有一個merge_asof函數,它可以經過最近的key(本文中指時間戳)來合併數據框架。有關報價和交易的數據集能夠從pandas實例中得到。
報價數據框架包含了不一樣股票的價格變化。一般狀況下,報價要比交易多得多。
quotes = pd.DataFrame(
[
["2016-05-2513:30:00.023", "GOOG", 720.50, 720.93],
["2016-05-2513:30:00.023", "MSFT", 51.95, 51.96],
["2016-05-2513:30:00.030", "MSFT", 51.97, 51.98],
["2016-05-2513:30:00.041", "MSFT", 51.99, 52.00],
["2016-05-2513:30:00.048", "GOOG", 720.50, 720.93],
["2016-05-2513:30:00.049", "AAPL", 97.99, 98.01],
["2016-05-2513:30:00.072", "GOOG", 720.50, 720.88],
["2016-05-2513:30:00.075", "MSFT", 52.01, 52.03],
],
columns=["timestamp","ticker", "bid", "ask"],
)
quotes['timestamp'] = pd.to_datetime(quotes['timestamp'])
交易數據框架包含了不一樣股票的交易信息。
trades = pd.DataFrame(
[
["2016-05-2513:30:00.023", "MSFT", 51.95, 75],
["2016-05-2513:30:00.038", "MSFT", 51.95, 155],
["2016-05-2513:30:00.048", "GOOG", 720.77, 100],
["2016-05-2513:30:00.048", "GOOG", 720.92, 100],
["2016-05-2513:30:00.048", "AAPL", 98.00, 100],
],
columns=["timestamp","ticker", "price", "quantity"],
)
trades['timestamp'] = pd.to_datetime(trades['timestamp'])
經過股價報告(tickers)能夠合併交易和報價信息,報告中報價可能只比交易遲了10毫秒。若是報價的時間差長於10毫秒,或者沒有報價,任何出價和詢問報價都是無效的(以蘋果股價報告*爲例)。
*蘋果股價報告:AAPL ticker。
pd.merge_asof(trades,quotes, on="timestamp", by='ticker', tolerance=pd.Timedelta('10ms'),direction='backward')
4. 建立Excel報告
Pandas和XlsxWriter庫同時使用可以幫助咱們建立基於數據框架的Excel 報告。這能節省不少時間,不用再花時間先把數據框架存爲csv格式,而後再導入Excel排版。還能夠直接加入各類圖表等多種便捷操做。
df = pd.DataFrame(pd.np.array([[1,2, 3], [4, 5, 6], [7, 8, 9]]), columns=["a", "b","c"])
如下的一小段代碼就建立了一個Excel報告。要想將一個數據框架存儲到Excel文件,須要反註釋writer.save()行。
report_name ='example_report.xlsx'
sheet_name = 'Sheet1'writer = pd.ExcelWriter(report_name,engine='xlsxwriter')
df.to_excel(writer, sheet_name=sheet_name, index=False)
# writer.save()
正如前文中提到的那樣,這個數據庫也支持添加圖表到Excel報告中。這須要肯定圖表的類型(本文中是線形圖表)以及圖表所反映的數據序列,注意,這些數據序列應位於Excel的電子表格程序裏(spreadsheet)。
# define the workbook
workbook= writer.book
worksheet = writer.sheets[sheet_name]# create a chart lineobject
chart = workbook.add_chart({'type': 'line'})# configurethe series of the chart from the spreadsheet
# using a list of values instead of category/value formulas:
# [sheetname, first_row, first_col,last_row, last_col]
chart.add_series({
'categories': [sheet_name, 1, 0, 3,0],
'values': [sheet_name, 1, 1, 3, 1],
})# configure the chart axes
chart.set_x_axis({'name': 'Index', 'position_axis': 'on_tick'})
chart.set_y_axis({'name': 'Value', 'major_gridlines': {'visible':False}})# place the chart on the worksheet
worksheet.insert_chart('E2', chart)# output the excel file
writer.save()
5. 節省磁盤空間
同時處理幾個數據科學項目,結束後一般會有不少從不一樣實驗中獲得的預處理數據集。這樣筆記本電腦的固態硬盤很快就會被這些數據塞滿。Pandas在保存數據集時發揮做用,壓縮數據,讀取這些數據時又是解壓形式。
不妨建立一個隨機數字的大Pandas數據框架。
df = pd.DataFrame(pd.np.random.randn(50000,300))
若是把這個文件存爲csv格式,它會佔掉硬盤驅動器上300MB的空間。
df.to_csv('random_data.csv',index=False)
經過一個compression=‘gzip’argument,就能夠將文件大小縮至136MB。
df.to_csv('random_data.gz',compression='gzip', index=False)
同時,在數據框架上讀取gzipped數據也很容易,因此功能上並不會有任何損失。
df = pd.read_csv('random_data.gz')
結語
這些pandas技巧極大的提升了工做效率。但願這篇文章能幫助到你,經過展現pandas新功能,提升你的工做效率。
你最喜歡哪個pandas技巧呢?
留言 點贊 關注
咱們一塊兒分享AI學習與發展的乾貨
歡迎關注全平臺AI垂類自媒體 「讀芯術」
(添加小編微信:dxsxbb,加入讀者圈,一塊兒討論最新鮮的人工智能科技哦~)