【機(jī)器學(xué)習(xí)】嘿馬機(jī)器學(xué)習(xí)(科學(xué)計(jì)算庫(kù))第10篇:Pandas,5.8 高級(jí)處理-數(shù)據(jù)離散化【附代碼文檔】

??????教程全知識(shí)點(diǎn)簡(jiǎn)介:1.機(jī)器學(xué)習(xí)常用科學(xué)計(jì)算庫(kù)包括基礎(chǔ)定位、目標(biāo)。2. 人工智能概述涵蓋人工智能應(yīng)用場(chǎng)景、人工智能小案例、人工智能發(fā)展必備三要素、人工智能機(jī)器學(xué)習(xí)和深度學(xué)習(xí)。3. 機(jī)器學(xué)習(xí)概述包括機(jī)器學(xué)習(xí)工作流程、什么是機(jī)器學(xué)習(xí)、模型評(píng)估(回歸模型評(píng)估、擬合)、Azure機(jī)器學(xué)習(xí)模型搭建、完整機(jī)器學(xué)習(xí)項(xiàng)目流程。4. 機(jī)器學(xué)習(xí)基礎(chǔ)環(huán)境安裝與使用包括Jupyter Notebook使用(一級(jí)標(biāo)題、Jupyter Notebook中自動(dòng)補(bǔ)全代碼等相關(guān)功能拓展)。5. Matplotlib可視化涵蓋Matplotlib HelloWorld(什么是Matplotlib、實(shí)現(xiàn)簡(jiǎn)單Matplotlib畫圖折線圖、畫出溫度變化圖、準(zhǔn)備數(shù)據(jù)、創(chuàng)建畫布、繪制折線圖、顯示圖像、構(gòu)造x軸刻度標(biāo)簽、修改坐標(biāo)刻度顯示、設(shè)置中文字體、設(shè)置正常顯示符號(hào)、保存圖片)、添加坐標(biāo)軸刻度、添加網(wǎng)格顯示、添加描述信息、圖像保存、設(shè)置圖形風(fēng)格、常見(jiàn)圖形繪制(常見(jiàn)圖形種類意義、散點(diǎn)圖繪制)。6. Numpy包括Numpy優(yōu)勢(shì)、N維數(shù)組ndarray(ndarray屬性)、基本操作(生成數(shù)組方法、生成0和1數(shù)組、從現(xiàn)有數(shù)組生成、創(chuàng)建符合正態(tài)分布股某票漲跌幅數(shù)據(jù))、數(shù)組間運(yùn)算(數(shù)組與數(shù)的運(yùn)算)。7. Pandas數(shù)據(jù)結(jié)構(gòu)包括Series、DataFrame。8. 文件讀取與存儲(chǔ)涵蓋CSV(read_csv)、HDF(read_hdf與to_hdf)、JSON(read_josn)。9. 高級(jí)處理數(shù)據(jù)離散化包括為什么要離散化、什么是數(shù)據(jù)離散化、股某票漲跌幅離散化(讀取股某票數(shù)據(jù)、將股某票漲跌幅數(shù)據(jù)進(jìn)行分組、股某票漲跌幅分組數(shù)據(jù)變成one_hot編碼)、案例實(shí)現(xiàn)。


????倉(cāng)庫(kù)code.zip ??直接-->:???https://gitlab.com/yinuo_112/AI/-/blob/main/機(jī)器學(xué)習(xí)/嘿馬機(jī)器學(xué)習(xí)(科學(xué)計(jì)算庫(kù))/note.md ???????

? 本教程項(xiàng)目亮點(diǎn)

