24.9.28 机器学习入门DAY7

93 阅读5分钟

pandas 处理缺失值

1.判断空值

data = 读入数据

pd.notnull(data) # 返回TRUE or FALSE

pd.isnull(data) # 返回TRUE or FALSE

pd.all(pd.notnull(data)) # 返回TRUE or FALSE

data = pd.read_excel('./pythonProject/data_process/traffic_data_103.xlsx')
np.all(pd.notnull(data))
after_drop_data = data.dropna()
np.all(pd.notnull(after_drop_data))
mean_data = after_drop_data['车流量'].mean()
after_drop_data['车流量'].fillna(after_drop_data['车流量'].mean(), inplace = True)
# after_drop_data['车流量'].fillna(mean_data, inplace = True)
# 遍历表头查找有空值的列名
for i in data.columns:
    if np.any(pd.isnull(data[i])) == True:
        print(i)
        data[i].fillna(data[i].mean(), inplace = True)
np.any(pd.isnull(data[i]))

替换

# 替换,查找出异常值后可替换为NAN,再进行空值处理
# data.replace(to_replace="?", value=np.nan)

数据离散化

连续属性离散化的目的是为了简化数据结构,数据离散化技术可以用来减少给定连续属性值的个数。离散化方法经常作为数据挖掘的工具。 连续属性的离散化就是在连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或整数 值代表落在每个子区间中的属性值。 离散化有很多种方法,这使用一种最简单的方式去操作。原始人的身高数据:165,174,160,180,159,163,192,184。假设按照身高分几个区间段:150165,165180,180~195这样我们将数据分到了三个区间段,我可以对应的标记为矮、中、高三个类别,最终要处理成一个"哑变量“矩阵

pd.qcut(data, q) 对数据进行分组将数据分组,一般会与value_counts搭配使用,统计每组的个数

series.value_counts():统计分组次数

合并

pd.concat([数据1, 数据2], axis='')

pd.merge(left, right, how = )

交叉表

计算一列数据对于另一列数据的分组个数

透视表

指定某一列对另一列的关系

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data = pd.read_csv('./stock_day.csv') # 图1
data.index # 图2
time = pd.to_datetime(data.index) # 图3
time.day # 图4
data['week'] = time.weekday # 图5
data['p_n'] = np.where(data['p_change'] > 0, 1, 0) # data['p_change']如果大于0置为1,否则为0 # 图6
count = pd.crosstab(data['week'], data['p_n']) # 图7
sum = count.sum(axis=1).astype(np.float32) # 图8
ret = count.div(sum, axis = 0) # 图9
ret.plot(kind='bar', stacked=True)
plt.show() # 图10
data.pivot_table(['p_n'],index='week') # 图11

图1

image.png 图2

image.png 图3 image.png

图4

image.png

图5

image.png 图6 图7

image.png 图7

image.png 图8

image.png

图9

image.png

图10

image.png

图11

image.png

分组和聚合

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

data = pd.read_csv('./stock_day.csv')
data.head() # 图12
data.index # 图13
time = pd.to_datetime(data.index)
time  # 图14
time.weekday # 图15
time.day # 图16
data['week'] = time.weekday
data.head() # 图17
data['p_n'] = np.where(data['p_change'] > 0, 1, 0) # data['p_change']如果大于0置为1,否则为0
data.head() # 图18
count = pd.crosstab(data['week'], data['p_n'])  # 图19
sum = count.sum(axis=1).astype(np.float32) # 图20
ret = count.div(sum, axis = 0) # 图21
ret.plot(kind='bar', stacked=True)
plt.show() # 图22
data.pivot_table(['p_n'],index='week')  # 图23
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]})  # 图24

col.groupby(['color'])['price1'].mean()  # 图25
col['price1'].groupby(col['color']).mean()  # 图26
col.groupby(['color'], as_index = False)['price1'].mean() # as_index = False 保留原来索引 0, 1, 2 ...   # 图27

图12 image.png 图13 image.png 图14 image.png

图15

image.png

图16

image.png

图17 image.png 图18

image.png 图19

image.png

图20

image.png

图21

image.png

图22

image.png

图23

image.png

图24

image.png

图25

image.png

图26

image.png

图27

image.png

seaborn

pip3 install seaborn import seaborn as sns

可视化数据的分布

处理一组数据时,通常要做的就是了解变量是如何分布的。

对于单变量的数据来说,采用直方图或核密度曲线。

对于双变量来说,可采用多面板图形展现,比如:散点图、二维直方图、核密度估计图形等。

绘制单变量分布

可采取简单的直方图描述单变量的分布情况。Seaborn 提供了 distplot()函数,它默认绘制的是一个带有核密度估计曲线的直方图。

seaborn.distplot(a, bins=None, hist=True,kde=True,rug=False,fit=None,color=None)

a:表示要观察的数据。可以是Series一维数组或列表。

bins:用于控制条形的数量。

hist:接受布尔类型,表示是否绘制(标注直方图)。

kde:接受布尔类型,表示是否绘制高斯核密度估计曲线。

rug:接受布尔类型,表示是否在支持的轴方向上绘制rugplot

import seaborn as sns
import numpy as np
np.random.seed(0) # 确定随机数生成器生成的数据是一样的。如果没有每次随机生成的值不一样。
arr = np.random.randn(100) # 随机生成 100 个变量
sns.distplot(arr, bins=10, hist=True, kde=True, rug=True)  #  hist=True直方图,kde=True核密度估计曲线,rug=True绘制rugplot

绘制单变量分布

image.png

绘制双变量分布

df = pd.DataFrame({"x":np.random.randn(500), "y":np.random.randn(500)})
df.head() # 图28
sns.jointplot(x="x", y="y", data=df, kind="kde") # 图29 kind="kde" 是核密度估计图形
sns.jointplot(x="x", y="y", data=df, kind="scatter", color="r", ratio=5, space=1) # 图30

图28

image.png

图29

image.png

图30

image.png

绘制二维直方图

sns.jointplot(x="x", y="y", data=df, kind="hex")

image.png

绘制成对的双变量分布

dataset = sns.load_dataset("iris")
dataset.head() # 图31  # 图32 “iris”数据集参数介绍
sns.pairplot(dataset) # 图33

图31

image.png

图32 “iris”数据集参数介绍

image.png 图33

image.png

类别散点图

sns.stripplot(x='day', y='total_bill', data=data) x, y, hue: 用于绘制长格式数据的输入

data: 用于绘制的数据集。如果 x 和 y 不存在,则它将作为宽格式,否则将作为长格式。

jitter:表示抖动的程度(仅沿类别轴)。当很多数据点重叠时,可以指定抖动的数量或者设为True使用默认值。

data=sns.load_dataset('tips')
data.head() # 图34
sns.stripplot(x='day', y='total_bill', data=data) # 图35
sns.stripplot(x='day', y='total_bill', data=data, hue="time") # 图36
sns.stripplot(x='day', y='total_bill', data=data, hue="time", jitter=True) # 图37
sns.swarmplot(x="day", y="total_bill",data=data) # 图38

图34

image.png

图35

image.png

图36

image.png

图37

image.png

图38

image.png