You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在模拟数据集(Dummy Dataset)中手动插入Temp与Humidity异常值

为模拟数据集的Temp和Humidity列插入异常值

已通过以下代码生成模拟数据集:

from datetime import datetime
import numpy as np
import pandas as pd
from faker import Faker

fake = Faker()

def make_workers() -> list:
    status_list = ['in', 'out']
    room_list = ['FL1_RM1', 'FL1_RM2', 'FL1_RM3', 'FL1_RM4', 'FL2_RM1', 'FL2_RM2', 'FL2_RM3', 'FL2_RM4', 'FL3_RM1',
                 'FL3_RM2', 'FL3_RM3', 'FL3_RM4', 'FL4_RM1', 'FL4_RM2', 'FL4_RM3', 'FL4_RM4']
    Property = ['B1', 'B2', 'B3', 'B4']
    d1 = datetime.strptime('03/01/2022', '%m/%d/%Y')
    d2 = datetime.strptime('08/08/2022', '%m/%d/%Y')
    timestamps = pd.date_range(d1, d2, freq="1min")
    return [{**elem, **{"Floor_Number": elem.get("room_id")[2]}} for elem in [
        {'ID'          : fake.random_number(digits=6),
         'Property num': np.random.choice(Property, p=[0.25, 0.25, 0.25, 0.25]),
         'room_id'     : np.random.choice(room_list),
         'Temp'        : np.random.randint(low=35, high=50),
         'noted Date'  : timestamps[x],
         'Status'      : np.random.choice(status_list),
         'Humidity'    : np.random.uniform(low=-35.09, high=70.00),
         'Dust'        : np.random.randint(low=2, high=5),
         'CO2 level'   : np.random.uniform(low=350.09, high=450.00)
         } for x in range(len(timestamps))]]

worker_df = pd.DataFrame(make_workers())
worker_df.head(30)

需求是为Temp和Humidity列插入异常值:

  • Temp:异常值需大于50或小于35(原范围35-50)
  • Humidity:异常值需超出-35.09至70.00的原范围

方法一:生成数据时直接插入异常值

修改生成函数,按指定概率在生成数据时插入异常值(示例设为5%异常概率):

from datetime import datetime
import numpy as np
import pandas as pd
from faker import Faker

fake = Faker()

def make_workers_with_outliers() -> list:
    status_list = ['in', 'out']
    room_list = ['FL1_RM1', 'FL1_RM2', 'FL1_RM3', 'FL1_RM4', 'FL2_RM1', 'FL2_RM2', 'FL2_RM3', 'FL2_RM4', 'FL3_RM1',
                 'FL3_RM2', 'FL3_RM3', 'FL3_RM4', 'FL4_RM1', 'FL4_RM2', 'FL4_RM3', 'FL4_RM4']
    Property = ['B1', 'B2', 'B3', 'B4']
    d1 = datetime.strptime('03/01/2022', '%m/%d/%Y')
    d2 = datetime.strptime('08/08/2022', '%m/%d/%Y')
    timestamps = pd.date_range(d1, d2, freq="1min")
    
    # 异常值出现概率
    outlier_prob = 0.05
    
    return [{**elem, **{"Floor_Number": elem.get("room_id")[2]}} for elem in [
        {
            'ID'          : fake.random_number(digits=6),
            'Property num': np.random.choice(Property, p=[0.25, 0.25, 0.25, 0.25]),
            'room_id'     : np.random.choice(room_list),
            # Temp异常值:一半概率生成<35的值,一半概率生成>50的值
            'Temp'        : np.random.choice(
                [np.random.randint(0,35), np.random.randint(51,70), np.random.randint(35,50)],
                p=[outlier_prob/2, outlier_prob/2, 1-outlier_prob]
            ),
            'noted Date'  : timestamps[x],
            'Status'      : np.random.choice(status_list),
            # Humidity异常值:一半概率生成<-35.09的值,一半概率生成>70.00的值
            'Humidity'    : np.random.choice(
                [np.random.uniform(-50.0, -35.1), np.random.uniform(70.1, 90.0), np.random.uniform(-35.09,70.00)],
                p=[outlier_prob/2, outlier_prob/2, 1-outlier_prob]
            ),
            'Dust'        : np.random.randint(low=2, high=5),
            'CO2 level'   : np.random.uniform(low=350.09, high=450.00)
        } for x in range(len(timestamps))]]

# 生成带异常值的数据集
worker_df_with_outliers = pd.DataFrame(make_workers_with_outliers())
worker_df_with_outliers.head(30)

方法二:在已有数据集上插入异常值

如果已生成原始数据集worker_df,可以随机替换部分行的值为异常值:

# 设置异常值占比
outlier_ratio = 0.05

# 为Temp列插入异常值
temp_outlier_indices = np.random.choice(worker_df.index, size=int(len(worker_df)*outlier_ratio), replace=False)
worker_df.loc[temp_outlier_indices, 'Temp'] = np.where(
    np.random.rand(len(temp_outlier_indices)) > 0.5,
    np.random.randint(51,70, size=len(temp_outlier_indices)),
    np.random.randint(0,35, size=len(temp_outlier_indices))
)

# 为Humidity列插入异常值
humidity_outlier_indices = np.random.choice(worker_df.index, size=int(len(worker_df)*outlier_ratio), replace=False)
worker_df.loc[humidity_outlier_indices, 'Humidity'] = np.where(
    np.random.rand(len(humidity_outlier_indices)) > 0.5,
    np.random.uniform(70.1,90.0, size=len(humidity_outlier_indices)),
    np.random.uniform(-50.0,-35.1, size=len(humidity_outlier_indices))
)

# 验证异常值插入结果
worker_df[['Temp','Humidity']].describe()

内容的提问来源于stack exchange,提问作者Jesse ansari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 03:06:40