Wandering_night 2024-08-18 11:51 采纳率: 47.1%
浏览 4
已结题

拉格朗日插值法处理表格异常值出错

我是用拉格朗日插值法处理表格的异常值,但程序到第20行时报错。请问出错点在哪?如何解决?
部分表格和代码如下:

| 日期| 单品编码 | 批发价格(元/千克) |

| 2022-07-01 | 102900005115762 | 3.88 |
| 2022-07-02| 102900005115763 | 6.72 |
| 2022-07-03 | 102900005115764 | 3.19 |

import os
import pandas as pd
import numpy as np
from scipy.interpolate import lagrange
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签

plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

# 数据的读取
data = pd.read_excel("C:/Users/YHS/Desktop/附件3.xlsx")
neg_list = data['批发价格(元/千克)']

# 数据的行数
R = data.shape[0]

# 异常数据的个数
for item in neg_list:
    iqr = data[item].quantile(0.75) - data[item].quantile(0.25)
    q_abnormal_L = data[item] < data[item].quantile(0.25) - 1.5 * iqr
    q_abnormal_U = data[item] > data[item].quantile(0.75) + 1.5 * iqr
    print(item + '中有' + str(q_abnormal_L.sum() + q_abnormal_U.sum()) + '个异常值')


```python
发生异常: KeyError
3.88
KeyError: 3.88

The above exception was the direct cause of the following exception:

  File "C:\Users\YHS\Desktop\拉格朗日插值法.py", line 20, in <module>
    iqr = data[item].quantile(0.75) - data[item].quantile(0.25)
          ~~~~^^^^^^
KeyError: 3.88


  • 写回答

2条回答 默认 最新

  • GISer Liu 2024-08-18 11:52
    关注

    该回答引用自GPT-deepseek, 由博主 GISer Liu 编写:

    问题分析

    用户在使用拉格朗日插值法处理表格的异常值时,程序在第20行报错,错误类型为 KeyError,具体错误信息为 KeyError: 3.88。这个错误通常表示在尝试访问字典或数据框时,使用的键(key)不存在。

    问题定位

    根据代码和错误信息,第20行的代码是:

    iqr = data[item].quantile(0.75) - data[item].quantile(0.25)
    

    这里的 item 是一个浮点数(例如 3.88),而 data 是一个数据框(DataFrame)。在数据框中,通常使用列名(字符串)来访问列数据,而不是使用浮点数。因此,这里的 data[item] 会导致 KeyError

    解决方案

    为了解决这个问题,我们需要确保在访问数据框时使用正确的列名。具体步骤如下:

    1. 修改列名的访问方式:确保使用字符串类型的列名来访问数据框的列。
    2. 检查列名是否正确:确保列名在数据框中存在。

    修改后的代码

    import os
    import pandas as pd
    import numpy as np
    from scipy.interpolate import lagrange
    import matplotlib.pyplot as plt
    
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
    
    # 数据的读取
    data = pd.read_excel("C:/Users/YHS/Desktop/附件3.xlsx")
    neg_list = data['批发价格(元/千克)']
    
    # 数据的行数
    R = data.shape[0]
    
    # 异常数据的个数
    for item in neg_list:
        iqr = data['批发价格(元/千克)'].quantile(0.75) - data['批发价格(元/千克)'].quantile(0.25)
        q_abnormal_L = data['批发价格(元/千克)'] < data['批发价格(元/千克)'].quantile(0.25) - 1.5 * iqr
        q_abnormal_U = data['批发价格(元/千克)'] > data['批发价格(元/千克)'].quantile(0.75) + 1.5 * iqr
        print('批发价格(元/千克)中有' + str(q_abnormal_L.sum() + q_abnormal_U.sum()) + '个异常值')
    

    解释

    1. 修改列名的访问方式:将 data[item] 修改为 data['批发价格(元/千克)'],确保使用字符串类型的列名来访问数据框的列。
    2. 检查列名是否正确:确保列名 '批发价格(元/千克)' 在数据框中存在。

    总结

    通过上述修改,确保了在访问数据框时使用正确的列名,从而避免了 KeyError 错误。用户可以尝试运行修改后的代码,检查是否解决了异常值处理的问题。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月26日
  • 已采纳回答 8月18日
  • 创建了问题 8月18日