机器学习学习笔记(三)

5 Pandas

5.1 Pandas介绍

5.1.1 定义

专门用于数据挖掘的开源python库
以Numpy为基础,借力Numpy模块在计算方面性能高的优势
基于matplotlib,能够简便的画图
独特的数据结构

5.1.2 为什么使用Pandas
  1. 增强图表可读性
    在这里插入图片描述
  2. 便捷的数据处理能力
    在这里插入图片描述
  3. 读取文件方便
  4. 封装了Matplotlib、Numpy的画图和计算

增加列索引
在这里插入图片描述

5.1.3 案例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.1.4 Pandas数据结构

Pandas中一共有三种数据结构,分别为:Series、DataFrame和MultiIndex(老版本中叫Panel )。其中Series是一维数据结构,DataFrame是二维的表格型数据结构,MultiIndex是三维的数据结构。

5.1.4.1 Series
  1. Series是一个类似于一维数组的数据结构,它能够保存任何类型的数据,比如整数、字符串、浮点数等,主要由一组数据和与之相关的索引两部分构成。
    在这里插入图片描述
  2. 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])

在这里插入图片描述

# 通过字典数据创建
color_count = pd.Series({'red':100, 'blue':200, 'green': 500, 'yellow':1000})
color_count

在这里插入图片描述
3. Series的属性
为了更方便地操作Series对象中的索引和数据,Series中提供了两个属性index和values.

color_count.index

# 结果
Index(['blue', 'green', 'red', 'yellow'], dtype='object')
color_count.values

# 结果
array([ 200,  500,  100, 1000])
# 也可以使用索引来获取数据:
color_count[2]

# 结果
100
5.1.4.2 DataFrame
  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))

在这里插入图片描述
在这里插入图片描述
2. 增加行、列索引

# 构造行索引序列
subjects = ["语文", "数学", "英语", "政治", "体育"]

# 构造列索引序列
stu = ['同学' + str(i) for i in range(score_df.shape[0])]

# 添加行索引
data = pd.DataFrame(score, columns=subjects, index=stu)

在这里插入图片描述
3. DataFrame的属性

data.shape

# 结果
(10, 5)
  1. DataFrame的行索引列表
data.index

# 结果
Index(['同学0', '同学1', '同学2', '同学3', '同学4', '同学5', '同学6', '同学7', '同学8', '同学9'], dtype='object')
  1. DataFrame的列索引列表
data.columns

# 结果
Index(['语文', '数学', '英语', '政治', '体育'], dtype='object')
  1. 直接获取其中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]])
  1. 转置
data.T

在这里插入图片描述
8. head(5):显示前5行内容
如果不补充参数,默认5行。填入参数N则显示前N行

data.head(5)

在这里插入图片描述
9. tail(5):显示后5行内容
如果不补充参数,默认5行。填入参数N则显示后N行

data.tail(5)

在这里插入图片描述

5.1.4.3 DatatFrame索引的设置
  1. 修改行列索引值
stu = ["学生_" + str(i) for i in range(score_df.shape[0])]

# 必须整体全部修改
data.index = stu

# 注意:以下修改方式是错误的
# 错误修改方式
data.index[3] = '学生_3'
  1. 重设索引
    reset_index(drop=False)
    设置新的下标索引
    drop:默认为False,不删除原来索引,如果为True,删除原来的索引值
# 重置索引,drop=False
data.reset_index()

在这里插入图片描述

# 重置索引,drop=True
data.reset_index(drop=True)

在这里插入图片描述
3. 以某列值设置为新的索引
set_index(keys, drop=True)
keys : 列索引名成或者列索引名称的列表
drop : boolean, default True.当做新的索引,删除原来的列

df = pd.DataFrame({'month': [1, 4, 7, 10],
                    'year': [2012, 2014, 2013, 2014],
                    'sale':[55, 40, 84, 31]})

在这里插入图片描述
以月份设置新的索引

df.set_index('month')

在这里插入图片描述
设置多个索引,以年和月份

df = df.set_index(['year', 'month'])
df

在这里插入图片描述
注:通过刚才的设置,这样DataFrame就变成了一个具有MultiIndex的DataFrame。

5.2 基本数据操作

读取一个真实的股票数据

import pandas as pd
# 读取文件
stock_data = pd.read_csv("/Users/lijianhua/Documents/研究生live/百度网盘下载/阶段5-人工智能经典算法编程/机器学习day03/2.code/data/stock_day.csv")
stock_data.head()

