Python数据分析第四章作业 Pandas

题目来源: <<Python数据分析与应用>> 人民邮电出版社 张良均等编著
最后一次编辑时间: 2019-8-8

meger方法未完善
小数定标标准化未完善
拉格朗日插值未完善

题目

任务1插补用户用电量数据缺失值
1.需求说明
用户用电量数据呈现一定的周期性关系, missing data.csv表中存放了用户A、用户B 和用户C的用电量数据,其中存在缺失值,需要进行缺失值插补才能进行下一步分析。
2.实现思路及步骤

(1)读取 missing data. csv表中的数据。
(2)查询缺失值所在位置。
(3)使用 SciPy库中 Interpolate模块中的 lagrange对数据进行拉格朗日插值。
(4)查看数据中是否存在缺失值,若不存在则说明插值成功。

任务2合并线损、用电量趋势与线路告警数据
1.需求说明
线路线损数据、线路用电量趋势下降数据和线路告警数据是识别用户窃漏电与否的3个重要特征,需要对由线路编号(ID)和时间(date)两个键值构成的主键进行合并。
2.实现思路及步骤

(1)读取ele_loss. csv和 alarm. csv表。
(2)查看两表的形状。
(3)以1D和date两个键值作为主键进行内连接。
(4)查看合并后的数据。

任务3标准化建模专家样本数据
1.需求说明
为了消除特征之间量纲和和取值范围差异可能会造成的影响,需要对数据进行标准化处理。对线路线损特征、线路用电量趋势下降特征、线路告警特征进行标准化有助于后续分析的准确性。
4.实现思路及步骤

(1)读取model. csv数据。
(2)定义标准差标准化函数。
(3)使用函数分别对3列数据进行标准化。
(4)查看标准化后的数据。






解答

任务1

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
data = pd.read_csv('./data/missing_data.csv',encoding='utf-8')
data.shape
(20, 3)
data.head()
235.8333 324.0343 478.3231
0 236.2708 325.6379 515.4564
1 238.0521 328.0897 517.0909
2 235.9063 NaN 514.8900
3 236.7604 268.8324 NaN
4 NaN 404.0480 486.0912
null_sum = data.isnull().sum()
null_sum
235.8333    2
324.0343    4
478.3231    4
dtype: int64
notnull_sum = data.notnull().sum()
notnull_sum
235.8333    18
324.0343    16
478.3231    16
dtype: int64
null_rate = null_sum / notnull_sum
null_rate
235.8333    0.111111
324.0343    0.250000
478.3231    0.250000
dtype: float64
null_row = np.where(np.isnan(data))[0] # 缺失值所在行
null_col = np.where(np.isnan(data))[1] # 缺失值所在列
null_index = np.array([i for i in zip(null_row, null_col)])

null_index
array([[ 2,  1],
       [ 3,  2],
       [ 4,  0],
       [ 6,  2],
       [ 9,  1],
       [ 9,  2],
       [11,  0],
       [15,  2],
       [18,  1],
       [19,  1]], dtype=int64)
pd.isnull(data).head()
235.8333 324.0343 478.3231
0 False False False
1 False False False
2 False True False
3 False False True
4 True False False
data.dropna(how='any', axis=0 , inplace=True)
data
235.8333 324.0343 478.3231
0 236.2708 325.6379 515.4564
1 238.0521 328.0897 517.0909
5 237.4167 391.2652 516.2330
7 237.6042 388.0230 435.3508
8 238.0313 206.4349 487.6750
10 235.5313 400.0787 660.2347
12 234.4688 395.2343 611.3408
13 235.5000 344.8221 643.0863
14 235.6354 385.6432 642.3482
16 236.0000 409.6489 602.9347
17 235.2396 416.8795 589.3457
data.isnull().sum()
235.8333    0
324.0343    0
478.3231    0
dtype: int64

任务2

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
data1 = pd.read_csv('./data/ele_loss.csv', encoding='gbk')
data1.head()
ID date ele loss
0 21261001 2010/9/1 1091.5 0.169615
1 21261001 2010/9/2 1079.5 0.145556
2 21261001 2010/9/3 858.0 0.151048
3 21261001 2010/9/6 883.5 0.162778
4 21261001 2010/9/7 1027.5 0.133186
data2 = pd.read_csv('./data/alarm.csv', encoding='gbk')
data2.head()
ID date alarm
0 21261001 2012/10/11 电压断相
1 21261001 2012/10/10 A相电流过负荷
2 21261001 2010/9/3 电流不平衡
3 21261001 2010/9/6 C相电流过负荷
4 21261001 2010/5/13 电流不平衡
data1.shape, data2.shape
((49, 4), (25, 3))
pd.merge(data1,data2)
ID date ele loss alarm
0 21261001 2010/9/3 858.0 0.151048 电流不平衡
1 21261001 2010/9/6 883.5 0.162778 C相电流过负荷
2 21261001 2010/9/16 915.5 0.162028 C相电流过负荷
3 21261001 2010/9/16 915.5 0.162028 C相电流过负荷
4 21261001 2010/9/17 961.0 0.166650 A相电流过负荷
5 21261001 2010/9/17 961.0 0.166650 电流不平衡
# pd.merge(data1, data2, left_on='ID', right_on='date',how='inner')

任务3

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
data = pd.read_csv('./data/model.csv', encoding='gbk')
data.head()
电量趋势下降指标 线损指标 告警类指标 是否窃漏电
0 4.0 1.0 1.0 1.0
1 4.0 0.0 4.0 1.0
2 2.0 1.0 1.0 1.0
3 9.0 0.0 0.0 0.0
4 3.0 1.0 0.0 0.0
# 离差标准化
def normalization(data):
    data = (data - data.min()) / (data.max() - data.min())
    return data
# 标准差标准化
def standarlization(data):
    data = (data - data.mean()) / data.std()
    return data
data1 = data.loc[:, '电量趋势下降指标']
data2 = data.loc[:, '线损指标']
data3 = data.loc[:, '告警类指标']
# 离差标准化前
data.iloc[:,0:3].head(10)
电量趋势下降指标 线损指标 告警类指标
0 4.0 1.0 1.0
1 4.0 0.0 4.0
2 2.0 1.0 1.0
3 9.0 0.0 0.0
4 3.0 1.0 0.0
5 2.0 0.0 0.0
6 5.0 0.0 2.0
7 3.0 1.0 3.0
8 3.0 0.0 0.0
9 4.0 1.0 0.0
# 离差标准化后
data = normalization(data)
data.iloc[:,0:3].head(10)
电量趋势下降指标 线损指标 告警类指标
0 0.4 1.0 0.25
1 0.4 0.0 1.00
2 0.2 1.0 0.25
3 0.9 0.0 0.00
4 0.3 1.0 0.00
5 0.2 0.0 0.00
6 0.5 0.0 0.50
7 0.3 1.0 0.75
8 0.3 0.0 0.00
9 0.4 1.0 0.00
# 标准差标准化后
data = standarlization(data)
data.iloc[:,0:3].head(10)
电量趋势下降指标 线损指标 告警类指标
0 0.612777 0.974549 -0.161216
1 0.612777 -1.022590 2.653616
2 -0.343352 0.974549 -0.161216
3 3.003099 -1.022590 -1.099494
4 0.134712 0.974549 -1.099494
5 -0.343352 -1.022590 -1.099494
6 1.090841 -1.022590 0.777061
7 0.134712 0.974549 1.715339
8 0.134712 -1.022590 -1.099494
9 0.612777 0.974549 -1.099494