頻道欄目
首頁 > 程序開發 > Web開發 > Python > 正文
python數據分析之pandas實例解析
2018-07-27 14:40:33         來源:SunChao3555的博客  
收藏   我要投稿

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展現面板數據
 
  
'''

 

點擊復制鏈接 與好友分享!回本站首頁
上一篇:利用Python實現權限設置的詳細教程
下一篇:最后一頁
相關文章
圖文推薦
點擊排行

關于我們 | 聯系我們 | 廣告服務 | 投資合作 | 版權申明 | 在線幫助 | 網站地圖 | 作品發布 | Vip技術培訓 | 舉報中心

版權所有: 紅黑聯盟--致力于做實用的IT技術學習網站

加拿大28火车判定方法