20数学建模校赛C题数据清理思路

也就是这个看起来平平无奇的题目,我们觉得C题还能做
在这里插入图片描述
首先导入文件,导入库

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pandas import DataFrame,Series
import seaborn as sns
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
data=pd.read_csv(r"D:/markdown/数学建模/附件3.3:2020校赛C题/2020校赛C题/附件/list1.csv",encoding="gbk")

第一步,显然是删nan值了(excel里是NULL,也不知道为啥导到pandas里就变成了NAN,不慌,影响不大),顺便看看还剩多少数据

data=data.dropna(axis=0,how='any')
data.shape

然后删完了nan,下一步干啥,这是一个问题

我们思考了好久这个问题

先看看数据分布吧

data.describe()

沉默。沉默是今晚的康桥……

我们分析的核心是室内温度,呐看看室内温度

print(data["ROOM_TEMPERATURE"].skew())
sns.distplot(data["ROOM_TEMPERATURE"].dropna())

20数学建模校赛C题数据清理思路_第1张图片
那么问题来了
我们知道自然条件下数据趋近正态分布,有点偏度无所谓,你这么大一片0杵在这有点突兀啊!

那么为什么

于是按时间排序,室内温度给画个图

 data_ROOM_TEMPERATURE = data.groupby('SYS_READ_TIME').mean()['ROOM_TEMPERATURE']

也没看出啥玩意来

然后注意到了这个在这里插入图片描述
呐分户吧,按地址

def func_address(x):
    data1=data[(data.address_2nd==x)]
    #按时间排序
    data1_ROOM_TEMPERATURE = data1.groupby('SYS_READ_TIME').mean()['ROOM_TEMPERATURE']
    # 按照索引排序
#     data1_ROOM_TEMPERATURE.sort_index(inplace=True)
    # 画出趋势图
    # 图太小了,设置下size
    plt.figure(figsize=(20,5))
    data1_ROOM_TEMPERATURE.plot(title=x)
    
address = [15311251,15310819,15310974,15310804,15311234,15311289,15311072,15311061,15310846,15311065,15311477,15311342,15311245,15310966,
15311191,15311361,15310827,15311411,15311196,15311471,15311235,15311403,15311233,15310808,15311383,15311473,15310839,15310815,15310845,
15311082]
for i in range(len(address)):
    x = address[i]
    func_address(x)
    i+=1

于是发现,有的户大片时间室温为0

为什么呢?室温自然条件下一定是波动的,你连续几天几个月一整个冬天都为0怎么
这显然是不正常的啊!

只能是供暖公司没去获得他的室温

这玩意应该跟设置室温有关系吧
画个图整到一块儿瞅瞅

def func_all(x):
    data1=data[(data.address_2nd==x)]
    #按时间排序
    data1_ROOM_TEMPERATURE = data1.groupby('SYS_READ_TIME').mean()['ROOM_TEMPERATURE']
    data1_ROOM_SET_TEMPERATURE = data1.groupby('SYS_READ_TIME').mean()['ROOM_SET_TEMPERATURE']
    # 按照索引排序
#     data1_ROOM_TEMPERATURE.sort_index(inplace=True)
    # 画出趋势图
    # 图太小了,设置下size
    plt.figure(figsize=(20,5))
    data1_ROOM_TEMPERATURE.plot(title=x,color = 'red',label='ROOM_TEMPERATURE')
    data1_ROOM_SET_TEMPERATURE.plot(title=x,color = 'blue',label='ROOM_SET_TEMPERATURE')
    
address = [15311251,15310819,15310974,15310804,15311234,15311289,15311072,15311061,15310846,15311065,15311477,15311342,15311245,15310966,
15311191,15311361,15310827,15311411,15311196,15311471,15311235,15311403,15311233,15310808,15311383,15311473,15310839,15310815,15310845,
15311082]
for i in range(len(address)):
    x = address[i]
    func_all(x)
    i+=1

于是惊奇的发现,室温为0跟设置室温为0的时间段是重合的

于是我们认为,设置室温为0就是这一家人不想用暖气了,于是公司就没必要去获得他们家室温了

emmmmmmmmm很完美

那就删了吧,顺便看看还剩多少数据

data= data.drop(data[(data['ROOM_TEMPERATURE']==0) & (data['ROOM_SET_TEMPERATURE']==0)].index)
data.shape

现在室温就差不多是正态分布了(看图说话)
于是看看均值以外三倍标准差的数据

mean, std = data["ROOM_TEMPERATURE"].mean(), data["ROOM_TEMPERATURE"].std()
lower, upper = mean - 3 * std, mean + 3 * std

print("均值:", mean)
print("标准差:", std)
print("下限:", lower)
print("上限:", upper)
data["ROOM_TEMPERATURE"][(data["ROOM_TEMPERATURE"] < lower) | (data["ROOM_TEMPERATURE"] > upper)]

