import pandas as pd
import numpy as np
# 缺失值检测
# 加载数据
# data = pd.read_excel('qs.xlsx')
# print(data)
# 利用isnull进行空值判断 -->返回bool df ,如果为True, 就是空值,如果为False,就是真实值
# print(data.isnull())
# 与sum连用,统计每一列空值个数
# print(data.isnull().sum())
# 利用notnull进行空值判断 -->返回bool df ,如果为True, 就是真实值,如果为False,就是空值
# print(data.notnull())
# 与sum连用,统计每一列真实值个数
# print(data.notnull().sum())
# 缺失值处理
# 删除法
# axis = 0 ,删除行
# any 只要行里面有空值,就删除整行
# inplace = True 替换原文本
# all 只有整行整列数据全为空值就删除
# data.dropna(axis=0,how='any',inplace=True)
# print(data)
# 删除法 --》存在NA就删除----》对数据影响较大(慎用)
# 如果某一行或者某一列数据存在大量的缺失值,这个时候就可以使用删除法删除
# 填充法
# 使用fillna进行填充,需要制定填充的内容,inplace是否覆盖原来数据
# 注意填充的数值型数据,可以使用均值,众数,中位数进行填充
# 类别型数据需要使用众数进行填充
# data['门店编号'].fillna('CDNL', inplace=True)
# print(data)
# 填充值必须为单个数值,不可以为序列,众数不唯一,取下标获取单个众数
# data['类别ID'].fillna(data['类别ID'].mode()[0], inplace=True)
# print(data)
# 填充法应用
# 例如:表格中只有少量数据为缺失状态,就可以使用填充法,填充的时候需要注意,填充的结果不能对后续的分析产生不利的影响
# 插值法
# 线性插值法、多项式插值、样条插值
# 线性插值 --》拟合线性方程进行差值
# 多项式差值 --》通过拟合多项式进行差值,通常使用拉格朗日插值,牛顿插值
# 样条插值
# 导入我们的插值模块
from scipy.interpolate import interp1d # 线性插值模块
from scipy.interpolate import lagrange # 拉格朗日插值模块
from scipy.interpolate import spline # 样条插值模块
x = np.array([1, 2, 3, 4, 5, 8, 9])
y1 = np.array([3, 5, 7, 9, 11, 17, 19])
y2 = np.array([2, 8, 18, 32, 50, 128, 162])
# 线性插值
# linear1 = interp1d(x, y1, kind='linear')
# linear2 = interp1d(x, y2, kind='linear')
# print(linear1([6, 7])) #y1缺失值[13. 15.] --》[13, 15]
# print(linear2([6, 7])) #y2 缺失值[ 76. 102.] -->[76, 98]
# 拉格朗日插值模块
# la1 = lagrange(x=x, w=y1)
# la2 = lagrange(x=x, w=y2)
# print(la1([6, 7])) # y1缺失值[13. 15.] --》[13, 15]
# print(la2([6, 7])) # y2 缺失值[ 76. 102.] -->[76, 98]
# 样条插值
# print(spline(xk=x, yk=y1,xnew=[6,7])) # y1缺失值[13. 15.] --》[13, 15]
# print(spline(xk=x, yk=y2,xnew=[6,7])) # y2 缺失值[ 76. 102.] -->[76, 98]
# 线性插值只是在线性关系里面效果较好,在非线性里面效果不好
# 多项式插值、样条插值在非线性、线性里面效果都不错
# 线性关系在现实生活中并不多见,以后遇到的插值方式选择多项式插值、样条插值
# scipy也是一种科学计算库
# NAN -->float类型
# 遇到非np.nan 类型空值 可以替换为np.nan 在进行插值
# date = data.replace('*', np.nan)