在这里插入图片描述

# 删除一些列,让数据更简单些,再去做后面的操作
stock_data = stock_data.drop(["ma5","ma10","ma20","v_ma5","v_ma10","v_ma20"], axis=1)
stock_data.head()

在这里插入图片描述

5.2.1 索引操作
  1. 直接使用行列索引**(先列后行)**
# 直接使用行列索引名字的方式(先列后行)
data['open']['2018-02-27']
23.53

# 不支持的操作
# 错误
data['2018-02-27']['open']
# 错误
data[:1, :2]
  1. 结合loc或者iloc使用索引
# 使用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. 使用ix组合索引
    获取行第1天到第4天,[‘open’, ‘close’, ‘high’, ‘low’]这个四个指标的结果
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
5.2.2 赋值操作

对DataFrame当中的close列进行重新赋值为1

# 直接修改原来的值
data['close'] = 1
# 或者
data.close = 1

在这里插入图片描述

5.2.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'])
  1. Series排序
    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
# 对索引进行排序
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

5.3 DataFrame运算

5.3.1 算术运算

在这里插入图片描述

5.3.2 逻辑运算
  1. 逻辑运算符号
# 筛选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. 逻辑运算函数

data.query("open<24 & open>23").head()

在这里插入图片描述

# 可以指定值进行一个判断,从而进行筛选操作
data[data["open"].isin([23.53, 23.85])]

在这里插入图片描述

5.3.3 统计运算
  1. 综合分析: 能够直接得出很多统计结果,总行数count, 平均值mean, 标准值std, 最小值min, 最大值max 等
data.describe()

在这里插入图片描述
2. median:中位数(中位数为将数据从小到大排列,在最中间的那个数为中位数。如果没有中间数,取中间两个数的平均值。)、mode:众数、abs绝对值、prod乘积、std标准值、var方差、idxmax最大值索引、idxmin最小值索引
在这里插入图片描述
3. 对于单个函数去进行统计的时候,坐标轴还是按照默认列“columns” (axis=0, default),如果要对行“index” 需要指定(axis=1)

# 使用统计函数: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

# 方差
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
df = pd.DataFrame({'COL1' : [2,3,4,5,4,2],
                   'COL2' : [0,1,2,3,4,2]})

df.median()

COL1    3.5
COL2    2.0
dtype: float64
# 求出最大值的位置
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

5.3.4 累计统计函数

函数 作用
cumsum 计算前1/2/3/…/n个数的和
cummax 计算前1/2/3/…/n个数的最大值
cummin 计算前1/2/3/…/n个数的最小值
cumprod 计算前1/2/3/…/n个数的积

# 排序之后,进行累计求和. 索引排序
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
import matplotlib.pyplot as plt
# plot显示图形
stock_rise.cumsum().plot()
# 需要调用show,才能显示出结果
plt.show()

在这里插入图片描述

5.3.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

5.4 Pandas画图

DataFrame.plot(kind=‘line’)
kind : str,需要绘制图形的种类
‘line’ : line plot (default)折线图
‘bar’ : vertical bar plot垂直条形图
‘barh’ : horizontal bar plot条形图翻转,水平条形图
关于“barh”的解释:
http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.plot.barh.html
‘hist’ : histogram直方图
‘pie’ : pie plot饼图
‘scatter’ : scatter plot散点图
更多细节:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.plot.html

5.5 文件读取与存储

5.5.1 read_csv

pandas.read_csv(filepath_or_buffer, sep =‘,’, usecols )
filepath_or_buffer:文件路径
sep :分隔符,默认用","隔开
usecols:指定读取的列名,列表形式

# 读取文件,并且指定只获取'open', 'close'指标
data = pd.read_csv("/Users/lijianhua/Documents/研究生live/百度网盘下载/阶段5-人工智能经典算法编程/机器学习day03/2.code/data/stock_day.csv", 
                   usecols=['open', 'close'])
data.head()

open    close
2018-02-27    23.53    24.16
2018-02-26    22.80    23.53
2018-02-23    22.88    22.82
2018-02-22    22.25    22.28
2018-02-14    21.49    21.92
5.5.2 to_csv