画个箱线图

sns.boxplot(data=data["ROOM_TEMPERATURE"])

于是我们认为这部分数据是异常

(实际操作中我们是在删完其他影响后最后箱线图去除了这部分数据)

删了吧,顺便看看还剩多少数据

data = data.drop(data[(data["ROOM_TEMPERATURE"] < lower) | (data["ROOM_TEMPERATURE"] > upper)].index)
data.shape

接下来我们瞅瞅,看看这些影响室温的因素

阀门状态,进出水温度,进出水温差,设置室温,流速,功率

其中,我们认为阀门状态,进出水温差,设置室温,流速,这些影响可以体现在功率上(经过队友严格和不严格的公式推导及联系实际的猜测)

于是我们按以上分析温度的方法分析了功率的异常

首先看看功率的分布

print(data["ROOM_TEMPERATURE"].skew())
sns.distplot(data["ROOM_TEMPERATURE"].dropna())

20数学建模校赛C题数据清理思路_第2张图片
又是一大片0杵在这啊!

那么为什么
根据之前分析温度的经验,我们分户画功率图,跟温度画在一起

def func_all(x):
    data1=data[(data.address_2nd==x)]
    #按时间排序
    data1_ROOM_TEMPERATURE = data1.groupby('SYS_READ_TIME').mean()['ROOM_TEMPERATURE']
    data1_ROOM_SET_TEMPERATURE = data1.groupby('SYS_READ_TIME').mean()['ROOM_SET_TEMPERATURE']
    data1_POWER = data1.groupby('SYS_READ_TIME').mean()['POWER']
    # 按照索引排序
#     data1_ROOM_TEMPERATURE.sort_index(inplace=True)
    # 画出趋势图
    # 图太小了,设置下size
    plt.figure(figsize=(20,5))
    data1_ROOM_TEMPERATURE.plot(title=x,color = 'red',label='ROOM_TEMPERATURE')
    data1_ROOM_SET_TEMPERATURE.plot(title=x,color = 'blue',label='ROOM_SET_TEMPERATURE')
    data1_POWER.plot(title=x,color = 'green',label='POWER')
    
address = [15311251,15310819,15310974,15310804,15311234,15311289,15311072,15311061,15310846,15311065,15311477,15311342,15311245,15310966,
15311191,15311361,15310827,15311411,15311196,15311471,15311235,15311403,15311233,15310808,15311383,15311473,15310839,15310815,15310845,
15311082]
for i in range(len(address)):
    x = address[i]
    func_all(x)
    i+=1

于是看到,除了个别家里功率一直为0或一大段时间为0,所有户家里功率为0都是集中在前面17年十一月,和18年四月

于是我们认为,这段时间公司还没开始供暖,或供暖已经结束了

删了吧,顺便看看还剩多少数据

data= data.drop(data[(data['POWER']<=0)].index)
data.shape

emmmmmmm右偏有点严重,没事删完异常就好了(或许也可以对数转换,既然题目说删了就行那就不费劲了黑黑黑)

(实际操作中这一部分也是删完其他最后搞的)

还是先看看均值以外三倍标准差的数据

mean, std = data["POWER"].mean(), data["POWER"].std()
lower, upper = mean - 3 * std, mean + 3 * std

print("均值:", mean)
print("标准差:", std)
print("下限:", lower)
print("上限:", upper)
data["POWER"][(data["POWER"] < lower) | (data["POWER"] > upper)]

箱线图

sns.boxplot(data=data["POWER"])

删数据,顺便看看还剩多少

data = data.drop(data[(data["POWER"] < lower) | (data["POWER"] > upper)].index)

emmmmm呐还有什么问题嘛

20数学建模校赛C题数据清理思路_第3张图片
温差怎么能小于0呢?

于是队长查资料去了,回来说进水温度小于出水温度,这是异常

好说,删了吧,顺便看看还剩多少数据

data= data.drop(data[(data['dtemp']<=0)].index)
data.shape

队长:等等,怎么还有阀门全关流速不为0的?

于是队长excel一番骚操作,发现这一波一共50个数据,集中在一户人家里的两天时间

队长说,可能是热表坏了,那两天去修热表了吧

20数学建模校赛C题数据清理思路_第4张图片
好说,删删删!

data= data.drop(data[(data['ROOM_TEMPERATURE']==0) & (data['ROOM_SET_TEMPERATURE']==0)].index)
data.shape

至此,附件一的数据完美就处理完了

嗨皮!!!

当然,把整理完的附件二左连接过来之后又发现了一部分室外温度的缺失,也就删了

完美!!!
20数学建模校赛C题数据清理思路_第5张图片

你可能感兴趣的:(python#数据分析,python,数据分析,数学建模)