任务一:对用户信心更新表和登陆信息表进行长宽转换
需求说明:通过对数据的描述性统计、以及时间数据信息提取,分组聚合操作已经获得了相当多的信息,但用户信息更新表和登录信息表是长表,而主表是宽表,需要通过长宽表转换将数据合并在一张以用户编号为主键的表内。
任务二:插补用户用电量数据缺失值
需求说明:用户用电量数据呈现一定的周期性关系, missing data.csv表中存放了用户A、用户B 和用户C的用电量数据,其中存在缺失值,需要进行缺失值插补才能进行下一步分析。
任务三:合并线损、用电量趋势与线路告警数据
需求说明:线路线损数据、线路用电量趋势下降数据和线路告警数据是识别用户窃漏电与否的3个重要特征,需要对由线路编号(ID)和时间(date)两个键值构成的主键进行合并。
任务四:标准化建模专家样本数据
需求说明:为了消除特征之间量纲和和取值范围差异可能会造成的影响,需要对数据进行标准化处理。对线路线损特征、线路用电量趋势下降特征、线路告警特征进行标准化有助于后续分析的准确性。
"""
# @Time : 2020/5/21
# @Author : JM
"""
import pandas as pd
logInfo = pd.read_csv('./data/Training_LogInfo.csv', encoding='gbk')
userUpdate = pd.read_csv('./data/Training_Userupdate.csv', encoding='gbk')
LogInfo_pivot = pd.pivot_table(logInfo, index='Idx', columns=['LogInfo1'], aggfunc='count')
print('用LogInfo1作为分组键创建的登录信息表\n', LogInfo_pivot.head())
UserUpdate_pivot = pd.pivot_table(userUpdate, index='Idx', columns=['UserupdateInfo1'], aggfunc='count')
print('用UserupdateInfo1作为分组键创建的用户信息更新表\n', UserUpdate_pivot.head())
LogInfo_cross = pd.crosstab(index=logInfo['Idx'], columns=logInfo['LogInfo1'])
print('用LogInfo1作为分组键创建的登录信息表\n', LogInfo_cross.head())
Userupdate_cross = pd.crosstab(index=userUpdate['Idx'], columns=userUpdate['UserupdateInfo1'])
print('用UserupdateInfo1作为分组键创建的用户信息更新表\n', Userupdate_cross.head())
"""
# @Time : 2020/5/21
# @Author : JM
"""
import pandas as pd
import numpy as np
from scipy.interpolate import lagrange
arr = np.array([0, 1, 2])
missing_data = pd.read_csv("./data/missing_data.csv", names=arr)
data = pd.read_csv("./data/missing_data.csv", names=arr)
print("lagrange插值前(False为缺失值所在位置)", '\n', missing_data.notnull())
for i in range(0, 3):
la = lagrange(missing_data.loc[:, i].dropna().index, missing_data.loc[:, i].dropna().values)
list_d = list(set(np.arange(0, 21)).difference(set(missing_data.loc[:, i].dropna().index)))
missing_data.loc[list_d, i] = la(list_d)
print("第%d列缺失值的个数为 %d" % (i, missing_data.loc[:, i].isnull().sum()))
print("lagrange插值后(False为缺失值所在位置)", "\n", missing_data.notnull())
"""
# @Time : 2020/5/21
# @Author : JM
"""
import pandas as pd
el = pd.read_csv('./data/ele_loss.csv', encoding='gbk')
al = pd.read_csv('./data/alarm.csv', encoding='gbk')
print('ele_loss表的形状为', el.shape)
print('alarm表的形状为', al.shape)
merge = pd.merge(el, al, left_on=['ID', 'date'], right_on=['ID', 'date'], how='inner')
print("合并后的表形状为:", merge.shape)
print("合并后的表为:", merge)
"""
# @Time : 2020/5/21
# @Author : JM
"""
import pandas as pd
import numpy as np
def standard(data):
data = (data - data.mean()) / data.std()
return data
def mms(data):
data = (data - data.min()) / (data.max() - data.min())
return data
def ds(data):
data = data / 10 ** np.ceil(np.log10(data.abs().max()))
return data
m1 = pd.read_csv('./data/model.csv', encoding='gbk')
s = standard(m1)
print('标准化后的数据为', '\n', s.head())
s = mms(m1)
print('离差标准化后的数据为', '\n', s.head())
d = ds(m1)
print('小数定标差标准化的数据为', '\n', d.head())