机器学习入门:准备知识笔记(pandas)之一
參考教學筆記:2021年Python人工智能,13天機器學習入門到精通,精講+14大案例分析(數據來源參考)
pandas的優勢?
增強圖表可讀性
便捷的數據處理能力
讀取文件方便
封裝了Matplotlib、 Numpy的畫圖和計算
Pandas數據結構
Pandas中一共有三種數據結構, 分別為: Series、 DataFrame和MultiIndex( 老版本中叫Panel ) 。
其中Series是一維數據結構, DataFrame是二維的表格型數據結構, MultiIndex是三維的數據結構。
Series
Series是一個類似于一維數組的數據結構, 它能夠保存任何類型的數據, 比如整數、 字符串、 浮點數等, 主要由一組數據和與之相關的索引兩
部分構成。
Series的創建
# 導入pandas
import pandas as pd
pd.Series(data=None, index=None, dtype=None)
參數:
data: 傳入的數據, 可以是ndarray、 list等
index: 索引, 必須是唯一的, 且與數據的長度相等。 如果沒有傳入索引參數, 則默認會自動創建一個從0-N的整數索引。
dtype: 數據的類型
通過已有數據創建
指定內容, 默認索引
pd.Series(np.arange(10))
指定索引
pd.Series([6.7,5.6,3,10,2], index=[1,2,3,4,5])
# 運行結果
1 6.7
2 5.6
3 3.0
4 10.0
5 2.0
dtype: float64
通過字典數據創建
color_count = pd.Series({'red':100, 'blue':200, 'green': 500, 'yellow':1000})
color_count
# 運行結果
blue 200
green 500
red 100
yellow 1000
dtype: int64
Series的屬性
為了更方便地操作Series對象中的索引和數據, Series中提供了兩個屬性index和values
index
color_count.index
# 結果
Index(['blue', 'green', 'red', 'yellow'], dtype='object')
values
color_count.values
# 結果
array([ 200, 500, 100, 1000])
也可以使用索引來獲取數據:
color_count[2]
# 結果
100
DataFrame
DataFrame是一個類似于二維數組或表格(如excel)的對象, 既有行索引, 又有列索引
行索引, 表明不同行, 橫向索引, 叫index, 0軸, axis=0
列索引, 表名不同列, 縱向索引, 叫columns, 1軸, axis=1
?DataFrame的創建
# 導入pandas
import pandas as pd
pd.DataFrame(data=None, index=None, columns=None)
參數:
index: 行標簽。 如果沒有傳入索引參數, 則默認會自動創建一個從0-N的整數索引。
columns: 列標簽。 如果沒有傳入索引參數, 則默認會自動創建一個從0-N的整數索引。
通過已有數據創建
舉例一:
pd.DataFrame(np.random.randn(2,3))
舉例二: 創建學生成績表
# 生成10名同學, 5門功課的數據
score = np.random.randint(40, 100, (10, 5))
# 結果
array([[92, 55, 78, 50, 50],
[71, 76, 50, 48, 96],
[45, 84, 78, 51, 68],
[81, 91, 56, 54, 76],
[86, 66, 77, 67, 95],
[46, 86, 56, 61, 99],
[46, 95, 44, 46, 56],
[80, 50, 45, 65, 57],
[41, 93, 90, 41, 97],
[65, 83, 57, 57, 40]])
但是這樣的數據形式很難看到存儲的是什么的樣的數據, 可讀性比較差! !
問題: 如何讓數據更有意義的顯示?
# 使用Pandas中的數據結構
score_df = pd.DataFrame(score)
??增加行、 列索引
# 構造行索引序列
subjects = ["語文", "數學", "英語", "政治", "體育"]
# 構造列索引序列
stu = ['同學' + str(i) for i in range(score_df.shape[0])]
# 添加行索引
data = pd.DataFrame(score, columns=subjects, index=stu)
DataFrame的屬性
shape
data.shape
index
DataFrame的行索引列表
data.index
columns
DataFrame的列索引列表
data.columns
values
直接獲取其中array的值
data.values
array([[92, 55, 78, 50, 50],
[71, 76, 50, 48, 96],
[45, 84, 78, 51, 68],
[81, 91, 56, 54, 76],
[86, 66, 77, 67, 95],
[46, 86, 56, 61, 99],
[46, 95, 44, 46, 56],
[80, 50, 45, 65, 57],
[41, 93, 90, 41, 97],
[65, 83, 57, 57, 40]])
T
轉置
data.T
head(5): 顯示前5行內容
如果不補充參數, 默認5行。 填入參數N則顯示前N行
data.head(5)
tail(5):顯示后5行內容
98
如果不補充參數, 默認5行。 填入參數N則顯示后N行
data.tail(5)
DatatFrame索引的設置
修改行列索引值
stu = ["學生_" + str(i) for i in range(score_df.shape[0])]
# 必須整體全部修改
data.index = stu
注意: 以下修改方式是錯誤的
# 錯誤修改方式
data.index[3] = '學生_3'
重設索引
reset_index(drop=False)
設置新的下標索引
drop:默認為False, 不刪除原來索引, 如果為True,刪除原來的索引值
# 重置索引,drop=False
data.reset_index()
# 重置索引,drop=True
data.reset_index(drop=True)
以某列值設置為新的索引
set_index(keys, drop=True)
keys : 列索引名成或者列索引名稱的列表
drop : boolean, default True.當做新的索引, 刪除原來的列
設置新索引案例
1、 創建
df = pd.DataFrame({'month': [1, 4, 7, 10],
'year': [2012, 2014, 2013, 2014],
'sale':[55, 40, 84, 31]})
month sale year
0 1 55 2012
1 4 40 2014
2 7 84 2013
3 10 31 2014
2、 以月份設置新的索引
df.set_index('month')
sale year
month
1 55 2012
4 40 2014
7 84 2013
10 31 2014
3、 設置多個索引, 以年和月份
df = df.set_index(['year', 'month'])
df
sale
year month
2012 1 55
2014 4 40
2013 7 84
2014 10 31
注: 通過剛才的設置, 這樣DataFrame就變成了一個具有MultiIndex的DataFrame。
MultiIndex
注: Pandas從版本0.20.0開始棄用panel: 推薦的用于表示3D數據的方法是通過DataFrame上的MultiIndex方法
MultiIndex是三維的數據結構;
多級索引( 也稱層次化索引) 是pandas的重要功能, 可以在Series、 DataFrame對象上擁有2個以及2個以上的索引。
multiIndex的特性
打印剛才的df的行索引結果
df.index
MultiIndex(levels=[[2012, 2013, 2014], [1, 4, 7, 10]],
labels=[[0, 2, 1, 2], [0, 1, 2, 3]],
names=['year', 'month'])
多級或分層索引對象。
index屬性
names:levels的名稱
levels: 每個level的元組值
df.index.names
# FrozenList(['year', 'month'])
df.index.levels
# FrozenList([[1, 2], [1, 4, 7, 10]])
multiIndex的創建
arrays = [[1, 1, 2, 2], ['red', 'blue', 'red', 'blue']]
pd.MultiIndex.from_arrays(arrays, names=('number', 'color'))
# 結果
MultiIndex(levels=[[1, 2], ['blue', 'red']],
codes=[[0, 0, 1, 1], [1, 0, 1, 0]],
names=['number', 'color'])
基本數據操作
# 讀取文件
data = pd.read_csv("./data/stock_day.csv")
# 刪除一些列, 讓數據更簡單些, 再去做后面的操作
data = data.drop(["ma5","ma10","ma20","v_ma5","v_ma10","v_ma20"], axis=1)
1 索引操作
Numpy當中我們已經講過使用索引選取序列和切片選擇, pandas也支持類似的操作, 也可以直接使用列名、 行名稱, 甚至組合使用。
1.1 直接使用行列索引(先列后行)
獲取'2018-02-27'這天的'close'的結果
# 直接使用行列索引名字的方式( 先列后行)
data['open']['2018-02-27']
23.53
# 不支持的操作
# 錯誤
data['2018-02-27']['open']
# 錯誤
data[:1, :2]
1.2 結合loc或者iloc使用索引
獲取從'2018-02-27':'2018-02-22', 'open'的結果
# 使用loc:只能指定行列索引的名字
data.loc['2018-02-27':'2018-02-22', 'open']
2018-02-27 23.53
2018-02-26 22.80
2018-02-23 22.88
Name: open, dtype: float64
# 使用iloc可以通過索引的下標去獲取
# 獲取前3天數據,前5列的結果
data.iloc[:3, :5]
open high close low
2018-02-27 23.53 25.88 24.16 23.53
2018-02-26 22.80 23.78 23.53 22.80
2018-02-23 22.88 23.37 22.82 22.71
1.3 使用ix組合索引
Warning:Starting in 0.20.0, the .ix indexer is deprecated, in favor of the more strict .iloc and .loc indexers.
獲取行第1天到第4天, ['open', 'close', 'high', 'low']這個四個指標的結果
# 使用ix進行下表和名稱組合做引
data.ix[0:4, ['open', 'close', 'high', 'low']]
# 推薦使用loc和iloc來獲取的方式
data.loc[data.index[0:4], ['open', 'close', 'high', 'low']]
data.iloc[0:4, data.columns.get_indexer(['open', 'close', 'high', 'low'])]
open close high low
2018-02-27 23.53 24.16 25.88 23.53
2018-02-26 22.80 23.53 23.78 22.80
2018-02-23 22.88 22.82 23.37 22.71
2018-02-22 22.25 22.28 22.76 22.02
賦值操作
對DataFrame當中的close列進行重新賦值為1
# 直接修改原來的值
data['close'] = 1
# 或者
data.close = 1
3 排序
排序有兩種形式, 一種對于索引進行排序, 一種對于內容進行排序
3.1 DataFrame排序
使用df.sort_values(by=, ascending=)
單個鍵或者多個鍵進行排序,
參數:
by: 指定排序參考的鍵
ascending:默認升序
ascending=False:降序
ascending=True:升序
# 按照開盤價大小進行排序 , 使用ascending指定按照大小排序
data.sort_values(by="open", ascending=True).head()
# 按照多個鍵進行排序
data.sort_values(by=['open', 'high'])
使用df.sort_index給索引進行排序
這個股票的日期索引原來是從大到小, 現在重新排序, 從小到大
# 對索引進行排序
data.sort_index()
3.2 Series排序
使用series.sort_values(ascending=True)進行排序
series排序時, 只有一列, 不需要參數
data['p_change'].sort_values(ascending=True).head()
2015-09-01 -10.03
2015-09-14 -10.02
2016-01-11 -10.02
2015-07-15 -10.02
2015-08-26 -10.01
Name: p_change, dtype: float64
使用series.sort_index()進行排序
與df一致
# 對索引進行排序
data['p_change'].sort_index().head()
2015-03-02 2.62
2015-03-03 1.44
2015-03-04 1.57
2015-03-05 2.02
2015-03-06 8.51
Name: p_change, dtype: float64
DataFrame運算
1 算術運算
add(other)
比如進行數學運算加上具體的一個數字
data['open'].add(1)
2018-02-27 24.53
2018-02-26 23.80
2018-02-23 23.88
2018-02-22 23.25
2018-02-14 22.49
sub(other)
2 邏輯運算
2.1 邏輯運算符號
例如篩選data["open"] > 23的日期數據
data["open"] > 23返回邏輯結果
data["open"] > 23
2018-02-27 True
2018-02-26 False
2018-02-23 False
2018-02-22 False
2018-02-14 False
# 邏輯判斷的結果可以作為篩選的依據
data[data["open"] > 23].head()
完成多個邏輯判斷
data[(data["open"] > 23) & (data["open"] < 24)].head()
2.2 邏輯運算函數
query(expr)
expr:查詢字符串
通過query使得剛才的過程更加方便簡單
data.query("open<24 & open>23").head()
isin(values)
例如判斷'open'是否為23.53和23.85
# 可以指定值進行一個判斷, 從而進行篩選操作
data[data["open"].isin([23.53, 23.85])]
3 統計運算
3.1 describe
綜合分析: 能夠直接得出很多統計結果, count , mean , std , min , max 等
# 計算平均值、 標準差、 最大值、 最小值
data.describe()
3.2 統計函數
對于單個函數去進行統計的時候, 坐標軸還是按照默認列“columns” (axis=0, default), 如果要對行“index” 需要指定(axis=1)
max()、 min()
# 使用統計函數: 0 代表列求結果, 1 代表行求統計結果
data.max(0)
open 34.99
high 36.35
close 35.21
low 34.01
volume 501915.41
price_change 3.03
p_change 10.03
turnover 12.56
my_price_change 3.41
dtype: float64
std()、 var()
# 方差
data.var(0)
open 1.545255e+01
high 1.662665e+01
close 1.554572e+01
low 1.437902e+01
volume 5.458124e+09
price_change 8.072595e-01
p_change 1.664394e+01
turnover 4.323800e+00
my_price_change 6.409037e-01
dtype: float64
# 標準差
data.std(0)
open 3.930973
high 4.077578
close 3.942806
low 3.791968
volume 73879.119354
price_change 0.898476
p_change 4.079698
turnover 2.079375
my_price_change 0.800565
dtype: float64
median(): 中位數
中位數為將數據從小到大排列, 在最中間的那個數為中位數。 如果沒有中間數, 取中間兩個數的平均值。
idxmax()、 idxmin()
# 求出最大值的位置
data.idxmax(axis=0)
open 2015-06-15
high 2015-06-10
close 2015-06-12
low 2015-06-12
volume 2017-10-26
price_change 2015-06-09
p_change 2015-08-28
turnover 2017-10-26
my_price_change 2015-07-10
dtype: object
# 求出最小值的位置
data.idxmin(axis=0)
open 2015-03-02
high 2015-03-02
close 2015-09-02
low 2015-03-02
volume 2016-07-06
price_change 2015-06-15
p_change 2015-09-01
turnover 2016-07-06
my_price_change 2015-06-15
dtype: object
3.3 累計統計函數
以上這些函數可以對series和dataframe操作
這里我們按照時間的從前往后來進行累計
排序
# 排序之后, 進行累計求和
data = data.sort_index()
對p_change進行求和
stock_rise = data['p_change']
# plot方法集成了前面直方圖、 條形圖、 餅圖、 折線圖
stock_rise.cumsum()
2015-03-02 2.62
2015-03-03 4.06
2015-03-04 5.63
2015-03-05 7.65
2015-03-06 16.16
2015-03-09 16.37
2015-03-10 18.75
2015-03-11 16.36
2015-03-12 15.03
2015-03-13 17.58
2015-03-16 20.34
2015-03-17 22.42
2015-03-18 23.28
2015-03-19 23.74
2015-03-20 23.48
2015-03-23 23.74
使用plot函數畫圖使得結果直觀, 需要導入matplotlib.
import matplotlib.pyplot as plt
# plot顯示圖形
stock_rise.cumsum().plot()
# 需要調用show, 才能顯示出結果
plt.show()
4 自定義運算
apply(func, axis=0)
func:自定義函數
axis=0:默認是列, axis=1為行進行運算
定義一個對列, 最大值-最小值的函數
data[['open', 'close']].apply(lambda x: x.max() - x.min(), axis=0)
open 22.74
close 22.85
dtype: float64
后續知識點請看:
機器學習入門:準備知識筆記(pandas)之二
總結
以上是生活随笔為你收集整理的机器学习入门:准备知识笔记(pandas)之一的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL server数据库中双引号(英文
- 下一篇: MT6323详细芯片资料分享 MT632