DataFrame.to_csv(path_or_buf=None, sep=', ’, columns=None, header=True, index=True, mode=‘w’, encoding=None)
path_or_buf :文件路径
sep :分隔符,默认用","隔开
columns :选择需要的列索引
header :boolean or list of string, default True,是否写进列索引值
index:是否写进行索引
mode:‘w’:重写, ‘a’ 追加

# 保存'open'列的数据,然后读取查看结果
data[:10].to_csv("./data/test.csv", columns=['open'])

# 读取,查看结果
pd.read_csv("./data/test.csv")

     Unnamed: 0    open
0    2018-02-27    23.53
1    2018-02-26    22.80
2    2018-02-23    22.88
3    2018-02-22    22.25
4    2018-02-14    21.49
5    2018-02-13    21.40
6    2018-02-12    20.70
7    2018-02-09    21.20
8    2018-02-08    21.79
9    2018-02-07    22.69

./data/test.csv中数据样式:
在这里插入图片描述
会发现将索引存入到文件当中,变成单独的一列数据。如果需要删除,可以指定index参数,删除原来的文件,重新保存一次。

# index:存储不会讲索引值变成一列数据
data[:10].to_csv("./data/test.csv", columns=['open'], index=False)

在这里插入图片描述

在这里插入代码片
5.5.3 read_hdf与to_hdf

HDF5文件的读取和存储需要指定一个键,值为要存储的DataFrame
pandas.read_hdf(path_or_buf,key =None,** kwargs)
从h5文件当中读取数据
path_or_buffer:文件路径
key:读取的键
return:Theselected object
DataFrame.to_hdf(path_or_buf, key, \kwargs)

# 读取文件
day_close = pd.read_hdf("/Users/lijianhua/Documents/研究生live/百度网盘下载/阶段5-人工智能经典算法编程/机器学习day03/2.code/data/stock_data/day/day_close.h5")
day_close.head()

在这里插入图片描述

day_close.to_hdf("./data/test.h5", key="day_close")
new_close = pd.read_hdf("./data/test.h5", key="day_close")
new_close.head()

在这里插入图片描述

5.5.4 read_json

pandas.read_json(path_or_buf=None, orient=None, typ=‘frame’, lines=False)
将JSON格式准换成默认的Pandas DataFrame格式
orient : string,Indication of expected JSON string format.
‘split’ : dict like {index -> [index], columns -> [columns], data -> [values]}
split 将索引总结到索引,列名到列名,数据到数据。将三部分都分开了
‘records’ : list like [{column -> value}, … , {column -> value}]
records 以columns:values的形式输出
‘index’ : dict like {index -> {column -> value}}
index 以index:{columns:values}…的形式输出
‘columns’ : dict like {column -> {index -> value}},默认该格式
colums 以columns:{index:values}的形式输出
‘values’ : just the values array
values 直接输出值
lines : boolean, default False
按照每行读取json对象
typ : default ‘frame’, 指定转换成的对象类型series或者dataframe

5.5.5 read_josn 案例

这里使用一个新闻标题讽刺数据集,格式为json。is_sarcastic:1讽刺的,否则为0;headline:新闻报道的标题;article_link:链接到原始新闻文章。存储格式为:

{"article_link": "https://www.huffingtonpost.com/entry/versace-black-code_us_5861fbefe4b0de3a08f600d5", "headline": "former versace store clerk sues over secret 'black code' for minority shoppers", "is_sarcastic": 0}
{"article_link": "https://www.huffingtonpost.com/entry/roseanne-revival-review_us_5ab3a497e4b054d118e04365", "headline": "the 'roseanne' revival catches up to our thorny political mood, for better and worse", "is_sarcastic": 0}
# 读取 orient指定存储的json格式,lines指定按照行去变成一个样本
json_read = pd.read_json("/Users/lijianhua/Documents/研究生live/百度网盘下载/阶段5-人工智能经典算法编程/机器学习day03/2.code/data/Sarcasm_Headlines_Dataset.json", orient="records", lines=True)
json_read

在这里插入图片描述

5.5.6 to_json

DataFrame.to_json(path_or_buf=None, orient=None, lines=False)
将Pandas 对象存储为json格式
path_or_buf=None:文件地址
orient:存储的json形式,{‘split’,’records’,’index’,’columns’,’values’}
lines:一个对象存储为一行

# 存储文件
json_read.to_json("./data/test.json", orient='records')

# 结果
[{"article_link":"https:\/\/www.huffingtonpost.com\/entry\/versace-black-code_us_5861fbefe4b0de3a08f600d5","headline":"former versace store clerk sues over secret 'black code' for minority shoppers","is_sarcastic":0},{"article_link":"https:\/\/www.huffingtonpost.com\/entry\/roseanne-revival-review_us_5ab3a497e4b054d118e04365","headline":"the 'roseanne' revival catches up to our thorny political mood, for better and worse","is_sarcastic":0},{"article_link":"https:\/\/local.theonion.com\/mom-starting-to-fear-son-s-web-series-closest-thing-she-1819576697","headline":"mom starting to fear son's web series closest thing she will have to grandchild","is_sarcastic":1},{"article_link":"https:\/\/politics.theonion.com\/boehner-just-wants-wife-to-listen-not-come-up-with-alt-1819574302","headline":"boehner just wants wife to listen, not come up with alternative debt-reduction ideas","is_sarcastic":1},{"article_link":"https:\/\/www.huffingtonpost.com\/entry\/jk-rowling-wishes-snape-happy-birthday_us_569117c4e4b0cad15e64fdcb","headline":"j.k. rowling wishes snape happy birthday in the most magical way","is_sarcastic":0},{"article_link":"https:\/\/www.huffingtonpost.com\/entry\/advancing-the-worlds-women_b_6810038.html","headline":"advancing the world's women","is_sarcastic":0},....]
# 修改lines参数为True
json_read.to_json("./data/test.json", orient='records', lines=True)

# 结果
{"article_link":"https:\/\/www.huffingtonpost.com\/entry\/versace-black-code_us_5861fbefe4b0de3a08f600d5","headline":"former versace store clerk sues over secret 'black code' for minority shoppers","is_sarcastic":0}
{"article_link":"https:\/\/www.huffingtonpost.com\/entry\/roseanne-revival-review_us_5ab3a497e4b054d118e04365","headline":"the 'roseanne' revival catches up to our thorny political mood, for better and worse","is_sarcastic":0}
{"article_link":"https:\/\/local.theonion.com\/mom-starting-to-fear-son-s-web-series-closest-thing-she-1819576697","headline":"mom starting to fear son's web series closest thing she will have to grandchild","is_sarcastic":1}
{"article_link":"https:\/\/politics.theonion.com\/boehner-just-wants-wife-to-listen-not-come-up-with-alt-1819574302","headline":"boehner just wants wife to listen, not come up with alternative debt-reduction ideas","is_sarcastic":1}
{"article_link":"https:\/\/www.huffingtonpost.com\/entry\/jk-rowling-wishes-snape-happy-birthday_us_569117c4e4b0cad15e64fdcb","headline":"j.k. rowling wishes snape happy birthday in the most magical way","is_sarcastic":0}...
注意:优先选择使用HDF5文件存储

HDF5在存储的时候支持压缩,使用的方式是blosc,这个是速度最快的也是pandas默认支持的;
使用压缩可以提高磁盘利用率,节省空间;
HDF5还是跨平台的,可以轻松迁移到hadoop 上面。

5.6 高级处理-缺失值处理

5.6.1 如何处理NaN

获取缺失值的标记方式(NaN或者其他标记方式)
如果缺失值的标记方式是NaN
判断数据中是否包含NaN:
pd.isnull(df),
pd.notnull(df)
存在缺失值nan:
1、删除存在缺失值的:dropna(axis=‘rows’)
注:不会修改原数据,需要接受返回值
2、替换缺失值:fillna(value, inplace=True)
value:替换成的值
inplace:True:会修改原数据,False:不替换修改原数据,生成新的对象
如果缺失值没有使用NaN标记,比如使用"?"
先替换‘?’为np.nan,然后继续处理

5.6.2 电影数据的缺失值处理
# 读取电影数据
movie = pd.read_csv("/Users/lijianhua/Documents/研究生live/百度网盘下载/阶段5-人工智能经典算法编程/机器学习day03/2.code/data/IMDB-Movie-Data.csv")
movie.head()

在这里插入图片描述

5.6.2.1 判断缺失值是否存在
pd.notnull(movie)

在这里插入图片描述

pd.isnull(movie)

在这里插入图片描述

# 里面如果有一个缺失值就返回False
np.all(pd.notnull(movie))

False

# 里面如果有一个缺失值就返回True
np.any(pd.isnull(movie))

True
5.6.2.2 存在缺失值nan,并且是np.nan

1、删除
pandas删除缺失值,使用dropna的前提是,缺失值的类型必须是np.nan

# 不修改原数据
movie.dropna()

# 可以定义新的变量接受或者用原来的变量名
data = movie.dropna()

np.all(pd.notnull(data))

True

2、替换缺失值

# 替换存在缺失值的样本的两列
# 替换填充平均值,中位数
# movie['Revenue (Millions)'].fillna(movie['Revenue (Millions)'].mean(), inplace=True)

替换所有缺失值:

for i in movie.columns:
    if np.all(pd.notnull(movie[i])) == False:
        print(i)
        movie[i].fillna(movie[i].mean(), inplace=True)
5.6.2.3 不是缺失值nan,有默认标记的
wis = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data")

# 以上数据在读取时,可能会报如下错误:
URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:833)>

