數據分析:是把隱藏在一些看似雜亂無章的數據背後的信息提煉出來,總結出所研究對象的內在規律python
Numpy,Pandas,Matplotlib算法
NumPy(Numerical Python) 是 Python 語言的一個擴展程序庫,支持大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。數組
使用np.array()建立數據結構
import numpy as np # 一維 arr = np.array([1,2,3,4,5]) print(arr,type(arr)) # [1 2 3 4 5] <class 'numpy.ndarray'> ---來自pycharm # 二維 --來自jupyter notebook arr = np.array([[1,2,3],[4,5,6]]) arr # array([[1, 2, 3], # [4, 5, 6]])
注意 :app
arr = np.array([1,'two',3]) arr # array(['1', 'two', '3'], dtype='<U11')
arr = np.array([['1','two','3'],[1,2,3]]) arr # array([['1', 'two', '3'], # ['1', '2', '3']], dtype='<U3')
numpy默認ndarray的全部元素的類型是統一的 若傳進來的列表包含不一樣的類型的元素,則會贊成爲一個類型,優先級 : str > float > int
利用matplotlib讀取圖片數據到數組中 :dom
import matplotlib.pyplot as plt img_arr = plt.imread('./落日.jpg') # 讀取圖片,返回的是numpy數組 img_arr # array([[[224, 88, 14], # 三維數組 [224, 88, 14], [224, 88, 14], ... ... ... ... [ 6, 2, 3]]], dtype=uint8) plt.imshow(img_arr) # 將讀取的三維數組的數據以圖片的形式展現出來 plt.imshow(img_arr-100) # 圖片變了
import matplotlib.pyplot as plt img_arr = plt.imread('./落日.jpg') img_arr.ndim # 3 獲取數組的維度 img_arr.shape # (332, 500, 3) 獲取數組的外形 img_arr.size # 498000 獲取數組的大小 img_arr.dtype # dtype('uint8') 獲取數組的數據類型
1. np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) 等差數列數組svg
np.linspace(1,100,num=20) # 產生1-100之間數量20個的等差數組 # 結果: array([ 0. , 5.26315789, 10.52631579, 15.78947368, 21.05263158, 26.31578947, 31.57894737, 36.84210526, 42.10526316, 47.36842105, 52.63157895, 57.89473684, 63.15789474, 68.42105263, 73.68421053, 78.94736842, 84.21052632, 89.47368421, 94.73684211, 100. ])
2. np.arange([start, ]stop, [step, ]dtype=None) 等差步長數組函數
np.arange(0,100,step=2) # 產生0-100,步長爲2的等差數組
3. random.randint(low,high=None,size=None,dtype="1")工具
np.random.randint(0,100) # 生成0-100 之間的一個隨機數 np.random.randint(0,100,size=(4,5)) # 生成 0-100 之間的隨機數組,size爲數組大小
4. 時間種子/隨機因子測試
時間種子(隨機因子):無時無刻都在變化的值(系統時間)
固定隨機因子就能夠固定隨機函數的隨機性
np.random.seed(90) # 時間因子90是任意數值 np.random.randint(0,100,size=(3,5))
5. np.random.random(size=None)
np.random.seed(3) # 生成0到1的隨機數,左閉右開
索引
arr = np.random.randint(0,100,size=(5,6)) arr array([[28, 74, 88, 9, 15, 18], [80, 71, 88, 11, 17, 46], [ 7, 75, 28, 33, 84, 96], [88, 44, 5, 4, 71, 88], [88, 50, 54, 34, 15, 77]]) arr[0] # array([28, 74, 88, 9, 15, 18]) 第一行 arr[0,0] # 28 第一行的第一列 arr[0,1] # 74 第一行的第二列 arr[0,[2,3]] # array([88, 9]) 第一行的第三四列
切片
arr[0:2] # 切取前兩行 # 結果 array([[28, 74, 88, 9, 15, 18], [80, 71, 88, 11, 17, 46]])
arr[:,0:2] # 切取前兩列 # 結果 array([[28, 74], [80, 71], [ 7, 75], [88, 44], [88, 50]])
arr[0:2:,0:2] # 切取前兩行的前兩列 # 結果 array([[28, 74], [80, 71]])
行倒序/列倒序
arr[::-1] # 行倒序 arr[:,::-1] # 列倒序
所有倒序
arr[::-1,::-1] # 所有倒序
讓圖片數組 列 倒序 - 圖片水平翻轉180°
import matplotlib.pyplot as plt img_arr = plt.imread('./落日.jpg') plt.imshow(img_arr[:,::-1])
讓圖片數組 行 倒序 - 圖片垂直翻轉180°
import matplotlib.pyplot as plt img_arr = plt.imread('./落日.jpg') plt.imshow(img_arr[::-1])
圖片顏色變化
import matplotlib.pyplot as plt img_arr = plt.imread('./落日.jpg') plt.imshow(img_arr[::-1,::-1])
import matplotlib.pyplot as plt img_arr = plt.imread('./落日.jpg') plt.imshow(img_arr[120:210,200:300]) # 根據jupyter的標尺進行切割
arr array([[28, 74, 88, 9, 15, 18], [80, 71, 88, 11, 17, 46], [ 7, 75, 28, 33, 84, 96], [88, 44, 5, 4, 71, 88], [88, 50, 54, 34, 15, 77]])
將多維數組變造成一維數組 - 須要根據原數組的元素個數進行合成
arr.reshape(30)
將多維數組變造成二維數組 - 須要根據原數組的元素個數進行合成
arr.reshape((10,3) arr.reshape((10,-1) # 自動計算
import numpy as np np.concatenate((arr,arr),axis=1) # axis軸 0表示豎軸拼合,1表示橫軸拼合 arr爲;兩個數組
合併兩張圖片
import numpy as np arr_3 = np.concatenate((img_arr,img_arr,img_arr),axis=1) plt.imshow(arr_3) # 三聯圖 arr_9 = np.concatenate((arr_3,arr_3,arr_3),axis=0) plt.imshow(arr_9) # 九宮格圖
級聯須要注意的點:
1. 級聯的參數是列表:必定要加中括號或小括號 2. 維度必須相同 3. 形狀相符:在維度保持一致的前提下,若是進行橫向(axis=1)級聯,必須保證進行級聯的數組行數保持一致。若是進行縱向(axis=0)級聯,必須保證進行級聯的數組列數保持一致。 4. 可經過axis參數改變級聯的方向
arr : array([[28, 74, 88, 9, 15, 18], [80, 71, 88, 11, 17, 46], [ 7, 75, 28, 33, 84, 96], [88, 44, 5, 4, 71, 88], [88, 50, 54, 34, 15, 77]])
arr.sum(axis=0) # 縱軸的求總和 # array([291, 314, 263, 91, 202, 325]) arr.sum(axis=1) # 橫軸的求總和 # array([232, 313, 323, 300, 318])
Function Name NaN-safe Version Description np.sum np.nansum Compute sum of elements np.prod np.nanprod Compute product of elements np.mean np.nanmean Compute mean of elements np.std np.nanstd Compute standard deviation np.var np.nanvar Compute variance np.min np.nanmin Find minimum value np.max np.nanmax Find maximum value np.argmin np.nanargmin Find index of minimum value np.argmax np.nanargmax Find index of maximum value np.median np.nanmedian Compute median of elements np.percentile np.nanpercentile Compute rank-based statistics of elements np.any N/A Evaluate whether any elements are true np.all N/A Evaluate whether all elements are true np.power 冪運算
np.sort()與ndarray.sort()均可以,但有區別:
=
0) arr直接被改變了np.sort(arr,axis=0) # 對每一列排序 np.sort(arr,axis=1) # 對每一行排序 arr.sort(axis=0) # 對每一列排序,改變原有arr數據
Series是一種相似與一維數組的對象,由下面兩個部分組成: - values:一組數據(ndarray類型) - index:相關的數據索引標籤
使用列表建立Series :
import pandas as pd from pandas import Series,DataFrame s = Series(data=[3,,4]) # 0 3 1 4 dtype: int64 # 0,1 表示的是隱式索引(默認索引)
s = Series(data=[5,6],index=['a','b']) # a,b表示的是顯式索引 # a 5 b 6 dtype: int64
s['a'] # 5 s[0] # 5 s.a # 5 但不能s.1
可使用中括號取單個索引(此時返回的是元素類型),或者中括號裏一個列表取多個索引(此時返回的是一個Series類型)。 (1) 顯式索引: - 使用index中的元素做爲索引值 - 使用s.loc[](推薦):注意,loc中括號中放置的必定是顯示索引 注意,此時是閉區間 (2)在運算中自動對齊不一樣索引的數據 若是索引不對應,則補NaN
s['a'] # 5 s[0] # 5 s.a # 5 但不能s.1 s[0:2] # 切片 # 切片結果 a 5 b 6 dtype: int64
可使用s.head(),tail()分別查看前n個和後n個值
s = Series(data=[1,2,3,4,5,6,9,9,9,]) s.head(2) # 只顯示前兩行數據
對Series元素進行去重
s = Series(data=[1,2,3,4,5,6,9,9,9,]) s.unique() # 去重
Series相加
s1 = Series([1,2,3],index=['a','b','c']) s2 = Series([1,2,3],index=['a','d','c']) s = s1 + s2 s # 結果 a 2.0 b NaN c 6.0 d NaN dtype: float64 # 說明 Series只能夠對索引相同的進行算法運算,不然爲空(NaN)
可使用pd.isnull(),pd.notnull(),或s.isnull(),notnull()函數檢測缺失數據
s[[True,False,True,False]] # 結果 a 2.0 c 6.0 dtype: float64 # 將布爾值做爲Series的索引,那麼索引爲False對應的值就不會顯示
s.isnull() # 若是是空值返回爲True # 結果 a False b True c False d True dtype: bool
s.notnull() # 若是不是空返回True # 結果 a True b False c True d False dtype: bool
對Series去空 - 將Series中的空值直接進行了清洗
s[s.notnull()] a 2.0 c 6.0 dtype: float64 # 利用 - 將布爾值做爲Series的索引,那麼索引爲False對應的值就不會顯示
DataFrame是一個【表格型】的數據結構。DataFrame由按必定順序排列的多列數據組成。設計初衷是將Series的使用場景從一維拓展到多維。DataFrame既有行索引,也有列索引。
最經常使用的方法是傳遞一個字典來建立。DataFrame以字典的鍵做爲每一【列】的名稱,以字典的值(一個數組)做爲每一列。 此外,DataFrame會自動加上每一行的索引。 使用字典建立的DataFrame後,則columns參數將不可被使用。 同Series同樣,若傳入的列與字典的鍵不匹配,則相應的值爲NaN。
from pandas import Series,DataFrame import numpy as np DataFrame(data=np.random.randint(0,100,size=(2,3))) # 結果 0 1 2 0 88 15 6 1 85 22 11
from pandas import Series,DataFrame import numpy as np df = DataFrame(data=np.random.randint(0,100,size=(2,3)),index=['a','b'],columns=['A','B','C']) # 結果 A B C a 12 92 96 b 62 57 79
# values 返回全部元素 df.values # 返回的是一個數組 array([[42, 57, 97], [50, 45, 40]])
# index 返回全部的列索引 df.index # Index(['a', 'b'], dtype='object')
# columns 返回全部的行索引 df.columns # Index(['A', 'B', 'C'], dtype='object')
# shape 返回形狀 df.shape # (2, 3)
利用字典做爲數據建立DataFrame
dic = { 'zhangsan':[99,99,99,99], 'lisi':[0,0,0,0] } df = DataFrame(data=dic,index=['語文','數學','英語','理綜']) # 結果 lisi zhangsan 語文 0 99 數學 0 99 英語 0 99 理綜 0 99
(1) 對列進行索引 - 經過相似字典的方式 df['q'] - 經過屬性的方式 df.q 能夠將DataFrame的列獲取爲一個Series。返回的Series擁有原DataFrame相同的索引,且name屬性也已經設置好了,就是相應的列名。
取列索引
df['lisi'] #列索引 df[['zhangsan','lisi']] 語文 0 數學 0 英語 0 理綜 0 zhangsan lisi 語文 99 0 數學 99 0 英語 99 0 理綜 99 0
取行索引
- 使用.loc[]加顯式索引取相應行 - 使用.iloc[]加整數來取相應行
df.loc['語文'] 或 df.iloc[0] # 隱式索引 取第一行 lisi 0 zhangsan 99 df.loc[['語文','數學']] 或 df.iloc[[0,1]] # 取前兩行 lisi zhangsan 語文 0 99 數學 0 99
取單個某些數據
df.iloc[2,1] #取第三行的第二個值 df.loc['英語','zhangsan'] df.iloc[[1,2],1] # 取第二三行的第二個值
切行
df[0:2] #行切片 lisi zhangsan 語文 0 99 數學 0 99
切列/行
df.iloc[:,0:1] # 只切列 df.iloc[:2,0:1] # 切前三行和兩列
總結:
同Series同樣: 1. 在運算中自動對齊不一樣索引的數據 2. 若是索引不對應,則補NaN 能夠對DataFrame的每一行每一列直接進行運算
Tushare是一個免費、開源的python財經數據接口包。主要實現對股票等金融數據從數據採集、清洗加工 到 數據存儲的過程,可以爲金融分析人員提供快速、整潔、和多樣的便於分析的數據
安裝tushare包 pip install tushare
import tushare as ts import pandas as pd
# 請求茅臺股票的數據,600519爲茅臺股票的代碼 maotai = ts.get_k_data(code='600519',start='1900-01-01') date open close high low volume code 0 1991-01-02 0.185 0.188 0.188 0.185 759.00 000001 1 1991-01-03 0.429 0.429 0.429 0.429 212.40 000001 ... ...
# 以maotai.csv爲名存儲到本地 maotai.to_csv('./maotai.csv')
#讀取部分數據(前五行) maotai.head()
df.index # 顯示全部的行索引 df.index[0] # 第一個行索引 df.columns # 顯示全部的列索引 df.columns[0] # 第一個列索引
#從本地讀取數據 - 用pandas讀取數據 df = pd.read_csv('./maotai.csv') # 刪除labels='Unnamed: 0'(字段) axis=1 表示刪除列,0表示刪除行, #inplace=True表示操做做用到源數據中 df.drop(labels='Unnamed: 0',axis=1,inplace=True) #index_col將哪一列做爲原數據的行索引 ,parse_dates=['date']:將date的類型轉成時間類型 df = pd.read_csv('./maotai.csv',index_col='date',parse_dates=['date'])
要求 :
# 輸出該股票全部收盤比開盤上漲3%以上的日期。 #(收盤-開盤)/開盤 > 0.03 返回的是邏輯表達式,Ture和False (df['close'] - df['open']) / df['open'] > 0.03 #將True對應的行數據取出 df.loc[(df['close'] - df['open']) / df['open'] > 0.03] #取行索引 df.loc[(df['close'] - df['open']) / df['open'] > 0.03].index
#輸出該股票全部開盤比前日收盤跌幅超過2%的日期。 #(開盤-前日收盤)/前日收盤 < -0.02 # shift(1)表示下移 ,-1表示上移 (df['open'] - df['close'].shift(1)) / df['close'].shift(1) < -0.02 df.loc[(df['open'] - df['close'].shift(1)) / df['close'].shift(1) < -0.02] df.loc[(df['open'] - df['close'].shift(1)) / df['close'].shift(1) < -0.02].index
df_2010 = df['2010':'2019']
分析 :
數據的從新取樣resample()
df_2010 = df['2010':'2019'] #買入股票花費的錢數 A年 M天 D天 # m取到每月對應的第一行數據 df_monthly = df_2010.resample('M').first() # 買股票花的錢 一手100股 cost_money = df_monthly['open'].sum()*100 #賣出股票收到多少錢,刨除今年 df_yearly = df_2010.resample('A').last()[:-1] last_price = df_2010['close'][-1] #昨天的收盤價 # 結果: recv_monry = df_yearly['open'].sum()*1200 + last_price*1000 recv_monry - cost_money
有兩種丟失數據:
import numpy as np import pandas from pandas import DataFrame
None
None是Python自帶的,其類型爲python object。所以,None不能參與到任何計算中。 #查看None的數據類型 type(None) # NoneType
np.nan(NaN)
np.nan是浮點類型,能參與到計算中。但計算的結果老是NaN。 #查看np.nan的數據類型 type(np.nan) # float
建立DataFrame :
df = DataFrame(data=np.random.randint(0,100,size=(10,8))) df 0 1 2 3 0 62 13 85 96 1 91 66 93 61 2 65 60 40 81
#將某些數組元素賦值爲nan / None df.iloc[1,2] = None df.iloc[2,1] = np.nan df 0 1 2 3 0 30 95.0 21.0 88 1 10 54.0 NaN 71 2 17 NaN 30.0 27
判斷函數 df.isnull() / df.notnull()
df.isnull() 0 1 2 3 0 False False False False 1 False False True False 2 False True False False
all()
/ any()
df.isnull().all(axis=0) # 鑑定每一列的總狀態 all : 有一個False就是False,全True才True 0 False 1 False 2 False 3 False df.isnull().all(axis=1) # 鑑定每一行的總狀態 0 False 1 False 2 False df.isnull().any(axis=1) # 鑑定每一行的總狀態 all : 有一個True就是True 0 False 1 True 2 True
df.loc[~df.isnull().any(axis=1)] # ~ 爲取反 df.loc[df.notnull().all(axis=1)] # 兩個結果相同 0 1 2 3 0 30 95.0 21.0 88
固定搭配 : isnull() → any() notnull() → all()
df.dropna() 能夠選擇過濾的是行仍是列(默認爲行):axis中0表示行,1表示的列 df.dropna(axis=0) 0 1 2 3 0 30 95.0 21.0 88
覆蓋
df.fillna(value=66666) # 將全部的空值賦值66666
使用周圍近鄰值覆蓋
df.fillna(method='ffill',axis=1) # 豎軸前面一數據 做爲填充數據源進行覆蓋 bfill爲向後 0 1 2 3 0 30.0 95.0 21.0 88.0 1 10.0 54.0 54.0 71.0 2 17.0 17.0 30.0 27.0
#測試df_test中的哪些列中還有空值 df_test.isnull().any(axis=0)
pandas的拼接分爲兩種:
級聯:pd.concat, pd.append
合併:pd.merge, pd.join
import pandas as pd import numpy as np from pandas import DataFrame,Series
pandas使用pd.concat函數的級聯,與np.concatenate函數相似,只是多了一些參數: objs axis=0 keys join='outer' / 'inner':表示的是級聯的方式,outer會將全部的項進行級聯(忽略匹配和不匹配,默認參數),而inner只會將匹配的項級聯到一塊兒,不匹配的不級聯 ignore_index=False
匹配級聯
df1 = DataFrame(data=np.random.randint(0,100,size=(3,4))) df2 = DataFrame(data=np.random.randint(0,100,size=(3,4))) pd.concat((df1,df2),axis=0)
不匹配級聯
不匹配指的是級聯的維度的索引不一致。例如縱向級聯時列索引不一致,橫向級聯時行索引不一致
pd.concat((df1,df2),axis=0,join='inner')
有2種鏈接方式:
merge與concat的區別在於,merge須要依據某一共同的列來進行合併 使用pd.merge()合併時,會自動根據二者相同column名稱的那一列,做爲key來進行合併。 注意每一列元素的順序不要求一致
參數: - how:out取並集 inner取交集 - 默認 - on:當有多列相同的時候,可使用on來指定使用那一列進行合併,on的值爲一個列表 若是不寫on,默認將相同的一列做爲合併條件
數據
df1 = DataFrame({'employee':['Bob','Jake','Lisa'], 'group':['Accounting','Engineering','Engineering'], }) df1 df2 = DataFrame({'employee':['Lisa','Bob','Jake'], 'hire_date':[2004,2008,2012], }) df2
pd.merge(df1,df2)
df3 = DataFrame({ 'employee':['Lisa','Jake'], 'group':['Accounting','Engineering'], 'hire_date':[2004,2016]}) df3 df4 = DataFrame({'group':['Accounting','Engineering','Engineering'], 'supervisor':['Carly','Guido','Steve'] }) df4
pd.merge(df3,df4)
df1 = DataFrame({'employee':['Bob','Jake','Lisa'], 'group':['Accounting','Engineering','Engineering']}) df1 df5 = DataFrame({'group':['Engineering','Engineering','HR'], 'supervisor':['Carly','Guido','Steve'] }) df5
pd.merge(df1,df5,how='right') # right保留右表數據
df1 = DataFrame({'employee':['Jack',"Summer","Steve"], 'group':['Accounting','Finance','Marketing']}) df2 = DataFrame({'employee':['Jack','Bob',"Jake"], 'hire_date':[2003,2009,2012], 'group':['Accounting','sell','ceo']})
pd.merge(df1,df2,on='employee')
當兩張表沒有可進行鏈接的列時,可以使用left_on和right_on手動指定merge中左右兩邊的哪一列列做爲鏈接的列
df1 = DataFrame({'employee':['Bobs','Linda','Bill'], 'group':['Accounting','Product','Marketing'], 'hire_date':[1998,2017,2018]}) df1 df5 = DataFrame({'name':['Lisa','Bobs','Bill'], 'hire_dates':[1998,2016,2007]}) df5
pd.merge(df1,df5,left_on='employee',right_on='name',how='outer')
內合併:只保留二者都有的key(默認模式)
df6 = DataFrame({'name':['Peter','Paul','Mary'], 'food':['fish','beans','bread']} ) df7 = DataFrame({'name':['Mary','Joseph'], 'drink':['wine','beer']})
外合併 how='outer':補NaN
df6 = DataFrame({'name':['Peter','Paul','Mary'], 'food':['fish','beans','bread']} ) df7 = DataFrame({'name':['Mary','Joseph'], 'drink':['wine','beer']})
import numpy as np from pandas import DataFrame,Series import pandas as pd
導入文件,查看原始數據
abb = pd.read_csv('./data/state-abbrevs.csv') abb.head(2) pop = pd.read_csv('./data/state-population.csv') pop.head(2) area = pd.read_csv('./data/state-areas.csv') area.head(2)
將人口數據和各州簡稱數據進行合併
abb_pop = pd.merge(abb,pop,left_on='abbreviation',right_on='state/region',how='outer') abb_pop.head(2)
將合併的數據中重複的abbreviation列進行刪除
abb_pop.drop(labels='abbreviation',axis=1,inplace=True) # inplace將操做做用到原表 abb_pop.head(2)
查看存在缺失數據的列
abb_pop.isnull().any(axis=0)
找到有哪些state/region使得state的值爲NaN,進行去重操做
理解 : 找到state的空對應的state/region空值有幾種,而後去重
#1.state列中哪些值爲空 abb_pop['state'].isnull() #2.能夠將step1中空對應的行數據取出(state中的空值對應的行數據) abb_pop.loc[abb_pop['state'].isnull()] #3.將對應的行數據中指定的簡稱列取出 abb_pop.loc[abb_pop['state'].isnull()]['state/region'].unique()
爲找到的這些state/region的state項補上正確的值,從而去除掉state這一列的全部NaN
#1.先將USA對應的state列中的空值定位到(找到全部的USA所對應的行) abb_pop['state/region'] == 'USA' # 邏輯表達式,範湖的是True/False #2,將布爾值做爲原數據的行索引,取出USA簡稱對應的行數據 abb_pop.loc[abb_pop['state/region'] == 'USA'] #3.獲取符合要求行數據的行索引 indexs = abb_pop.loc[abb_pop['state/region'] == 'USA'].index #4.將indexs這些行中的state列的值批量賦值成united states abb_pop.loc[indexs,'state'] = 'United Status' #5.將PR對應的state列中的空批量賦值成 PUERTO RICO abb_pop['state/region'] == 'PR' abb_pop.loc[abb_pop['state/region'] == 'PR'] indexs = abb_pop.loc[abb_pop['state/region'] == 'PR'].index abb_pop.loc[indexs,'state'] = 'PUERTO RICO'
合併各州面積數據areas
abb_pop_area = pd.merge(abb_pop,area,how='outer') abb_pop_area.head(3)
咱們會發現area(sq.mi)這一列有缺失數據,找出是哪些行
abb_pop_area['area (sq. mi)'].isnull() #將空值對應的行數據取出 indexs = abb_pop_area.loc[abb_pop_area['area (sq. mi)'].isnull()].index indexs
去除含有缺失數據的行
abb_pop_area.drop(labels=indexs,axis=0,inplace=True)
找出2010年的全民人口數據
abb_pop_area.query('year == 2010 & ages == "total"')
計算各州的人口密度
abb_pop_area['midu'] = abb_pop_area['population'] / abb_pop_area['area (sq. mi)'] abb_pop_area.head(2)
排序,並找出人口密度最高的五個州 df.sort_values()
abb_pop_area.sort_values(by='midu',axis=0,ascending=False).head(5) # ascending=False升序
import numpy as np import pandas as pd from pandas import DataFrame
建立具備重複元素行的DataFrame
#建立一個df df = DataFrame(data=np.random.randint(0,100,size=(12,7))) df
#手動將df的某幾行設置成相同的內容 df.iloc[1] = [6,6,6,6,6,6,6] df.iloc[8] = [6,6,6,6,6,6,6] df.iloc[5] = [6,6,6,6,6,6,6] df
使用drop_duplicates()函數刪除重複的行
df.drop_duplicates(keep='last')
DataFrame替換操做 : - 單值替換 - 普通替換: 替換全部符合要求的元素:to_replace=15,value='e' - 按列指定單值替換: to_replace={列標籤:替換值} value='value' - 多值替換 - 列表替換: to_replace=[] value=[] - 字典替換(推薦) to_replace={to_replace:value,to_replace:value} - 注意:DataFrame中,沒法使用method和limit參數
替換 :
#建立一個df df = DataFrame(data=np.random.randint(0,100,size=(12,7))) df
將源數據中全部的6都替換成six
df.replace(to_replace=6,value='six') # 加入inplace=True就會改寫源數據 df.replace(to_replace={6:'six'})
將第五列中的6替換成six
df.replace(to_replace={5:6},value='six') # to_replace={5:6} 第五列中的6
映射 :
map()函數:新建一列 , map函數並非df的方法,而是series的方法
map()能夠映射新一列數據
map()中可使用lambd表達式
map()中可使用方法,能夠是自定義的方法
eg:map({to_replace:value})
注意 map()中不能使用sum之類的函數,for循環
新增一列:給df中,添加一列,該列的值爲中文名對應的英文名
dic = { 'name':['張三','周杰倫','張三'], 'salary':[20000,10000,20000] } df = DataFrame(data=dic) df
#映射關係表 dic = { '張三':'tom', '周杰倫':'jay' } df['e_name'] = df['name'].map(dic) df
使用自定義函數 :
# 自定義的函數 def after_sal(s): return s - (s-3000)*0.5 #超過3000部分的錢繳納50%的稅 df['after_sal'] = df['salary'].map(after_sal) df df['after_sal'] = df['salary'].apply(after_sal) #apply效率高於map df
注意:並非任何形式的函數均可以做爲map的參數。只有當一個函數具備一個參數且有返回值,那麼該函數才能夠做爲map的參數
建立一個1000行3列的df 範圍(0-1),求其每一列的標準差
df = DataFrame(data=np.random.random(size=(1000,3)),columns=['A','B','C']) df
對df應用篩選條件,去除標準差太大的數據:假設過濾條件爲 C列數據大於兩倍的C列標準差
twice_std = df['C'].std() * 2 twice_std ~(df['C'] > twice_std) df.loc[~(df['C'] > twice_std)]
- 檢測過濾缺失值 - dropna - fillna - 檢測過濾重複值 - drop_duplicated(keep) - 檢測過濾異常值 - 獲得鑑定異常值的條件 - 將異常值對應的行刪除
使用.take()函數排序 - take()函數接受一個索引列表,用數字表示,使得df根據列表中索引的順序進行排序 - eg:df.take([1,3,4,2,5]) 能夠藉助np.random.permutation()函數隨機排序
np.random.permutation(x)能夠生成x個從0-(x-1)的隨機數列 np.random.permutation(1000) df.take(indices=np.random.permutation(1000),axis=0).take(indices=np.random.permutation(3),axis=1) # 切五行 df.take(indices=np.random.permutation(1000),axis=0).take(indices=np.random.permutation(3),axis=1)[0:5]
數據聚合是數據處理的最後一步,一般是要使每個數組生成一個單一的數值。 數據分類處理: - 分組:先把數據分爲幾組 - 用函數處理:爲不一樣組的數據應用不一樣的函數以轉換數據 - 合併:把不一樣組獲得的結果合併起來 數據分類處理的核心: - groupby()函數 - groups屬性查看分組狀況 - eg: df.groupby(by='item').groups
分組
df = DataFrame({'item':['Apple','Banana','Orange','Banana','Orange','Apple'], 'price':[4,3,3,2.5,4,2], 'color':['red','yellow','yellow','green','green','green'], 'weight':[12,20,50,30,20,44]}) df
使用groupby實現分組
df.groupby(by='item',axis=0) #根據item分組
使用groups查看分組狀況
#該函數能夠進行數據的分組,可是不顯示分組狀況 df.groupby(by='item',axis=0).groups
分組後的聚合操做:分組後的成員中能夠被進行運算的值會進行運算,不能被運算的值不進行運算
給df建立一個新列,內容爲各個水果的平均價格
df.groupby(by='item',axis=0).mean()['price'] # 這樣效率低 # 先將價格取出再運算 df.groupby(by='item',axis=0)['price'].mean()
按顏色查看各類顏色的水果的平均價格 mean_price_series = df.groupby(by='item',axis=0)['price'].mean() mean_price_series # 結果 item Apple 3.00 Banana 2.75 Orange 3.50 #映射關係表 dic = mean_price_series.to_dict() # 將 mean_price_series 轉換成字典做爲映射表 df['mean_price'] = df['item'].map(dic) df
彙總:將各類顏色水果的平均價格和df進行彙總
df['color_mean_price'] = df['color'].map(df.groupby(by='color')['price'].mean().to_dict()) df
使用groupby分組後,也可使用transform和apply提供自定義函數實現更多的運算 - df.groupby('item')['price'].sum() <==> df.groupby('item')['price'].apply(sum) - transform和apply都會進行運算,在transform或者apply中傳入函數便可 - transform和apply也能夠傳入一個lambda表達式
自定義聚合函數 :
def my_mean(s): sum = 0 for i in s: sum += i return sum/len(s) #使用apply函數求出水果的平均價格 df.groupby(by='item')['price'].apply(my_mean)
import numpy as np import pandas as pd from pandas import Series,DataFrame
方便你們操做,將月份和參選人以及所在政黨進行定義
months = {'JAN' : 1, 'FEB' : 2, 'MAR' : 3, 'APR' : 4, 'MAY' : 5, 'JUN' : 6, 'JUL' : 7, 'AUG' : 8, 'SEP' : 9, 'OCT': 10, 'NOV': 11, 'DEC' : 12} of_interest = ['Obama, Barack', 'Romney, Mitt', 'Santorum, Rick', 'Paul, Ron', 'Gingrich, Newt'] parties = { 'Bachmann, Michelle': 'Republican', 'Romney, Mitt': 'Republican', 'Obama, Barack': 'Democrat', "Roemer, Charles E. 'Buddy' III": 'Reform', 'Pawlenty, Timothy': 'Republican', 'Johnson, Gary Earl': 'Libertarian', 'Paul, Ron': 'Republican', 'Santorum, Rick': 'Republican', 'Cain, Herman': 'Republican', 'Gingrich, Newt': 'Republican', 'McCotter, Thaddeus G': 'Republican', 'Huntsman, Jon': 'Republican', 'Perry, Rick': 'Republican' }
讀取usa_election.txt文件
df = pd.read_csv('./data/usa_election.txt') df.head()
```
cmte_id | cand_id | cand_nm | contbr_nm | contbr_city | contbr_st | contbr_zip | contbr_employer | contbr_occupation | contb_receipt_amt | contb_receipt_dt | receipt_desc | memo_cd | memo_text | form_tp | file_num | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | C00410118 | P20002978 | Bachmann, Michelle | HARVEY, WILLIAM | MOBILE | AL | 3.6601e+08 | RETIRED | RETIRED | 250.0 | 20-JUN-11 | NaN | NaN | NaN | SA17A | 736166 |
1 | C00410118 | P20002978 | Bachmann, Michelle | HARVEY, WILLIAM | MOBILE | AL | 3.6601e+08 | RETIRED | RETIRED | 50.0 | 23-JUN-11 | NaN | NaN | NaN | SA17A | 736166 |
...
新建一列各個候選人所在黨派party
```python
df['party'] = df['cand_nm'].map(parties)
df.head()
```
cmte_id | cand_id | cand_nm | contbr_nm | contbr_city | contbr_st | contbr_zip | contbr_employer | contbr_occupation | contb_receipt_amt | contb_receipt_dt | receipt_desc | memo_cd | memo_text | form_tp | file_num | party | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | C00410118 | P20002978 | Bachmann, Michelle | HARVEY, WILLIAM | MOBILE | AL | 3.6601e+08 | RETIRED | RETIRED | 250.0 | 20-JUN-11 | NaN | NaN | NaN | SA17A | 736166 | Republican |
1 | C00410118 | P20002978 | Bachmann, Michelle | HARVEY, WILLIAM | MOBILE | AL | 3.6601e+08 | RETIRED | RETIRED | 50.0 | 23-JUN-11 | NaN | NaN | NaN | SA17A | 736166 | Republican |
party這一列中有哪些元素
df['party'].unique() # 利用去重
統計party列中各個元素出現次數
df['party'].value_counts()
結果 :
Democrat 292400 Republican 237575 Reform 5364 Libertarian 702
查看各個黨派收到的政治獻金總數contb_receipt_amt
df.groupby(by='party')['contb_receipt_amt'].sum()
結果
party Democrat 8.105758e+07 Libertarian 4.132769e+05 Reform 3.390338e+05 Republican 1.192255e+08
查看天天各個黨派收到的政治獻金總數contb_receipt_amt
df.groupby(by=['contb_receipt_dt','party'])['contb_receipt_amt'].sum() # groupby中by的參數,誰在前先對誰分組
將表中日期格式轉換爲'yyyy-mm-dd' day-m-y
def transformDate(d): day,month,year = d.split('-') month = months[month] return '20'+year+'-'+str(month)+'-'+day df['contb_receipt_dt'] = df['contb_receipt_dt'].map(transformDate) df.head()
查看老兵(捐獻者職業)主要支持誰 :查看老兵們捐贈給誰的錢最多
#1.將老兵對應的行數據取出 df['contbr_occupation'] == 'DISABLED VETERAN' old_bing = df.loc[df['contbr_occupation'] == 'DISABLED VETERAN'] #2.根據候選人分組 old_bing.groupby(by='cand_nm')['contb_receipt_amt'].sum() # 結果 : cand_nm Cain, Herman 300.00 Obama, Barack 4205.00 Paul, Ron 2425.49 Santorum, Rick 250.00
捐贈金額最大的人的職業以及捐獻額 .經過query("查詢條件來查找捐獻人職業")
# 1.先找出捐錢金額最大的數據 df['contb_receipt_amt'].max() # 結果 1944042.43 # 2.經過query("查詢條件來查找捐獻人職業") df.query('contb_receipt_amt == 1944042.43')
seaborn - 也是繪圖模塊
Matplotlib中的基本圖表包括的元素 + x軸和y軸 axis 水平和垂直的軸線 + x軸和y軸刻度 tick 刻度標示座標軸的分隔,包括最小刻度和最大刻度 + x軸和y軸刻度標籤 tick label 表示特定座標軸的值 + 繪圖區域(座標系) axes 實際繪圖的區域 + 座標系標題 title 實際繪圖的區域 + 軸標籤 xlabel ylabel 實際繪圖的區域
導包 :
import numpy as np import pandas as pd import matplotlib.pyplot as plt from pandas import Series,DataFrame %matplotlib inline # jupyter中的一個魔法函數(Magic Functions)當你調用matplotlib.pyplot的繪圖函數plot()進行繪圖的時候,或者生成一個figure畫布的時候,能夠直接在你的python console裏面生成圖像。
x=[1,2,3,4,5] y=[2,4,6,8,10] plt.plot(x,y)
x = np.linspace(-np.pi,np.pi,num=10) # linspace等差數列 pi=π y = x**2 plt.plot(x,y)
x = x y = np.sin(x) plt.plot(x,y)
plt.plot(x,y) plt.plot(x-1,y+2)
plt.plot(x,y,x+1,y-1)
ax1 = plt.subplot(2,2,1) # 2,2,1 表示繪製兩行兩列的曲線圖,在位置1上 ax1.plot(x,y) ax2 = plt.subplot(222) ax2.plot(x+1,y-2) ax3 = plt.subplot(223) ax3.plot(x+3,y-1) ax4 = plt.subplot(224) ax4.plot(x**2,y-2)
plt.axis([xmin,xmax,ymin,ymax])
plt.plot(x,y) plt.axis([-6,6,-2,2]) # 座標軸的範圍是 : X軸 (-6,6), Y軸 (-2,2)
plt.plot(x,y) plt.axis('off')
plt.figure(figsize=(16,8)) plt.plot(x,y)
from pylab import mpl mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默認字體 解決不能顯示中文的問題 mpl.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負號'-'顯示爲方塊的問題 plt.plot(x,y) plt.xlabel('X軸') plt.ylabel('Y軸') plt.title('標題')
兩種傳參方法:
plt.plot(x,y,label='temp') plt.plot(x-1,y+3,label='dist') plt.legend(loc=4) plt.legend(loc=3,ncol=2) # loc 爲指定圖例的位置默認是1 ; ncol控制圖例中有幾列,在legend中設置ncol 1 - 右上 2 - 左上 3 - 左下 4 - 右下
使用figure對象的savefig函數來保存圖片
fig = plt.figure()---必須放置在繪圖操做以前
figure.savefig的參數選項
filename
含有文件路徑的字符串或Python的文件型對象。圖像格式由文件擴展名推斷得出,例如,.pdf推斷出PDF,.png推斷出PNG (「png」、「pdf」、「svg」、「ps」、「eps」……)
dpi
圖像分辨率(每英寸點數),默認爲100
facecolor ,打開保存圖片查看 圖像的背景色,默認爲「w」(白色)
fig = plt.figure() plt.plot(x,y,label='temp') plt.plot(x-1,y+3,label='dist') plt.legend(loc=3,ncol=2) fig.savefig('./123.png',dpi=300)
設置plot的風格和樣式
plt.plot(x,y,c='red',alpha=0.5,ls='steps',lw=3,marker='s',markersize='10') # 顏色 : color/c # alpha : 透明度 # 線性 : linestyle或ls # 線寬 : linewidth或lw參數 # 點型 marker 設置點形 markersize 設置點形大小
線條風格 | 描述 | 線條風格 | 描述 |
---|---|---|---|
'-' | 實線 | ':' | 虛線 |
'--' | 破折線 | 'steps' | 階梯線 |
'-.' | 點劃線 | 'None' / ',' | 什麼都不畫 |
點型 :
標記 | 描述 | 標記 | 描述 | 標記 | 描述 | 標記 | 描述 |
---|---|---|---|---|---|---|---|
's' | 正方形 | 'p' | 五邊形 | 'x' | X | ',' | 像素 |
'h' | 六邊形1 | 'H' | 六邊形2 | '*' | 星號 | 'o' | 圓圈 |
'8' | 八邊形 | '.' | 點 | '+' | 加號 | 'D' | 菱形 |
'1' | 一角朝下的三腳架 | '2' | 一角朝上的三腳架 | '3' | 一角朝左的三腳架 | '4' | 一角朝右的三腳架 |
'd' | 小菱形 | '','None',' ',None | 無 |
【直方圖的參數只有一個x!!!不像條形圖須要傳入x,y】
plt.hist()的參數
data = [1,2,3,3,4,2,5] plt.hist(data,bins=10,color='red') plt.hist(data,bins=10,color='red',orientation='horizontal')
返回值 :
1: 直方圖向量,是否歸一化由參數normed設定
2: 返回各個bin的區間範圍
3: 返回每一個bin裏面包含的數據,是一個list
參數:第一個參數是索引。第二個參數是數據值。第三個參數是條形的寬度
【條形圖有兩個參數x,y】
width 縱向設置條形寬度
height 橫向設置條形高度
bar() - 豎向、barh() - 橫向
x = [1,2,3,4,5] y = [2,4,6,8,10] plt.bar(x,y) # 豎向 plt.barh(x,y) # 橫向
【餅圖也只有一個參數x】
pie()
餅圖適合展現各部分佔整體的比例,條形圖適合比較各部分的大小
普通各部分佔滿餅圖
plt.pie([1,3,5])
普通未佔滿餅圖:小數/比例
plt.pie([0.2,0.3,0.1])
餅圖陰影、分裂等屬性設置 : #labels參數設置每一塊的標籤; #labeldistance參數設置標籤距離圓心的距離(比例值) #autopct參數設置比例值小數保留位(%.3f%%); #pctdistance參數設置比例值文字距離圓心的距離 #explode參數設置每一塊頂點距圓心的長度(比例值,列表); #colors參數設置每一塊的顏色(列表); #shadow參數爲布爾值,設置是否繪製陰影 #startangle參數設置餅圖起始角度
labels標籤
arr=[11,22,31,15] plt.pie(arr,labels=['a','b','c','d']) #
參數設置標籤距離圓心的距離(比例值)
#labeldistance參數設置標籤距離圓心的距離(比例值) arr=[11,22,31,15] plt.pie(arr,labels=['a','b','c','d'],labeldistance=0.3)
參數設置比例值小數保留位
#autopct參數設置比例值小數保留位(%.3f%%); 3表示保留三位小數 arr=[11,22,31,15] plt.pie(arr,labels=['a','b','c','d'],labeldistance=0.3,autopct='%.5f%%')
explode參數設置每一塊頂點距圓心的長度(比例值,列表)
#explode參數設置每一塊頂點距圓心的長度(比例值,列表); arr=[11,22,31,15] plt.pie(arr,labels=['a','b','c','d'],labeldistance=0.3,shadow=True,explode=[0.2,0.3,0.2,0.9])
【散點圖須要兩個參數x,y,但此時x不是表示x軸的刻度,而是每一個點的橫座標!】- scatter()
x=[1,2,3,4,5] y=[2,4,6,8,10] plt.scatter(x,y)
plt.scatter(x,y,marker='d',c="rbgy") 設置不一樣的散點顏色
x = np.random.random(size=(30,)) y = np.random.random(size=(30,)) plt.scatter(x,y)