探索性数据分析
这一部分目的在于了解数据,包括数据是什么类型,数据有什么特点
数据信息
print(data.shape)
data.info()
 
(1086, 12)
<class 'pandas.core.frame.DataFrame'>
Index: 1086 entries, 2020/7/1 0:00 to nan
Data columns (total 12 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   水生根茎类    1060 non-null   float64
 1   花叶类      1037 non-null   float64
 2   花菜类      1080 non-null   float64
 3   茄类       1066 non-null   float64
 4   辣椒类      1080 non-null   float64
 5   食用菌      1074 non-null   float64
 6   水生根茎类类别  1085 non-null   object 
 7   花叶类类别    1085 non-null   object 
 8   花菜类类别    1085 non-null   object 
 9   茄类类别     1085 non-null   object 
 10  辣椒类类别    1085 non-null   object 
 11  食用菌类别    1085 non-null   object 
dtypes: float64(6), object(6)
memory usage: 110.3+ KB
 
分开数值列和类别列:
data.select_dtypes(include='float64'):去挑选数值类型等于include的行
numeric_cols=data.select_dtypes(include='float64').columns# df
category_cols=data.select_dtypes(include='object').columns
numeric_cols,category_cols
 
统计学描述
data.drop(columns=numeric_col+‘z-score’,inplace=True)
numeric_data.describe()
 
数据预处理环节
数据清洗环节
获取缺失值
 null_counts=data.isnull().sum():返回一个Series
 null_counts_nonzero=null_counts_nonzero.sort_values(ascending=False)排序更加直观
 数据可视化:
 以下是一个描绘一个缺失值大小和占比图像的代码
"""可视化缺失数据"""
plt.rcParams['font.family'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
def show_missing_values(data):
    null_counts=data.isnull().sum()    
    
    null_counts_nonzero=null_counts[null_counts>0]
    
    null_counts_nonzero=null_counts_nonzero.sort_values(ascending=False)
    print(type(null_counts_nonzero))
    
    plt.figure(figsize=(10,6))
    if not null_counts_nonzero.empty:
        ax=sns.barplot(x=null_counts_nonzero.values,y=null_counts_nonzero.index,palette="viridis")
    
        # palette调色板 data参数需要传入的是一个DataFrame,可以不传入,传入错误绘图有问题
        # sns中大部分参数会返回ax,可以用来设置标题,添加文本,设置限制和标签与图例
        ax.set_title('null number statics')
    
        for i,value in enumerate(null_counts_nonzero.values):
            ax.text(value+1,i,f'{value}',va='center')
        
        null_counts_nonzero=null_counts_nonzero[numeric_cols] 
        plt.figure(figsize=(10,6))
        plt.pie(x=null_counts_nonzero.values,labels=null_counts_nonzero.index,autopct='%1.1f%%')
        plt.title('null number distribution-pie figure')
        plt.show()
    else:
        print('暂未发现缺失值!绘图提前结束!')
show_missing_values(data)
 

 
异常值处理环节
np.where函数,类似倒置的if条件语句:cond,true,false
np.where(data[numeric_col+'z-score']<-3,
                     mean-3*std,    data[numeric_col]
                )
 
- 异常值处理1:直接丢弃
 - 异常值处理2:变为上限值
 
异常值处理可以优化我们的数据,增强数据的可分析性
"""异常值处理:Z-score>3"""
def abnormal_data_process(data):
    # 异常值处理前的图像
    plt.figure(figsize=(12,8))
    ax=sns.lineplot(data=data,x=np.arange(1,len(data)+1),\
                    y=data[numeric_cols[0]],color='cornflowerblue',linewidth=2,\
                    marker='o',markersize=4,markerfacecolor='white',markeredgecolor='blue')
    
    ax.set_title(f'日期-{numeric_cols[0]}的销售量',fontsize=20)
    ax.set_xlabel(f'日期',fontsize='20')
    ax.set_ylabel(f'{numeric_cols[0]}的销售量',fontsize='20')
    ax.set_yticks(np.arange(1,140,10))
    
    # 异常值处理
    for numeric_col in numeric_cols:
        #计算每列的z-score
        mean=data[numeric_col].mean()
        std=data[numeric_col].std()
        data[numeric_col+'z-score']=(data[numeric_col]-mean)/std
        
        # np.where(cond,true,false)
        
        data[numeric_col]=np.where(data[numeric_col+'z-score']>3,mean+3*std,
            np.where(data[numeric_col+'z-score']<-3,
                     mean-3*std,    data[numeric_col]
                )
            )
        data.drop(columns=numeric_col+'z-score',inplace=True)# 丢弃掉不需要的列
    
    # 异常处理后的图像
    plt.figure(figsize=(12,8))
    ax=sns.lineplot(data=data,x=np.arange(1,len(data)+1),y=data[numeric_cols[0]],
                    color='deepskyblue',
                    marker='o',markersize=4,markerfacecolor='white',
                    markeredgecolor='deepskyblue')# marker='o',markersize=1
    
    ax.set_title(f'日期-{numeric_cols[0]}的销售量',fontsize=20)
    ax.set_xlabel(f'日期',fontsize='20')
    ax.set_ylabel(f'{numeric_cols[0]}的销售量',fontsize='20')
    ax.set_yticks(np.arange(1,140,10))
    return data
data=abnormal_data_process(data)
 
处理前的图像:
 
 处理后的图像:
 
seaborn绘图
plt中绘制子图
先讲一下怎么绘制子图
fig,axes=plt.subplots(5,1)
 
返回一个可以索引的axes对象,可以进行plt的各种操作
 注意subplot函数与其类似,但是功能不相同
sns.xxx函数的返回值
 
大部分sns.xxx返回一个ax对象,这个对象有很多操作:设置标题,添加文本,设置横纵坐标上下界,设置图例
 其中这样理解:使用set_XXX的都是主动操作,不使用的都视作ax本身的属性
ax.set_title('null number statics')ax.set_xlabel(f'日期',fontsize='20')ax.set_ylabel(f'{numeric_cols[0]}的销售量',fontsize='20')ax.set_yticks(np.arange(1,140,10))ax.legend():与label=str属性一起使用,往往与text或者axvline函数配合ax.text()ax.axvline(x=q,color='black',linestyle='--',label=f'Quantile{i:}-{q:.2f}')
对于ax.legend()函数:
 for i,q in zip(quantities_indices,quantities):
     ax.axvline(x=q,color='black',linestyle='--',label=f'Quantile{i:}-{q:.2f}')
     ax.legend()
 
与label=str属性一起使用,往往与text或者axvline函数配合
对于ax.text()函数:
ax.text(x,y,f'label',va='center',ha='center')
 
- x和y是注释的位置:对于object数据来说,直接使用[0,n]的数据进行代替,而不是使用名称进行索引
 - label:是一个字符串,建议使用
f{str} va='center',ha='center'默认设置即可
对于ax.axvline()/ax.axhline()函数
ax.axv/hline(x/y,color=,linestyle=,label=str)
 
- 如果是竖线则绘制竖线的x坐标,为横线则为横线的y坐标
 - linestyle最好设置为虚线
 label='str':字符串形式
ax=sns.barplot(x=null_counts_nonzero.values,y=null_counts_nonzero.index,palette="viridis")
    
        # palette调色板 data参数需要传入的是一个DataFrame,可以不传入,传入错误绘图有问题
        # sns中大部分参数会返回ax,可以用来设置标题,添加文本,设置限制和标签与图例
        ax.set_title('null number statics')
    
        for i,value in enumerate(null_counts_nonzero.values):
            ax.text(value+1,i,f'{value}',va='center')
 
sns.xxx的通用格式
 
ax=sns.barplot(
	x=,y=,data=,
	color=,linewidth=,
	palette=,
	marker=,markersize=,markefacecolor=,markeredgecolor=)
 
- data:必须接受一个DataFrame参数,否则会出现意料之外的错误,可以不设置这个参数
 - x:横轴数据;y:纵轴数据。可以接受object对象,可以接受ndarray,series,一般不接受dataframe
 - palette:调色板对象,一般使用
palette='viridis'VIRIDIS - marker一类:
marker='o',其余两个是标记本身和标记边缘的颜色,一般将边缘颜色设置为与color一致 
histogram直方图
ax=sns.histplot(x=sale_data,kde=True,color='purple',bins='auto')
 
- kde:核密度曲线是否绘制
 - bins:一般默认auto
 - x:接受series或者ndarray
 
boxplot
ax=sns.boxplot(data=data,orient='h',palette="viridis",fliersize=2,flierprops=flierprops)
 
- 只需要传入data
 - orient:朝向水平h或者垂直v
 - flier过滤点一类的参数:
 
    flierprops={'marker':'o','markerfacecolor':'black','markeredgecolor':'white',
                'markersize':4
                }
 
heatmap
sns.heatmap(corr_matrix,fmt='.2g',cmap='Reds',annot=True)
 
- fmt:小数格式
 - cmap:映射
 - annot:数值注释
 
pie
sns没有绘制pie的函数,但是绘制pie的函数与其通用格式非常像
 plt.pie(x=null_counts_nonzero.values,labels=null_counts_nonzero.index,autopct='%1.1f%%')
 
- x:ndarray或者series
 - label:标签
 - autopct:小数格式
 



