# 解决办法
# 全局取消证书验证
import ssl
ssl._create_default_https_context = ssl._create_unverified_context

处理思路分析:
1、先替换‘?’为np.nan
df.replace(to_replace=, value=)
to_replace:替换前的值
value:替换后的值

# 把一些其它值标记的缺失值,替换成np.nan
wis = wis.replace(to_replace='?', value=np.nan)

2、在进行缺失值的处理

# 删除
wis = wis.dropna()

5.7 高级处理-数据离散化

5.7.1 为什么要离散化

连续属性离散化的目的是为了简化数据结构,数据离散化技术可以用来减少给定连续属性值的个数。离散化方法经常作为数据挖掘的工具。机器识别起来更加直观。
在这里插入图片描述

5.7.2 什么是数据的离散化

连续属性的离散化就是在连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或整数 值代表落在每个子区间中的属性值。
原始人的身高数据:165,174,160,180,159,163,192,184
假设按照身高分几个区间段:150-165, 165-180,180-195
这样我们将数据分到了三个区间段,对应的标记为矮、中、高三个类别,最终要处理成一个"哑变量"矩阵。

5.7.3 股票的涨跌幅离散化
# 先读取股票的数据,筛选出p_change数据
data = pd.read_csv(
    "/Users/lijianhua/Documents/研究生live/百度网盘下载/阶段5-人工智能经典算法编程/机器学习day03/2.code/data/stock_day.csv"
)
data_p = data["p_change"]

