數據分析三劍客numpy pandas Matplotlib

NumPy 簡單使用

NumPy(Numerical Python) 是 Python 語言的一個擴展程序庫,支持大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。java

import numpy as np np.array([1,2,3,4,5]) #一維數組
np.array([[1,2,3.2],[4,5,6]]) #二維數組的建立

注意:
numpy默認ndarray的全部元素的類型是相同的
若是傳進來的列表中包含不一樣的類型,則統一爲同一類型,優先級:str>float>intpython

matplotlib 繪圖的數組

使用matplotlib.pyplot獲取一個numpy數組,數據來源於一張圖片數據結構

import matplotlib.pyplot as plt %matplotlib inline cat_img_arr = plt.imread('./cat.jpg')#外部圖片裝numpy中
cat_img_arr cat_img_arr.shape#顯示維度
plt.imshow(cat_img_arr)#顯示3惟數組
plt.imshow(cat_img_arr+100)

索引dom

arr = np.random.randint(60,100,size=(7,5))建立啊一個隨機的7行5列的數據 根據索引修改數據 arr[0]#取出第一行
arr[[0,1]]#取出前2行

切片函數

array([[75, 90, 93, 74, 91], [62, 62, 83, 88, 62], [78, 61, 92, 67, 82], [66, 73, 62, 61, 66], [93, 73, 72, 67, 93], [79, 71, 98, 69, 62], [64, 94, 98, 83, 74]]) arr[0:2]#獲取二維數組前兩列
array([[75, 90, 93, 74, 91], [62, 62, 83, 88, 62]]) arr[:,0:2]  #逗號左邊表示行 右邊表示列
array([[75, 90], [62, 62], [78, 61], [66, 73], [93, 73], [79, 71], [64, 94]]) arr[0:2,0:2]#獲取二維數組前兩行和前兩列數據
array([[75, 90], [62, 62]]) arr[::-1]#將數組的行倒序
arr[:,::-1]#列倒序
arr[::-1,::-1] #所有倒序
plt.imshow(cat_img_arr[:,::-1,:])#小貓左右反轉
 arr_3 = np.concatenate((cat_img_arr,cat_img_arr,cat_img_arr),axis=1)#1是橫向
arr_9 = np.concatenate((arr_3,arr_3,arr_3),axis=0)#0是縱向
plt.imshow(arr_9)

Pandas 的數據結構

from pandas import Series,DataFrame#pandas的重點 import pandas as pd import numpy as np

Series是一種相似與一維數組的對象,由下面兩個部分組成:spa

  • values:一組數據(ndarray類型)
  • index:相關的數據索引標籤
#使用列表建立Series
Series(data=[1,2,3]) Series(data=[1,2,3],index=['a','b','c'])#經過index設置顯示索引

由字典建立:不能在使用index.可是依然存在默認索引設計

 注意:數據源必須爲一維數據3d

dic = { '語文':99, '數學':100, '英語':88, '理綜':120 } s = Series(data=dic)

使用多種方法建立如下Series,命名爲s1:
語文 150
數學 150
英語 150
理綜 300code

Series的索引和切片

import pandas as pd import numpy as np dic={ '語文':99, '數學':100, '英文':88 } s=Series(data=dic) print(s[0]) print(s[0:2]) ########
99
########
語文     99 數學 100

s['毛概'] = 111  向Series增長一行:至關於給字典增長一組鍵值對

 

能夠經過shape,size,index,values等獲得series的屬性

s.values#打印出全部的values

array([100, 120, 88, 99, 111], dtype=int64)

 

可使用s.head(),tail()分別查看前n個和後n個值

s.tail(2)

 

對Series元素進行去重

s1 = Series(data=[1,1,1,2,2,2,3,3,4,56,6,7,8,8,8,7])
s1.unique()

 

當索引沒有對應的值時,可能出現缺失數據顯示NaN(not a number)的狀況

  • 使得兩個Series進行相加

s1 = Series(data=[1,2,3],index=['a','b','c'])
s2 = Series(data=[1,2,3],index=['a','b','d'])
s = s1 + s2

a    2.0 b 4.0 c NaN d NaN