?? 知識(shí)體系完整:覆蓋從基礎(chǔ)原理、核心方法到高階應(yīng)用的全流程內(nèi)容
?? 全技術(shù)鏈覆蓋:完整前后端技術(shù)棧,涵蓋開(kāi)發(fā)必備技能
?? 從零到實(shí)戰(zhàn):適合 0 基礎(chǔ)入門到提升,循序漸進(jìn)掌握核心能力
?? 豐富文檔與代碼示例:涵蓋多種場(chǎng)景,可運(yùn)行、可復(fù)用
?? 工作與學(xué)習(xí)雙參考:不僅適合系統(tǒng)化學(xué)習(xí),更可作為日常開(kāi)發(fā)中的查閱手冊(cè)
?? 模塊化知識(shí)結(jié)構(gòu):按知識(shí)點(diǎn)分章節(jié),便于快速定位和復(fù)習(xí)
?? 長(zhǎng)期可用的技術(shù)積累:不止一次學(xué)習(xí),而是能伴隨工作與項(xiàng)目長(zhǎng)期參考


??????全教程總章節(jié)


??????本篇主要內(nèi)容

Pandas

學(xué)習(xí)目標(biāo)

  • 了解Numpy與Pandas的不同
  • 說(shuō)明Pandas的Series與Dataframe兩種結(jié)構(gòu)的區(qū)別
  • 了解Pandas的MultiIndex與panel結(jié)構(gòu)
  • 應(yīng)用Pandas實(shí)現(xiàn)基本數(shù)據(jù)操作
  • 應(yīng)用Pandas實(shí)現(xiàn)數(shù)據(jù)的合并
  • 應(yīng)用crosstab和pivot_table實(shí)現(xiàn)交叉表與透視表
  • 應(yīng)用groupby和聚合函數(shù)實(shí)現(xiàn)數(shù)據(jù)的分組與聚合
  • 了解Pandas的plot畫圖功能
  • 應(yīng)用Pandas實(shí)現(xiàn)數(shù)據(jù)的讀取和存儲(chǔ)

5.8 高級(jí)處理-數(shù)據(jù)離散化

學(xué)習(xí)目標(biāo)

  • 目標(biāo)

    • 應(yīng)用cut、qcut實(shí)現(xiàn)數(shù)據(jù)的區(qū)間分組
    • 應(yīng)用get_dummies實(shí)現(xiàn)數(shù)據(jù)的one-hot編碼

1 為什么要離散化

連續(xù)屬性離散化的目的是為了簡(jiǎn)化數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)離散化技術(shù)可以用來(lái)減少給定連續(xù)屬性值的個(gè)數(shù)。離散化方法經(jīng)常作為數(shù)據(jù)挖掘的工具。

2 什么是數(shù)據(jù)的離散化

連續(xù)屬性的離散化就是在連續(xù)屬性的值域上,將值域劃分為若干個(gè)離散的區(qū)間,最后用不同的符號(hào)或整數(shù) 值代表落在每個(gè)子區(qū)間中的屬性值。

離散化有很多種方法,這使用一種最簡(jiǎn)單的方式去操作

  • 原始人的身高數(shù)據(jù):165,174,160,180,159,163,192,184
  • 假設(shè)按照身高分幾個(gè)區(qū)間段:150~165, 165180,180195

這樣 將數(shù)據(jù)分到了三個(gè)區(qū)間段,我可以對(duì)應(yīng)的標(biāo)記為矮、中、高三個(gè)類別,最終要處理成一個(gè)"啞變量"矩陣

3 股某票的漲跌幅離散化

對(duì)股某票每日的"p_change"進(jìn)行離散化

3.1 讀取股某票的數(shù)據(jù)

先讀取股某票的數(shù)據(jù),篩選出p_change數(shù)據(jù)

data = pd.read_csv("./data/stock_day.csv")
p_change= data['p_change']

3.2 將股某票漲跌幅數(shù)據(jù)進(jìn)行分組

使用的工具:

  • pd.qcut(data, q):

    • 對(duì)數(shù)據(jù)進(jìn)行分組將數(shù)據(jù)分組,一般會(huì)與value_counts搭配使用,統(tǒng)計(jì)每組的個(gè)數(shù)
  • series.value_counts():統(tǒng)計(jì)分組次數(shù)

  
  
# 自行分組
  
  
qcut = pd.qcut(p_change, 10)
  
  
# 計(jì)算分到每個(gè)組數(shù)據(jù)個(gè)數(shù)
  
  
qcut.value_counts()

