目录
数据来源:
该数据集为在线零售商在2010年12月1日至2011年12月9日间发生的所有网络交易订单信息。
该公司主要销售礼品为主,并且多数客户为批发商。
数据集介绍及来源:
https://www.kaggle.com/carrie1/ecommerce-data
特征说明:
InvoiceNo:订单编号,由六位数字组成,退货订单编号开头有字幕’C’
StockCode:产品编号,由五位数字组成
Description:产品描述
Quantity:产品数量,负数表示退货
InvoiceDate:订单日期与时间
UnitPrice :单价(英镑)
CustomerID:客户编号,由5位数字组成
Country:国家
数据处理
利用pandas库检查缺失值和异常值,删除InvoiceNo列异常值数据(运行后可知该列异常值是A开头+六位数字)并将UnitPrice列的异常值数据进行线性插值填补后存入data2.csv表中。
import pandas as pd
# 读取CSV文件
dataframe = pd.read_csv('data.csv')
# 检查缺失值
missing_values = dataframe.isnull().sum()
print("缺失值数量:\n", missing_values)
# 检查InvoiceNo列异常值
# 定义条件1:订单编号由六位数字组成
condition1 = dataframe['InvoiceNo'].str.isnumeric() & (dataframe['InvoiceNo'].str.len() == 6)
# 定义条件2:退货订单编号以字母'C'开头(即C+六位数字)
condition2 = dataframe['InvoiceNo'].str.match(r'^C\d{6}$')
# 通过逻辑与操作符 (&) 组合两个条件
valid_invoice_conditions = condition1 | condition2
# 通过布尔索引选择满足条件的行,得到清洗后的DataFrame
cleaned_dataframe = dataframe[valid_invoice_conditions]
# 计算'InvoiceNo'列异常值数量
invoice_no_outliers_count = len(dataframe[~valid_invoice_conditions])
print("InvoiceNo列异常值数量:", invoice_no_outliers_count)
# 打印InvoiceNo列异常值
invoice_no_outliers = dataframe[~valid_invoice_conditions]['InvoiceNo']
print("InvoiceNo列异常值:\n", invoice_no_outliers)
# 利用标准差方法检测UnitPrice列的异常值
unit_price_mean = cleaned_dataframe['UnitPrice'].mean()
unit_price_std = cleaned_dataframe['UnitPrice'].std()
upper_bound = unit_price_mean + 3 * unit_price_std
lower_bound = unit_price_mean - 3 * unit_price_std
# 获取UnitPrice列的异常值
unit_price_outliers = (cleaned_dataframe['UnitPrice'] > upper_bound) | (cleaned_dataframe['UnitPrice'] < lower_bound)
# 使用线性插值填充异常值
cleaned_dataframe.loc[:, 'UnitPrice'] = cleaned_dataframe['UnitPrice'].interpolate(method='linear')
# 计算'UnitPrice'列异常值数量
unit_price_outliers_count = len(cleaned_dataframe[unit_price_outliers])
print("UnitPrice列异常值数量:", unit_price_outliers_count)
# 打印UnitPrice列异常值
unit_price_outliers = cleaned_dataframe[unit_price_outliers]['UnitPrice']
print("UnitPrice列异常值:\n", unit_price_outliers)
# 保存清洗后的数据到新表data2.csv
cleaned_dataframe.to_csv('data2.csv', index=False)