import requests
import pandas as pd
import numpy as np
from ftfy import fix_text

'''
数据清洗
'''

# 编码问题
# 使用ftfy库解决编码问题
# data = requests.get('http://www.baidu.com')
# print(data.text)

# 调用dix_text()方法, 解决打印的data文本中没有中文的问题
# print(fix_text(data.text))


# 缺失值的检测与处理
df = pd.DataFrame({'c1': [0, 1, 2, None], 'c2': [4, 5, None, 7]})
# print(df)

# 检查数组数据是否为空,为空返回True, 不为空返回False
# print(df.isnull())

# 返回每一列缺失值的总数
# print(df.isnull().sum())

# 使用fillna()函数直接指定特定值来填补缺失值
# 指定内容填充
# print(df.fillna('missing'))
# 指定平均值填充
# print(df.fillna(df.mean()))

# 使用fillna()函数指定相应的方法,根据周围的值来填补缺失值
df.iloc[1, 1] = None
# print(df)
# 指定用bfill方法填充,即为使用缺失值后面的数据进行填充
# 由于第一列的缺失值后面没有数据,就继续保持缺失状态
# 类似的填充方法还有ffill,用起前面的值进行填充
# limit是为了限制连续填充,1表示一列中有多个缺失值相邻时,只填充最近的一个缺失值
# print(df.fillna(method="bfill", limit=1))

# 使用interpolate()函数指定插值方法进行插值
# 二次多项式插值?--------------------------------------------------------------------------------------------------------
# print(df.interpolate(method='polynomial', order=2))
# 三次样条插值
# print(df.interpolate(method='spline', order=3))

# 自定义去除缺失值的方式
# 将第三列全部设为缺失值
df['c3'] = np.nan
df.iloc[3, 1] = None
# print(df)

# 使用dropna()函数简单地从数据集中排除引用丢失数据的标签
# print(df.dropna())

# 将全部为缺失值的整行或整列删除(默认是行方向)
# print(df.dropna(how='all'))
# 使用axis参数改为列方向
# print(df.dropna(how='all', axis=1))
# 一个数据为缺失值就删除整行或整列
# print(df.dropna(how='any'))


# 去除异常值
# 异常值包括数据格式不一致,数据范围异常等

# 数据范围异常:对年龄进行筛选
df2 = pd.DataFrame({'name': ['A', 'B', 'C'], 'age': [-1, 14, 125]})
# print(df2.query('age > 0 and age < 100'))

# 变量之间相互矛盾的数据
df3 = pd.DataFrame({'age': [16, 17, 20, 21, 22], 'age_label': ['tenn', 'adult', 'adult', 'teen', 'adult']})
# 这里的Age_label存在逻辑错误
# 筛选
# print(df3.query("(age >= 18 and age_label == 'adult') or (age < 18 and age_label == 'tenn')"))


# 去除重复值与冗余数据
# 使用drop_duplicates()函数方便地去除重复的数据
df4 = pd.DataFrame({'A': [1, 1, 3, 3], 'B': [2, 2, 4, 4]})
# print(df4.drop_duplicates())

# 通过subset参数对指定列进行去重
# print(df4.drop_duplicates(subset='B'))

# 使用keep参数指定要去重的行或列
# keep='first'表示在有重复值时,只保留第一次出现的数据,keep='last'表示只保留最后一次出现的数据
# keep=Flase表示会去除所有重复的数据
# print(df4.drop_duplicates(keep='last'))
# print(df4.drop_duplicates(keep=False))

# 使用inplace=False参数,将不改变原DataFrame,返回新筛选后的数据
# print(df4.drop_duplicates(inplace=False))


# 使用drop()方法删除某行或某列
# print(df4.drop(1, axis=0))
# print(df4.drop('B', axis=1))