在这里插入图片描述
pd.qcut(data, q):
对数据进行分组将数据分组,一般会与value_counts搭配使用,统计每组的个数
series.value_counts():统计分组次数

# 将股票涨跌幅数据进行分组
# 自行分组
qcut = pd.qcut(data_p, 10)
# 计算分到每个组数据个数
qcut.value_counts()

在这里插入图片描述

# 自定义区间分组:pd.cut(data, bins)
# 自己指定分组区间
bins = [-100, -7, -5, -3, 0, 3, 5, 7, 100]
p_counts = pd.cut(p_change, bins)
p_counts.value_counts()


(0, 3]        215
(-3, 0]       188
(3, 5]         57
(-5, -3]       51
(5, 7]         35
(7, 100]       35
(-100, -7]     34
(-7, -5]       28
Name: p_change, dtype: int64
5.7.4 股票涨跌幅分组数据变成one-hot编码

把每个类别生成一个布尔列,这些列中只有一列可以为这个样本取值为1.其又被称为热编码(哑变量/热独编码)。
pandas.get_dummies(data, prefix=None)
data:array-like, Series, or DataFrame
prefix:分组名字

# 得出one-hot编码矩阵
dummies = pd.get_dummies(p_counts, prefix="rise")

在这里插入图片描述

5.8 高级处理-合并

5.8.1 pd.concat实现数据合并

pd.concat([data1, data2], axis=1)
按照行或列进行合并,axis=0为列索引,axis=1为行索引
比如我们将刚才处理好的one-hot编码与原数据合并
在这里插入图片描述
在这里插入图片描述

# 按照行索引进行
pd.concat([data, dummies], axis=1)

在这里插入图片描述

5.8.2 pd.merge

pd.merge(left, right, how=‘inner’, on=None)
可以指定按照两组数据的共同键值对合并或者左右各自
left: DataFrame
right: 另一个DataFrame
on: 指定的共同键
how:按照什么方式连接

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']})
# 默认内连接
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'])

在这里插入图片描述

5.9 高级处理-交叉表与透视表