自定義區(qū)間分組:

  • pd.cut(data, bins)
  
  
# 自己指定分組區(qū)間
  
  
bins = [-100, -7, -5, -3, 0, 3, 5, 7, 100]
p_counts = pd.cut(p_change, bins)

3.3 股某票漲跌幅分組數(shù)據(jù)變成one-hot編碼

  • 什么是one-hot編碼

把每個(gè)類別生成一個(gè)布爾列,這些列中只有一列可以為這個(gè)樣本取值為1.其又被稱為獨(dú)熱編碼。

把下圖中左邊的表格轉(zhuǎn)化為使用右邊形式進(jìn)行表示:

  • pandas.get_dummies(data, prefix=None)

    • data:array-like, Series, or DataFrame

    • prefix:分組名字

  
  
# 得出one-hot編碼矩陣
  
  
dummies = pd.get_dummies(p_counts, prefix="rise")

4 小結(jié)

  • 數(shù)據(jù)離散化【知道】

    • 可以用來(lái)減少給定連續(xù)屬性值的個(gè)數(shù)
    • 在連續(xù)屬性的值域上,將值域劃分為若干個(gè)離散的區(qū)間,最后用不同的符號(hào)或整數(shù)值代表落在每個(gè)子區(qū)間中的屬性值。
  • qcut、cut實(shí)現(xiàn)數(shù)據(jù)分組【知道】

    • qcut:大致分為相同的幾組
    • cut:自定義分組區(qū)間
  • get_dummies實(shí)現(xiàn)啞變量矩陣【知道】

5.9 高級(jí)處理-合并

學(xué)習(xí)目標(biāo)

  • 目標(biāo)

    • 應(yīng)用pd.concat實(shí)現(xiàn)數(shù)據(jù)的合并
    • 應(yīng)用pd.merge實(shí)現(xiàn)數(shù)據(jù)的合并

如果你的數(shù)據(jù)由多張表組成,那么有時(shí)候需要將不同的內(nèi)容合并在一起分析

1 pd.concat實(shí)現(xiàn)數(shù)據(jù)合并

  • pd.concat([data1, data2], axis=1)

    • 按照行或列進(jìn)行合并,axis=0為列索引,axis=1為行索引

比如 將剛才處理好的one-hot編碼與原數(shù)據(jù)合并

  
  
# 按照行索引進(jìn)行
  
  
pd.concat([data, dummies], axis=1)

2 pd.merge

  • pd.merge(left, right, how='inner', on=None)

    • 可以指定按照兩組數(shù)據(jù)的共同鍵值對(duì)合并或者左右各自
    • left: DataFrame
    • right: 另一個(gè)DataFrame
    • on: 指定的共同鍵
    • how:按照什么方式連接
Merge method SQL Join Name Description
left LEFT OUTER JOIN Use keys from left frame only
right RIGHT OUTER JOIN Use keys from right frame only
outer FULL OUTER JOIN Use union of keys from both frames
inner INNER JOIN Use intersection of keys from both frames

2.1 pd.merge合并

left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                        'key2': ['K0', 'K1', 'K0', 'K1'],
                        'A': ['A0', 'A1', 'A2', 'A3'],
                        'B': ['B0', 'B1', 'B2', 'B3']})

right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                        'key2': ['K0', 'K0', 'K0', 'K0'],
                        'C': ['C0', 'C1', 'C2', 'C3'],
                        'D': ['D0', 'D1', 'D2', 'D3']})

  
  
# 默認(rèn)內(nèi)連接
  
  
result = pd.merge(left, right, on=['key1', 'key2'])
  • 左連接
result = pd.merge(left, right, how='left', on=['key1', 'key2'])
  • 右連接
result = pd.merge(left, right, how='right', on=['key1', 'key2'])
  • 外鏈接
result = pd.merge(left, right, how='outer', on=['key1', 'key2'])

3 總結(jié)

  • pd.concat([數(shù)據(jù)1, 數(shù)據(jù)2], axis=**)【知道】

  • pd.merge(left, right, how=, on=)【知道】

    • how -- 以何種方式連接
    • on -- 連接的鍵的依據(jù)是哪幾個(gè)

