机器学习——Day04
·
一、DataFrame运算

1.算术运算
# 进行数学运算加上具体的一个数字
add(other)

# 减法
sub(other)

2.逻辑运算
2.1 逻辑运算符号<、>、|、&


2.2 逻辑运算函数
query(expr)
# expr:查询字符串

isin(values)
# 指定值进行判断从而进行筛选操作

由于stock_t中的内容是随机生成,会出现精度问题,推荐先四舍五入保留6位小数后进行isin判断
3.统计运算
# 综合统计函数
data.describe()

# 求总和 可以按行或按列
data.sum()

# 求中位数
data.median()

# 求出最大值的索引
data.idxman()
# 求出最小值的索引
data.idxmin()

4.累计统计函数



5.自定义运算
apply(func, axis=0)
# func是自定义函数
# axis=0默认是列,axis=1为行进行运算
#定义一个对列,最大值-最小值的函数
stock_t[['股票1', '股票2']].apply(lambda x: x.max() - x.min(), axis=0)
# lambda为匿名函数,意为返回值x是x.max()-x.min()的值

二、Pandas画图
1.pandas.DataFrame.plot
DataFrame.plot(x= , y= , kind='line')
# kind表示画什么类型的图
line 折线图
bar 条形图
barh
hist 直方图
pie 饼图
scatter 散点图
2.pandas.Series.plot
三、文件读取与存储
1.csv
1.1 read_csv 读取
通过网盘分享的文件:stock_day.csv
链接: https://pan.baidu.com/s/12TlwjEFIRS9eP9sUbSqJBw?pwd=b42n 提取码: b42n
pandas.read_csv(filepath_or_buffer, sep=',')
# filepath_or_buffer:文件路径
# sep=',':以','为分割
# usecols:指定读取的列名,列表形式


1.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:需要什么列
# mode:'w'重写,'a'追加
# index:是否写进行索引


2.HDF5
推荐使用,因为采用blosc压缩方式读取效率快,压缩后可以节省空间,支持跨平台
2.1 read_hdf 读取文件
pandas.raed_hdf(path_or_buf, key=None, **kwargds)
# path_or_buf 文件路径
# key 读取的键

2.2 to_hdf 写文件
pd.to_hdf(path_or_buf, key=None)
# 注意:保存的文件是h5后缀

3.json
3.1 read_json
pandas.read_json(path_or_buf=None, orient=None, typ='frame', lines=False)
# orient 以什么方式进行读取或写入
# split 将索引总结到索引,列名到列名,数据到数据,将三部分都分开
# records 以colums:values的形式输出
# index 以index:{columns:values}形式输出
# columns 以columns:{index:values}形式输出
# values 直接输出值
# lines 是否按行读取
# typ 指定转换成的对象类型series或者dataframe

3.2 to_json
DataFrame.to_json(psth_or_buf=None, orient=None, lines=False)
# 将Pandas对象存储为json格式
# orient 存储的json形式,{'split','records','index','columns','values'}
# lines 一个对象存储为一行
四、缺失值处理
1.如何处理NaN
# 判断数据是否为NaN
pd.isnull(df)
pd.notnull(df)
# 处理方式
## 存在缺失值NaN,并且是np.nan
### 1.删除存在缺失值,不会修改元数据需要接收返回值
dropna(axis='rows')
### 2.替换缺失值
fillna(value,inplace=True)
value 替换成的值
inplace:True会修改原数据 False不替换修改元数据,生成新的对象
## 不是缺失值nan,有默认标记的
replace(to_replace=None, value=np.nan)
to_replace 替换前的值
value 替换后的值
2.电影数据的缺失值处理
# 读取电影数据
movie = pd.read_csv("./data/IMDB-Movie-Data.csv")
2.1 判断缺失值是否存在

2.2 存在缺失值nan,并且是np.nan
- pandas删除缺失值,使用dropna的前提是,缺失值的类型必须是np.nan

- 替换缺失值



- 替换所有缺失值


2.3 不是缺失值nan,有默认标记的
# 引入一组数据
wis = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data")



五、数据离散化
1.什么是数据离散化
把一些数据分到某个区间,最后用不同的符号或者数字表达
2.股票的涨跌幅离散化

# 把数据大致分为数量相等的几类 一般会与valuee_counts搭配使用,统计每组的个数
pd.qcut(data,bins)
# 指定分组间隔
pd.cut(data, bins)
# 统计分组次数
series.value_counts()



3.股票涨跌幅分组数据变成one-hot编码
3.1 什么是one-hot编码(哑变量、热独编码)
就是把数据转化成为0,1统计类型

3.2 pd.get_dummies
pandas.get_dummies(data, prefix=None)
data 统计好的数据
prefix 分组名字


六、合并
1.pd.concat
pd.concat([data1, data2], axis=1)
# 按照行或列进行合并,axis=0为列索引,axis=1为行索引

2.pd.merge
pd.merge(left, right, how, on, left_on, right_on)
left 左表
right 右表
how 以何种方式拼接
on 连接的键
left_on 是否指定左键
right_on 是否指定右键

- 内连接

- 外连接

- 左连接

- 右连接

七、交叉表与透视表
1.crosstab(交叉表)
- 交叉表用于计算一列数据对于另外一列数据的分组个数(寻找两个列之间的关系)
pd.crosstab(value1, value2)
# 返回具体数量
- 利用交叉表得出一周内各天对应的涨跌数



- 对于每个星期一等的总天数求和,运用除法运算求出比例

- 绘制图表

2.pivot(透视表)
对象.pivot_table()
# 返回占比情况

八、分组与聚合
1.分组API
- 准备数据

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

- 分组,数据结构不变

2.星巴克零售店铺数据
- 准备数据

- 按照国家分组并画图


- 可以加入省市一起进行分组

九、综合案例分析
1.问题1:如何获取电影数据中评分的平均分,导演的人数等信息
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
movie = pd.read_csv("./data/IMDB-Movie-Data.csv")
#1.求评分的平均值
mean = movie["Rating"].mean()
#2.求导演人数(去重)
movie["Director"].unique().shape[0]

2.问题2:如何获取Rating,Runtime(Minutes)的分布情况,应该如何呈现数据
plt.figure(figsize=(20, 8), dpi=100)
plt.hist(movie["Rating"].values, 20)
max_ = movie["Rating"].max()
min_ = movie["Rating"].min()
x1 = np.linspace(min_,max_,21)
plt.xticks(x1)
plt.show()

plt.figure(figsize=(20, 8), dpi=100)
plt.hist(movie["Runtime (Minutes)"].values, 20)
max_ = movie["Runtime (Minutes)"].max()
min_ = movie["Runtime (Minutes)"].min()
x1 = np.linspace(min_,max_,21)
plt.xticks(x1)
plt.show()

3.问题3:如何统计电影分类情况
temp_list = [i.split(",") for i in movie["Genre"]]
array_list = np.unique([i for j in temp_list for i in j])
array_list.shape[0]

genre_zero = pd.DataFrame(np.zeros([movie.shape[0], array_list.shape[0]]), columns=array_list)
for i in range(movie.shape[0]):
genre_zero.loc[i, temp_list[i]] = 1

genre_zero.sum().sort_values(ascending=False).plot(kind="bar", figsize=(20,8), fontsize=18)

更多推荐
所有评论(0)