数学建模_缺失值处理_拉格朗日、牛顿插值(全)

- 缺失值处理

1. 识别缺失值

在处理缺失值之前,首先需要识别数据中的缺失值。

1.1 使用 isna()isnull()

Pandas 提供了 isna()isnull() 方法来检测缺失值,二者功能相同。

import pandas as pd

df = pd.DataFrame({
    'A': [1, 2, None, 4],
    'B': [None, 2, 3, 4],
    'C': [1, None, None, 4]
})

# 检测缺失值
print(df.isna())
1.2 汇总缺失值

使用 sum() 可以汇总缺失值的数量。

# 每列缺失值的数量
print(df.isna().sum())

# 每行缺失值的数量
print(df.isna().sum(axis=1))

2. 删除缺失值

有时删除缺失值是最佳选择,特别是当缺失值较多或数据无用时。

2.1 删除包含缺失值的行

使用 dropna() 删除包含缺失值的行。

df_cleaned = df.dropna()
print(df_cleaned)
2.2 删除包含缺失值的列

通过设置 axis=1,可以删除包含缺失值的列。

df_cleaned = df.dropna(axis=1)
print(df_cleaned)
2.3 根据特定条件删除缺失值

使用 thresh 参数可以保留至少有指定数量非缺失值的行或列。

df_cleaned = df.dropna(thresh=2)
print(df_cleaned)

3. 填充缺失值

填充缺失值是一种常用的策略,特别是在不能删除数据的情况下。

3.1 使用固定值填充

使用 fillna() 方法可以用指定的值填充缺失值。

df_filled = df.fillna(0)
print(df_filled)
3.2 使用前向或后向填充

使用 method 参数选择前向填充(ffill)或后向填充(bfill)。

# 前向填充
df_filled = df.fillna(method='ffill')
print(df_filled)

# 后向填充
df_filled = df.fillna(method='bfill')
print(df_filled)
3.3 使用均值、中位数或众数填充

可以根据列的统计值进行填充,如均值、中位数或众数。

# 用列的平均值填充
df_filled = df.fillna(df.mean())
print(df_filled)

# 用列的中位数填充
df_filled = df.fillna(df.median())
print(df_filled)

# 用列的众数填充
df_filled = df.fillna(df.mode().iloc[0])
print(df_filled)

4. 替换特定值

有些数据集中缺失值可能被标记为特定的值,如 -999。可以将这些值替换为 NaN。

df_replaced = df.replace(-999, pd.NA)

5. 插值法填充缺失值

插值法通过已有数据来估算未知数据点。

5.1 线性插值

Pandas 提供 interpolate() 方法进行插值填充。

df_interpolated = df.interpolate(method='linear')
print(df_interpolated)
5.2 时间序列插值

如果数据是时间序列,可以使用 time 方法进行插值。

df_time_interpolated = df.interpolate(method='time')
print(df_time_interpolated)

6. 拉格朗日插值法填充缺失值

拉格朗日插值法基于所有数据点构建多项式,从而估算缺失值。

6.1 拉格朗日插值法的基本概念

拉格朗日插值多项式 L(x)L(x)L(x) 通过构造基函数 li(x)l_i(x)li(x) 并将其线性组合来估算缺失值。

6.2 拉格朗日插值法的 Python 实现
import pandas as pd
from scipy.interpolate import lagrange
import numpy as np

# 读取Excel文件
df = pd.read_excel('data.xlsx')

# 假设你的数据在以下列中
x_column = 'X'  # X轴的列名
y_column = 'Y'  # Y轴的列名

# 提取非缺失值的部分进行插值
x = df[x_column].dropna().values
y = df[y_column].dropna().values

# 创建拉格朗日插值多项式
poly = lagrange(x, y)

# 查找缺失值所在的行并填充
missing_rows = df[df[y_column].isna()].index
for i in missing_rows:
    x_missing = df.at[i, x_column]
    y_missing = poly(x_missing)
    df.at[i, y_column] = y_missing

# 打印填充后的DataFrame
print(df)

# 保存填充后的数据到Excel文件
df.to_excel('filled_data.xlsx', index=False)


7. 牛顿插值法填充缺失值

牛顿插值法使用差商表构建插值多项式,适合逐步添加数据点的情况。

7.1 牛顿插值法的基本概念

牛顿插值通过构造差商表并逐步构建多项式进行插值。

7.2 牛顿插值法的 Python 实现
import pandas as pd
import numpy as np

# 读取Excel文件
df = pd.read_excel('data.xlsx')

# 假设你的数据在以下列中
x_column = 'X'  # X轴的列名
y_column = 'Y'  # Y轴的列名

# 提取非缺失值部分进行插值
x = df[x_column].dropna().values
y = df[y_column].dropna().values

# 计算差商表
def divided_diff(x, y):
    n = len(y)
    coef = np.zeros([n, n])
    coef[:, 0] = y

    for j in range(1, n):
        for i in range(n - j):
            coef[i][j] = (coef[i + 1][j - 1] - coef[i][j - 1]) / (x[i + j] - x[i])

    return coef[0, :]  # 返回差商表的第一行

# 计算牛顿插值多项式
def newton_poly(coef, x_data, x):
    n = len(coef) - 1
    p = coef[n]
    for k in range(1, n + 1):
        p = coef[n - k] + (x - x_data[n - k]) * p
    return p

# 计算差商表的系数
coef = divided_diff(x, y)

# 查找缺失值所在的行并填充
missing_rows = df[df[y_column].isna()].index
for i in missing_rows:
    x_missing = df.at[i, x_column]
    y_missing = newton_poly(coef, x, x_missing)
    df.at[i, y_column] = y_missing

# 打印填充后的DataFrame
print(df)

# 保存填充后的数据到Excel文件
df.to_excel('filled_data_newton.xlsx', index=False)


8. 检查和处理重复值

处理缺失值后,检查并处理数据中的重复值同样重要。

8.1 检查重复值

使用 duplicated() 方法检查重复行。

print(df.duplicated())
8.2 删除重复值

使用 drop_duplicates() 方法删除重复行。

df_no_duplicates = df.drop_duplicates()
print(df_no_duplicates)

9. 高级操作:条件填充和分组处理
9.1 根据条件填充缺失值

有时需要根据其他列的条件填充缺失值。

df['C'] = df['C'].fillna(df['A'] + df['B'])
9.2 分组填充

可以对数据进行分组,然后对每个组分别填充缺失值。

df['C'] = df.groupby('A')['C'].transform(lambda x: x.fillna(x.mean()))
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值