5.10 高級(jí)處理-交叉表與透視表

學(xué)習(xí)目標(biāo)

  • 目標(biāo)

    • 應(yīng)用crosstab和pivot_table實(shí)現(xiàn)交叉表與透視表

1 交叉表與透視表什么作用

探究股某票的漲跌與星期幾有關(guān)?

以下圖當(dāng)中表示,week代表星期幾,1,0代表這一天股某票的漲跌幅是好還是壞,里面的數(shù)據(jù)代表比例

可以理解為所有時(shí)間為星期一等等的數(shù)據(jù)當(dāng)中漲跌幅好壞的比例

  • 交叉表:交叉表用于計(jì)算一列數(shù)據(jù)對(duì)于另外一列數(shù)據(jù)的分組個(gè)數(shù)(用于統(tǒng)計(jì)分組頻率的特殊透視表)

    • pd.crosstab(value1, value2)
  • 透視表:透視表是將原有的DataFrame的列分別作為行索引和列索引,然后對(duì)指定的列應(yīng)用聚集函數(shù)

    • data.pivot_table()
    • DataFrame.pivot_table([], index=[])

2 案例分析

2.1 數(shù)據(jù)準(zhǔn)備

  • 準(zhǔn)備兩列數(shù)據(jù),星期數(shù)據(jù)以及漲跌幅是好是壞數(shù)據(jù)
  • 進(jìn)行交叉表計(jì)算

Starlette 文檔

  
  
# 尋找星期幾跟股某票張得的關(guān)系
  
  
  
  
# 1、先把對(duì)應(yīng)的日期找到星期幾
  
  
date = pd.to_datetime(data.index).weekday
data['week'] = date

  
  
# 2、假如把p_change按照大小去分個(gè)類0為界限
  
  
data['posi_neg'] = np.where(data['p_change'] > 0, 1, 0)

  
  
# 通過(guò)交叉表找尋兩列數(shù)據(jù)的關(guān)系
  
  
count = pd.crosstab(data['week'], data['posi_neg'])

Python-dotenv 文檔

但是 看到count只是每個(gè)星期日子的好壞天數(shù),并沒(méi)有得到比例,該怎么去做?

  • 對(duì)于每個(gè)星期一等的總天數(shù)求和,運(yùn)用除法運(yùn)算求出比例
  
  
# 算數(shù)運(yùn)算,先求和
  
  
sum = count.sum(axis=1).astype(np.float32)

  
  
# 進(jìn)行相除操作,得出比例
  
  
pro = count.div(sum, axis=0)

2.2 查看效果

使用plot畫出這個(gè)比例,使用stacked的柱狀圖

pro.plot(kind='bar', stacked=True)
plt.show()

2.3 使用pivot_table(透視表)實(shí)現(xiàn)

使用透視表,剛才的過(guò)程更加簡(jiǎn)單

  
  
# 通過(guò)透視表,將整個(gè)過(guò)程變成更簡(jiǎn)單一些
  
  
data.pivot_table(['posi_neg'], index='week')

3 小結(jié)

  • 交叉表與透視表的作用【知道】

    • 交叉表:計(jì)算一列數(shù)據(jù)對(duì)于另外一列數(shù)據(jù)的分組個(gè)數(shù)
    • 透視表:指定某一列對(duì)另一列的關(guān)系

5.11 高級(jí)處理-分組與聚合

學(xué)習(xí)目標(biāo)

  • 目標(biāo)

    • 應(yīng)用groupby和聚合函數(shù)實(shí)現(xiàn)數(shù)據(jù)的分組與聚合

分組與聚合通常是分析數(shù)據(jù)的一種方式,通常與一些統(tǒng)計(jì)函數(shù)一起使用,查看數(shù)據(jù)的分組情況

想一想其實(shí)剛才的交叉表與透視表也有分組的功能,所以算是分組的一種形式,只不過(guò)他們主要是計(jì)算次數(shù)或者計(jì)算比例??!看其中的效果:

![](https://upload-images.jianshu.io/uplo

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容