碰到一些Python或者pandas的初學者,很多基礎(chǔ)的語法和使用方法都還沒有學會就開始打算用Tushare進行數(shù)據(jù)分析,毫無疑問會無從下手甚至開始懷疑人生直到放棄。 其實只要稍微花一點時間學習一下基礎(chǔ)知識,就會變得豁然開朗,再深入學習后就得心應手了。 以下是一個用戶發(fā)來的學習筆記(歡迎更多用戶投稿~_~),從入門到精通,只差比別人少玩了幾輪游戲。 寫在前面 網(wǎng)上介紹python之pandas庫非常多,這篇從sql語言的角度解讀,相信更適合有sql語言(MySql)基礎(chǔ)的你,像使用sql一樣搞定pandas。 依然要說安裝,本篇案例數(shù)據(jù)均取自tushare。 1、安裝pandas,如果你安裝的是anaconda,那么就不用單獨安裝了,因為anaconda已經(jīng)集成了pandas。 2、安裝tushare庫 Windows系統(tǒng)(win7及以上) a)打開Anaconda Prompt b)輸入命令:pip install tushare c)按“Enter”鍵 安裝tushare,如果你看過前篇《python數(shù)據(jù)處理之入門》,在“安裝python”之“安裝python庫”章節(jié)亦可見。 還是那句話,最重要的是業(yè)務,python是幫你實現(xiàn)的工具。 創(chuàng)建表 對于mysql而言,要查看或處理其數(shù)據(jù),首先數(shù)據(jù)肯定得是存儲在某個表中,這個表是個二維的結(jié)構(gòu)。 在mysql創(chuàng)建表的語句是create table …… 那么在pandas里,這種二維的數(shù)據(jù)結(jié)構(gòu)是怎么呈現(xiàn)的呢?他叫DataFrame,創(chuàng)建一個DataFrame就相當于創(chuàng)建了一張表。 比如,在tushare返回的日行情數(shù)據(jù)(get_k_data)結(jié)果就是DataFrame。 上代碼: 運行結(jié)果: 這個運行結(jié)果是不是超級熟悉? 說說索引 第1列,是不是類似你們經(jīng)??吹降淖栽鲩LID,那么在DataFrame,他叫index(索引),這個索引非常重要,在將來的數(shù)據(jù)分析計算使用非常頻繁。 所以,對于這個index,pandas也提供了一些函數(shù)滿足你對他的要求,比如set_index,reset_index,舉個set_index的例子,當我想使用date列作為索引的時候,請看下面截圖代碼: 運行結(jié)果: 字段 從上面截圖可以一目了然的看到字段,對字段的操作,mysql有ALTER命名,那么對于pandas是什么樣的呢,字段其實是個一維的結(jié)構(gòu),在pandas里面叫Series。 加個字段 我想加個字段,內(nèi)容為”Boss出品” 這樣這個新的字段就加上了,并且賦了值 請看執(zhí)行結(jié)果: 刪個字段 有字段我不想要,怎么辦,簡單哈,刪字段唄,pandas提供了drop函數(shù)可以用來刪字段,當日,也可以使用篩選filter,等等 比如,對于調(diào)出的數(shù)據(jù)結(jié)果,開高低價格用不上,那就去掉。 細心的你一定看到了axis這個參數(shù),沒錯drop可以刪除列,也可以對行進行刪除。 執(zhí)行結(jié)果: 我很懶,截個執(zhí)行結(jié)果的圖都不想干,咱們自己寫代碼,親自執(zhí)行看結(jié)果。 修改字段 Pandas不需要指定數(shù)據(jù)類型,那么就只剩下修改列名了。 你們想改哪個字段名,我想把date修改為trade_date。 執(zhí)行結(jié)果: 懶! 數(shù)據(jù)查詢 像寫SQL一樣,使用pandas 實現(xiàn)select sql查詢,select后面跟著的就是選字段, pandas,哇!!!他更牛,不但可以根據(jù)列名來選,還能根據(jù)位置來選。 1、根據(jù)列名來選 filter,loc,at,ix,drop(drop是反向的,參見”刪個字段”),以loc為例,at與loc相近。 另外,還有一種類似切片的方法,如下: df2 = df[['date', 'code', 'close']] 2、根據(jù)位置來選 iloc,iat,ix 以iloc為例,iat與iloc相近 說說ix 細心的你們肯定又注意到了,根據(jù)列表和位置來選,都有ix。 ix,既能當loc用,又能當iloc用,兼有根據(jù)列名和位置篩選篩選兩種功能 實現(xiàn)where 1、loc,iloc,at,iat,ix 使用位置過濾 還記得前面說過,pandas的index很常用嗎,沒錯,在數(shù)據(jù)過濾查詢里就會用到了。使用loc,iloc,at,iat,ix過濾,上述截圖,大家注意到?jīng)]有,無論是根據(jù)列名,還是根據(jù)位置選擇列,在前面都有個冒號“:” 沒錯,這個就是用來做行篩選的,相當于mysql中的where 執(zhí)行結(jié)果,在篩選的index范圍內(nèi),不過你們注意沒有,loc與iloc的過濾結(jié)果略微有些差異: 執(zhí)行結(jié)果: 很明顯,使用loc,包含了篩選使用的索引,而iloc沒有。 這個是使用數(shù)字序列,如果使用日期作為索引,大家的感受可能會更深一些, 比如: 先設(shè)置了日期列作為索引,再使用loc對數(shù)據(jù)進行行列篩選。 --執(zhí)行什么? --什么結(jié)果? --結(jié)什么果? 算了,咱們敲一遍代碼,自己執(zhí)行看結(jié)果吧。 查詢篩選 pandas對行的篩選必須要使用index(索引)嗎?非也,非也,mysql里有的,pandas肯定能滿足你,請繼續(xù)往下看: mysql里篩選使用的and,or,in,not in之pandas實現(xiàn)。 為了舉例更方便,讓大家更直觀,我在tushare.get_k_data調(diào)了浦發(fā)銀行、萬科兩只股票的行情。 代碼運行后,就有了浦發(fā)銀行、萬科的日行情。 1、and之實現(xiàn) 篩選出浦發(fā)銀行2018年1月11日的行情 使用符號“&” 2、or之實現(xiàn) 篩選收盤價大于35元,或浦發(fā)銀行2018年1月11日的行情 使用符號“|” 3、 in之實現(xiàn) 篩選浦發(fā)銀行、萬科,2018年1月11日和12日兩天的日行情 4、not in 之實現(xiàn) 篩選浦發(fā)銀行、萬科,不要2018年1月11日和12日這兩天的日行情 另外,還可以使用query函數(shù)來構(gòu)造篩選,如,篩選出浦發(fā)銀行日行情: order排序 對應mysql之order by pandas有使用索引排序或使用列排序兩種選擇,分別是:sort_index, sort_values,使用參數(shù)ascending(True、False)來滿足對升序或降序的要求,比如 1、使用索引,按降序排列 2、按收盤價,升序排列 參數(shù)ascending默認等于True升序排列,所以不用寫了。 取n行 對應mysql之limit pandas不但能取前n行,還提供函數(shù)可以取后n行,分別是head()、tail() 如,取前4行、后4行 MySql通常有先排序,再limit,pandas同樣可以一行代碼實現(xiàn) 去重 對應MySql之distinct 在數(shù)據(jù)查詢中,通常會使用去重,對應的pandas函數(shù)是drop_duplicates,并且更前大的是drop_duplicates提供了參數(shù)keep,供你選擇保留第1條,亦或是將重復數(shù)據(jù)全刪除。 空值 對應MySql之Null pandas有空日期pd.NaT,空值None,空值亦或稱之為缺失值 1、缺失值篩選 MySql的篩選通常有where date is null,或is not null pandas對應的篩選辦法是 df = df[df['close'].isnull()] df = df[df['close'].notnull()] 代碼: 另外,pandas還提供了dropna,用來做缺失值的行列選擇,這里不再贅述,大家可以使用參考鏈接去看下dropna的使用方法, 參考鏈接: http://pandas./pandas-docs/stable/generated/pandas.DataFrame.dropna.html 再重點說下缺失值的填充 2、 fillna 對缺失值的填充,是咱們經(jīng)常遇到的,比如填充個假值,用前一天數(shù)據(jù)填充,亦或用下一交易日數(shù)據(jù)填充 1) 填充為指定的值,即常說的賦值 同時指定多個列賦值: df.fillna({'close': 1, 'NullValue': 9}, inplace=True) 2) 使用前一天值/后一天值填充 使用fillna提供的的method參數(shù)即可 是不是昏昏了,我有點昏昏了,再介紹兩個提提神。 下面介紹兩個相對于MySql查詢的兩個重量級應用,關(guān)聯(lián)查詢和分組查詢 關(guān)聯(lián)查詢(join) pandas指join和merge 這兩個的使用方法相近,都能通過索引關(guān)聯(lián)和字段關(guān)聯(lián) 1、先說join join被用在通過索引關(guān)聯(lián)較多 DataFrame.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False) e.g. how : {‘left’, ‘right’, ‘outer’, ‘inner’}, default: ‘left’ left:左連接 right:右連接 outer:外連接 inner:內(nèi)連接 上述關(guān)聯(lián)關(guān)系,相信不用詳細介紹,大家都知道了,跟Mysql的關(guān)聯(lián)方法極其相近 lsuffix和rsuffix 這兩個參數(shù),用來標記當關(guān)聯(lián)DataFrame出現(xiàn)相同字段名稱的時候區(qū)分方法 2、merge merge這個單詞,印象最深刻的是聽青桃說merge,在耳畔縈繞。 下面就介紹下pandas里的merge merge被用在通過字段關(guān)聯(lián)較多 DataFrame.merge(right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None) merge里, how:同上join (on),(left_on,right_on),(left_index,right_index)這3組參數(shù)是單選項,3選1就可以了; on:用在當關(guān)聯(lián)的兩個DataFrame的字段名相同時; left_on,right_on:當關(guān)聯(lián)的兩個DataFrame的字段名不相同時; left_index,right_index:使用索引關(guān)聯(lián) e.g. 3、concat, append 大家在看代碼的時候,一定看到了append,沒錯,就是在調(diào)用浦發(fā)銀行、萬科兩只股票的時候用到了, append,將兩個DataFrame按行合并 那么concat呢,同樣的,只是concat功能更多,還提供了axis參數(shù)供選擇按行還是按列合并,相當于MySql里的union查詢 分組查詢 MySql之group by 分組求pandas提供的函數(shù)值,及自定義的函數(shù)值(如beta) 常見的MySql之group by有求和,求最大值,最小值,平均值等 pandas能支持的那就多了,求波動率,求協(xié)方差等等等,還可以自定義函數(shù)然后調(diào)用,說著說著不由得心中一陣興奮。 e.g. 對成交量求和,對收盤價求最小值和最大值,對最高價求平均值,對最低價求標準差 寫到這里,基本上將常用的pandas方法介紹好了。 輸入輸出 那么,大家可能還有個困惑,案例數(shù)據(jù)都是從tushare調(diào)用的,在日常使用時,還有不使用tushare的情況,那么這個時候,該如何讀取(輸出),和存儲(輸入)數(shù)據(jù)呢? 這就是這一節(jié)要說的內(nèi)容 先說批量讀取數(shù)據(jù) read_* pandas提供了很多種讀取數(shù)據(jù)的方法: read_sql,read_csv,read_excel,read_json 重點介紹下read_sql pandas.read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None) 介紹一下前面最常用的兩個參數(shù),后面的參數(shù)以后大家在使用的時候慢慢體會 sql:就是你最常用的sql查詢語句 conn:連接mysql的接口 還是上栗子,更直觀的看明白怎么使用 被抹掉的地方,大家填下你們自己的主機名(或IP),端口,數(shù)據(jù)庫名,用戶名,密碼。 sql換成你想要查詢的數(shù)據(jù),最后打印下df(print df)就能很清晰的,你的sql將要查詢的數(shù)據(jù),被加載到內(nèi)存中了,接下來,你就可以對這個數(shù)據(jù)進行處理了。 是不是很簡單! 還有其他的read,方法很類似。 to_* 說完讀取,該說下,怎么存儲數(shù)據(jù)了,目標格式有很多: to_sql, to_csv,to_excel,to_json 介紹下to_excel, 數(shù)據(jù)量不大的時候,借助excel工具分析,是很方便的。比如,你可能使用python爬蟲,爬了一些數(shù)據(jù),數(shù)據(jù)量也不大,那么你就可以將爬下來的數(shù)據(jù)轉(zhuǎn)換為DataFrame,再保存到excel中。 那么怎么使用to_excel將數(shù)據(jù)保存到excel里呢,同樣很簡單。 e.g. 還是從tushare上拿數(shù)據(jù),保存到D盤叫做600000的excel文件 代碼: 代碼說明: 定義變量File,定義將數(shù)據(jù)保存的目標文件,使用pandas函數(shù)ExcelWriter, 使用to_excel,并執(zhí)行保存在哪個sheet上,執(zhí)行保存 結(jié)果: 去D盤看看,是不是有個文件叫600000.xlsx的 進階 所謂進階,實戰(zhàn)一把,計算個簡單常用的。 不知大家剛剛注意到?jīng)]有,調(diào)用的get_k_data沒有昨收盤,收盤價日收益率,那么就來計算一下。 1、通過tushare接口把數(shù)據(jù)調(diào)出來 2、求昨收盤, code列分組,按日期升序排序 計算昨收盤 3、計算日收益率 到這里,計算需求就完成了。有沒有激起學習的興趣! 后記 拖了很久,終于把Hello pandas寫好了,這里介紹的都是基本的,最重要的還是在工作中親身使用。 學習代碼,最重要的還是有業(yè)務場景,親自來寫,進展就會很快,就像以前大家學習SQL一樣,SQL同樣是數(shù)據(jù)分析最重要的工具之一,如果能再熟練的使用python,那么又將是一個飛躍。 感謝Boo供稿,希望對初學者有一定幫助,也期待更多熱愛學習的朋友參與進來,學數(shù)據(jù)、用數(shù)據(jù)!
|