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 |