python數據分析之pandas實例解析
#coding:utf-8 import scrapy import xlwt, lxml import re, json import matplotlib.pyplot as plt import numpy as np import pylab from scipy import linalg from pandas import DataFrame,Series,MultiIndex import pandas as pd ''' 基本功能 函數應用和映射 numpy的ufuncs(元素級數組方法) DataFrame的apply方法 對象的applymap方法(因為Series有一個應用于元素級的map方法) ''' ''' #函數 df=DataFrame(np.random.randn(4,3),columns=list('bde'),index=['Utah', 'Ohio', 'Texas', 'Oregon']) print(df) print(np.abs(df))#求絕對值 #lambda【匿名函數】以及應用 f=lambda x:x.max()-x.min() # def f(x): # return Series([x.min(),x.max()],index=['min','max']) print(df.apply(f))#執行函數f[列(axis=0) 最大值-最小值] print(df.apply(f,axis=1))#按照軸1執行 #applymap 和 map _format=lambda x:'%.2f'%x print(df.applymap(_format))#格式化每一個元素 print(df.e.map(_format))#格式化指定索引或列(相當于Series)中的元素 #排序和排位 #根據索引排序,對于DataFrame可以指定軸 obj=Series(range(4),index=['d', 'a', 'b', 'c']) print(obj.sort_index()) df1=DataFrame(np.arange(8).reshape(2,4),index=['three','one'],columns=list('dabc')) print(df1.sort_index()) print(df1.sort_index(axis=1,ascending=False))#按列降序 #根據值排序 obj1=Series([4,7,-3,2]) print(obj.sort_values()) #DataFrame指定列排序 df2= DataFrame({'b':[4, 7, -3, 2], 'a':[0, 1, 0, 1]}) print(df2) print(df2.sort_values(by='b')) print(df2.sort_values(by=['a','b'])) #rank,求排名的平均位置(從1開始) obj2 = Series([7, -5, 7, 4, 2, 0, 4]) print(obj2.rank(method='first'))#去第一次出現,不求平均值。 print(obj2.rank())#默認method='average' print(obj2.rank(ascending=False,method='max'))#逆序,并取最大值。所以-5的rank是7 df3=DataFrame({'b':[4.3, 7, -3, 2], 'a':[0, 1, 0, 1], 'c':[-2, 5, 8, -2.5]}) print(df3.rank(axis=1))#按列排位 ''' #基本功能 重復索引 #對于重復索引,返回Series,對應單個值的索引則返回標量 ''' obj = Series(range(5), index = ['a', 'a', 'b', 'b', 'c']) print (obj.index.is_unique) # 判斷是非有重復索引 print ( obj.a[:1])#若有重復索引則通過將該索引切片取值 df = DataFrame(np.random.randn(4, 3), index = ['a', 'a', 'b', 'b']) print (df) # # print (df.ix['b'].ix[0]) print (df.ix['b'].ix[0]) print (df.ix['b'].ix[1]) ''' #匯總和計算描述統計 # 常用方法選項 ''' axis 指定軸,DataFrame行用0,列用1 skipna 排除缺失值,默認值為True level 如果軸是層次化索引(即MultiIndex),則根據level選取分組 count 非NA值的數量 describe 匯總 min,max argmin,argmax 計算能夠獲取到最小值和最大值的索引位置(整數) idxmin,idxmax 計算能夠獲取到最小值和最大值的索引值 sum,mean,median,mad 總和,均值,中位數,平均絕對離差 var,std,skew,kurt,cumsum,cummin,cummax,cumprod 樣本值的方差、標準差、偏度(三階矩)、偏度(四階矩)、累計和、累計最大值、累計最小值、累計積 diff 計算一階差分 pct_change 計算百分數變化 NA值被自動排查,除非通過skipna選項 ''' #DataFrame csv文件讀寫以及pandas_datareader 的使用 import pandas_datareader.data as web from pandas import Panel import datetime start=datetime.datetime(2017,7,25) end=datetime.date.today() # all_data={} # #DataReader(name,data_source,start,end) # # for ticker in ['AAPL', 'IBM', 'MSFT', 'GOOG']: # all_data['AAPL'] = web.DataReader('AAPL','iex',start,end) # pdata=Panel(all_data) # print(pdata) # price = DataFrame({tic: data['close'] for tic, data in all_data.items()})#將從all_data中將股票名為tic 的data['close']按日期索引取出并轉化成DataFrame結構 # volume = DataFrame({tic: data['volume'] for tic, data in all_data.items()})#****************** # # print('**********************') # # print(price) # price.to_csv('close.csv') # returns = price.pct_change() # print(returns.tail()) # print(returns.MSFT.corr(returns.IBM)) # print(returns.corr()) # print(returns.cov()) # print(returns.corrwith(returns.IBM)) # print(returns.corrwith(returns.volume)) # appl=web.DataReader('AAPL','iex',start,end) # print(appl) # # data=all_data['AAPL'] # df=DataFrame({'open':data.open,'high':data.high,'low':data.low,'close':data.close, #'volume':data.volume}) # print(df.index) # print(df) # df.to_csv('apple.csv') name=['date','open','high','low','close','volume'] raw=pd.read_csv('apple.csv') df2=raw.set_index(raw.date) df3=df2.reindex(['open','high','low','close','volume'],axis=1,) print(df3) # print(raw.open-raw.close) # print(raw) # new_index=raw.ix['date',:] # raw.set_axis(new_index,axis=1,inplace=True) # print(s1-s2) # print(df.index) ''' 如果報以下錯誤: #from pandas.core.common import is_list_like # ImportError: cannot import name 'is_list_like' 修改(點擊Run信息框中的文件地址鏈接亦可)...set_packages/pandas_datareader/fred.py文件中的from pandas.core.common import is_like_list 為from pandas.api.types import is_like_list【通常在文件第一行】 另外,data_source='yahoo' 會ImmediateDeprecationError, data_source='google' 因谷歌在中國不可用也會報錯 具體可看.../set_packages/pandas_datareader/data.py中的相關描述 ''' ''' #唯一值以及成員資格 #is_in計算一個表示“Series各值是否包含于傳入的值序列中”的布爾型數組 # unique 計算Series中的唯一值數組,按發現的順序返回 #value_counts 返回一個Serie,其索引為唯一值,其值為頻率,按計數值降序排列 #去重 obj = Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c']) print (obj.unique()) print (obj.value_counts()) #判斷元素存在 mask = obj.isin(['b', 'c']) print (mask) print (obj[mask]) #只打印元素b和c data = DataFrame({'Qu1':[1, 3, 4, 3, 4], 'Qu2':[2, 3, 1, 2, 3], 'Qu3':[1, 5, 2, 4, 4]}) print (data) print (data.apply(pd.value_counts).fillna(0)) print (data.apply(pd.value_counts, axis = 1).fillna(0)) ''' ''' 處理缺失數據 NA處理方法 dropna 根據各標簽的值中是否存在缺少數據對軸 fillba 樣本值的標準差 isnull 樣本值的偏度(三階矩) notnull NaN(Not a Number)表示浮點數和非浮點數組中的缺失數據 None也被當作NA處理 ''' ''' string_data = Series(['aardvark', 'artichoke', np.nan, 'avocado']) print(string_data.isnull()) string_data[0]=None print(string_data.isnull()) print(string_data.dropna()) #'DataFrame對丟棄NA的處理' from numpy import nan as NA data = DataFrame([[1., 6.5, 3.], [1., NA, NA], [NA, NA, NA], [NA, 6.5, 3.]]) print (data.dropna()) # 默認只要某行有NA就全部刪除 print (data.dropna(how = 'all')) # 某行全部為NA才刪除 data[4] = NA # 新增一列 print (data.dropna(axis = 1, how = 'all'))#某列全部為NA才刪除 data = DataFrame(np.random.randn(7, 3)) data.ix[:4, 1] = NA#第0-4行的 1 列為NA data.ix[:2, 2] = NA print (data) print (data.dropna(thresh = 2)) # 行大于等于2個非NA元素會被刪除 #how參數控制行為,axis參數選擇軸,thresh參數控制留下的數量 #填充缺失數據 # fillna # inplace參數控制返回新對象還是就地更改 df = DataFrame(np.random.randn(7, 3)) df.ix[:4, 1] = NA df.ix[:2, 2] = NA # print (df.fillna(0)) # df.fillna(0, inplace = True) #'不同行列填充不同的值' print(df.fillna({1:0.5,3:-1}))#指定某列填充某值,列不存在則該列不填充 #指定不同的填充方式method參數,limit參數 # 還可用統計數據填充 ''' ''' 層次化索引 使你能在一個軸上擁有多個(兩個以上)索引級別。抽象地說,它使你能以低緯度形式處理高維度數據 通過stack與unstack變換DataFrame ''' ''' #Series 的層次索引 data = Series(np.random.randn(10), index = [['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd', 'd'],[1, 2, 3, 1, 2, 3, 1, 2, 2, 3]]) print(data) print(data.index) print(data.b) print(data['b':'c']) print(data.unstack())#轉化成DataFrame結構 print(data.unstack().stack())#轉化成Series結構,將變成多級索引 #DataFrame的層次索引 df = DataFrame(np.arange(12).reshape((4, 3)), index = [['a', 'a', 'b', 'b'], [1, 2, 1, 2]], columns = [['Ohio', 'Ohio', 'Colorado'], ['Green', 'Red', 'Green']]) print(df) df.index.names=['key1','key2'] df.columns.names=['states','color'] print(df) print(df.ix['a',1])#取索引a對應第一行 print(df.ix['a','Ohio'])#取索引a對應Ohio列 print(df.ix['a',2]['Colorado'])#取索引a對應第二行Colorado列的元素 print(df.ix['a',2]['Ohio']['Red'])#取索引a對應第二行Ohio列索引對應Red列的元素 #直接用MultiIndex創建層次索引結構 print (MultiIndex.from_arrays([['Ohio', 'Ohio', 'Colorado'], ['Gree', 'Red', 'Green']], names = ['state', 'color'])) #重新分級順序 frame = DataFrame(np.arange(12).reshape((4, 3)), index = [['a', 'a', 'b', 'b'], [1, 2, 1, 2]], columns = [['Ohio', 'Ohio', 'Colorado'], ['Green', 'Red', 'Green']]) frame.index.names = ['key1', 'key2'] frame_swapped = frame.swaplevel('key1', 'key2') print (frame_swapped) print (frame_swapped.swaplevel(0, 1))#層級轉換此代碼意為將一級索引轉換為二級索引 #'根據索引排序' print (frame.sort_index(level='key2')) print (frame.swaplevel(0, 1).sort_index(level=0)) #根據級別匯總統計 print(frame.sum(level='key2')) #使用列生成層次索引 df6=DataFrame({'a':range(7), 'b':range(7,0,-1), 'c':['one','one','one','two','two','two','two'], 'd':[0,1,2,0,1,2,3], }) print(df6) print(df6.set_index(['c','d']))#將c,d作為行索引(二級索引) print(df6.set_index(['c','d'],drop=False))#列依然保留 df7=df6.set_index(['c','d']) print(df7.reset_index())#索引重置 #避免索引產生歧義使用整數索引(按序).iloc[row,col] ''' ''' #面板(Pannel)數據 通過三維ndarray創建pannel對象 通過ix[]選取需要的數據 訪問順序:item->major->minor 通過stack展現面板數據 '''