可使用pd.isnull(),pd.notnull(),或s.isnull(),notnull()函數檢測缺失數據

pd.isnull()#檢測哪些是空

pd.notnull()#返回非空的值

DataFrame

DataFrame是一個【表格型】的數據結構。DataFrame由按必定順序排列的多列數據組成。設計初衷是將Series的使用場景從一維拓展到多維。DataFrame既有行索引,也有列索引。

  • 行索引:index
  • 列索引:columns
  • 值:values

使用ndarray建立DataFrame 二維的

df = DataFrame(data=np.random.randint(60,100,size=(3,3)))
df

df = DataFrame(data=np.random.randint(60,100,size=(3,3)),index=['a','b','c'],columns=['A','B','C'])
df

DataFrame屬性:values、columns、index、shape

df.values

df.index

df.shape

使用ndarray建立DataFrame:建立一個表格用於展現張三,李四,王五的java,python的成績

dic = { '張三':[150,150,150,150], '李四':[0,0,0,0] } df = DataFrame(data=dic,index=['語文','數學','英語','理綜']) df

#修改列索引
df.columns = ['zhangsan','lisi']
df

#獲取前兩列
df[[0,1]]

使用.loc[]加index來進行行索引

使用.iloc[]加整數來進行行索引 隱式索引

df.iloc[[0,1]]#取0到1行

df.iloc[3,6]#取絕對3行6列

切片

#切出df中的前兩行
df[0:3]

#切出df中的前兩列
df.iloc[:,0:2] #必須使用loc、iloc結合着逗號進行切列操做

df[0]#取列

df.iloc[0]#行

df.iloc[1,2]#元素

df[0:2] #切行

df.iloc[:,0:2] #切列

 

DataFrame的運算

同Series同樣:

  • 在運算中自動對齊不一樣索引的數據
  • 若是索引不對應,則補NaN

df1 = DataFrame(data=np.random.randint(0,100,size=(3,3)),index=['a','b','c'])
df2 = DataFrame(data=np.random.randint(0,100,size=(3,3)),index=['a','d','c'])

df1+df2

練習:

  1. 假設ddd是期中考試成績,ddd2是期末考試成績,請自由建立ddd2,並將其與ddd相加,求期中期末平均值。

  2. 假設張三期中考試數學被發現做弊,要記爲0分,如何實現?

  3. 李四由於舉報張三做弊立功,期中考試全部科目加100分,如何實現?

  4. 後來老師發現有一道題出錯了,爲了安撫學生情緒,給每位學生每一個科目都加10分,如何實現?

dic = { '張三':[150,150,150,150], '李四':[0,0,0,0] } df = DataFrame(data=dic,index=['語文','數學','英語','理綜']) qizhong = df qimo = df (qizhong+qimo)/2 df.loc['數學','張三'] = 0#行是數學 列是張三 df qizhong['李四'] += 100 qizhong qizhong += 10 qizhong

練習

  • 使用tushare包獲取某股票的歷史行情數據。
  • 輸出該股票全部收盤比開盤上漲3%以上的日期。
  • 輸出該股票全部開盤比前日收盤跌幅超過2%的日期。
  • 假如我從2010年1月1日開始,每個月第一個交易日買入1手股票,每一年最後一個交易日賣出全部股票,到今天爲止,個人收益如何?
df = ts.get_k_data(code='600519',start='2000-01-01') #將請求的數據存儲起來
df.to_csv('./600519.csv') #將600519.csv文件中的數據讀取到df
df = pd.read_csv('./600519.csv',index_col='date',parse_dates=['date'])#把當前時間做爲行索引
df.drop(labels='Unnamed: 0',axis=1,inplace=True)#刪除列中Unnamed 在當前文件中執行
df.head(5) #輸出該股票全部收盤比開盤上漲3%以上的日期。 #(收盤-開盤) / 開盤 》 0.03
(df['close'] - df['open']) / df['open'] > 0.03#邏輯運算返回true和False
df.loc[[True,False,True]]#篩選爲True的
df.loc[(df['close'] - df['open']) / df['open'] > 0.03].index#取出日期
相關文章
相關標籤/搜索