交叉表:交叉表用于计算一列数据对于另外一列数据的分组个数(用于统计分组频率的特殊透视表)
pd.crosstab(value1, value2)
透视表:透视表是将原有的DataFrame的列分别作为行索引和列索引,然后对指定的列应用聚集函数
data.pivot_table()
DataFrame.pivot_table([], index=[])

5.9.1 案例分析——数据准备

准备两列数据,星期数据以及涨跌幅是好是坏数据
进行交叉表计算

# 寻找星期几跟股票张得的关系
# 1、先把对应的日期找到星期几
date = pd.to_datetime(data.index).weekday
data['week'] = date

# 2、假如把p_change按照大小去分个类0为界限
data['posi_neg'] = np.where(data['p_change'] > 0, 1, 0)

# 通过交叉表找寻两列数据的关系
count = pd.crosstab(data['week'], data['posi_neg'])

在这里插入图片描述
但是我们看到count只是每个星期日子的好坏天数,并没有得到比例,该怎么去做?

# 对于每个星期一等的总天数求和,运用除法运算求出比例
# 算数运算,先求和
sum = count.sum(axis=1).astype(np.float32)

# 进行相除操作,得出比例 63/63+62
pro = count.div(sum, axis=0)

在这里插入图片描述

5.9.2 案例分析——查看效果
# 使用plot画出这个比例,使用stacked的柱状图

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

在这里插入图片描述

5.9.3 案例分析——使用pivot_table(透视表)实现
# 使用透视表,刚才的过程更加简单

# 通过透视表,将整个过程变成更简单一些
data.pivot_table(['posi_neg'], index='week')

在这里插入图片描述

5.10 高级处理-分组与聚合

分组与聚合通常是分析数据的一种方式,通常与一些统计函数一起使用,查看数据的分组情况。

5.10.1 什么是分组与聚合

先分组,name相同为一组,再找到每组中最大的值
在这里插入图片描述

5.10.2 分组API

DataFrame.groupby(key, as_index=False)
key:分组的列数据,可以多个
as_index:是否添加索引值
案例:不同颜色的不同笔的价格数据

col =pd.DataFrame({'color': ['white','red','green','red','green'], 'object': ['pen','pencil','pencil','ashtray','pen'],'price1':[5.56,4.20,1.30,0.56,2.75],'price2':[4.75,4.12,1.60,0.75,3.15]})

color    object    price1    price2
0    white    pen    5.56    4.75
1    red    pencil    4.20    4.12
2    green    pencil    1.30    1.60
3    red    ashtray    0.56    0.75
4    green    pen    2.75    3.15

进行分组,对颜色分组,price进行聚合

# 分组,求平均值
col.groupby(['color'])['price1'].mean()
col['price1'].groupby(col['color']).mean()

color
green    2.025
red      2.380
white    5.560
Name: price1, dtype: float64

# 分组,数据的结构不变
col.groupby(['color'], as_index=False)['price1'].mean()

color    price1
0    green    2.025
1    red    2.380
2    white    5.560
5.10.3 星巴克零售店铺数据

现在我们有一组关于全球星巴克店铺的统计数据,如果我想知道美国的星巴克数量和中国的哪个多,或者我想知道中国每个省份星巴克的数量的情况,那么应该怎么办?
从文件中读取星巴克店铺数据

# 导入星巴克店的数据
starbucks = pd.read_csv("/Users/lijianhua/Documents/研究生live/百度网盘下载/阶段5-人工智能经典算法编程/机器学习day03/2.code/data/starbucks/directory.csv")
starbucks

在这里插入图片描述
进行分组聚合

# 按照国家分组,求出每个国家的星巴克零售店数量
count = starbucks.groupby(['Country']).count()

在这里插入图片描述
画图显示结果

count['Brand'].plot(kind='bar', figsize=(20, 8))
plt.show()

在这里插入图片描述
假设我们加入省市一起进行分组

# 设置多个索引,set_index()
starbucks.groupby(['Country', 'State/Province']).count()

在这里插入图片描述

P21 科学计算库三天内容复习

5.11 案例

现在我们有一组从2006年到2016年1000部最流行的电影数据
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
对于这一组电影数据,如果我们希望统计电影分类(genre)的情况,应该如何处理数据?
思路分析
1、创建一个全为0的dataframe,列索引置为电影的分类,temp_df
2、遍历每一部电影,temp_df中把分类出现的列的值置为1
3、求和
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值