期末实训作业很多学校都有这个
数据参数
列名 说明
Date 日期
Time 时间
Globalactivepower 该家庭所消耗的总有功功率(千瓦)
Globalreactivepower 该家庭消耗的总无功功率(千瓦)
Voltage 向家庭输送电力的电压(伏特)
Global_intensity 输送到家庭的平均电流强度(安培)
Submetering1 厨房消耗的有功功率(千瓦)
Submetering2 洗衣房所消耗的有功功率(千瓦)
Submetering3 电热水器和空调所消耗的有功功率(千瓦)
导入各种库:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from pyecharts.charts import Pie
from pyecharts.charts import *
import pyecharts.options as opts
from statsmodels.tsa.seasonal import seasonal_decompose
plt.rcParams['font.sans-serif'] = ['SimHei'] #设置中文字体为黑体
plt.rcParams['axes.unicode_minus'] = False #正常显示负号
pd.set_option('display.float_format',lambda x : '%.2f' % x)#pandas禁用科学计数法
import matplotlib.cm as cm
导入数据:
这个自己导入
#导入数据
data=pd.read_csv('./household_power_consumption.csv')
data.head(10)
数据预处理
#数据处理
#1.重命名
#2.时间格式转换
#3.缺失值处理
#4.异常值分析
data.rename(columns={
'Date':'日期',
'Time':'时间',
'Global_active_power':'有功功率',
'Global_reactive_power':'无功功率',
'Voltage':'电压',
'Global_intensity':'电流',
'Sub_metering_1': '厨房的有功功率',
'Sub_metering_2': '洗衣房的有功功率',
'Sub_metering_3': '电热水器和空调的有功功率',
},inplace=1)
data.head()
时间格式转换
#时间格式转换
data['日期']=data['日期'].str.replace('/07','/2007')
data['时间']=data['时间'].astype(str)
data['日期']=data['日期'].astype(str)
data['index'] = pd.to_datetime(data['日期'] +' '+ data['时间'],format='%d/%m/%Y %H:%M:%S',errors='coerce')
data=data.drop(['日期','时间'],axis=1)
data.head()
检查缺失值:
# 首先检查是否有缺失值
print(data.isnull().sum())
缺失值处理,我选择的是删除
#缺失值处理
# 删除包含缺失值的行
data = data.dropna()
# 再次检查是否还有缺失值
print(data.isnull().sum())
异常值处理:
#异常值处理
import seaborn as sns
# 绘制各个功率相关特征的箱型图
features_to_check = ['有功功率', '无功功率', '电压', '电流', '厨房的有功功率', '洗衣房的有功功率', '电热水器和空调的有功功率']
plt.figure(figsize=(12, 8))
for i, feature in enumerate(features_to_check, 1):
plt.subplot(2, 4, i)
sns.boxplot(data[feature])
plt.title(f'{feature} Boxplot')
plt.tight_layout()
plt.show()
异常值转换成空值
# 异常值处理
#把异常值转换成空值
data = data.replace('?',np.NAN)
data['厨房的有功功率'] = data['厨房的有功功率'].astype('float64')
data['洗衣房的有功功率'] = data['洗衣房的有功功率'].astype('float64')
data['总功率']=data['厨房的有功功率']+data['洗衣房的有功功率']+data['电热水器和空调的有功功率']
数据可视化
# 用电量可视化
sum_data = data[['厨房的有功功率', '洗衣房的有功功率', '电热水器和空调的有功功率']].sum()
# 自定义颜色
custom_colors = ['#99ff99', '#66b3ff', '#ff9999'] # 红色、蓝色、绿色
plt.figure(figsize=(8, 8)) # 设置图形大小
plt.pie(sum_data,
labels=['厨房的有功功率', '洗衣房的有功功率', '电热水器和空调的有功功率'],
colors=custom_colors, # 使用自定义颜色
autopct='%3.1f%%', # 显示百分比
startangle=140, # 起始角度
explode=[0.05]*len(sum_data), # 轻微分离各部分
shadow=True, # 添加阴影效果
wedgeprops={'edgecolor': 'black', 'linewidth': 1}) # 设置边缘颜色和线宽
plt.title('不同家电的有功功率占比', fontsize=16) # 设置标题
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0.) # 调整图例位置
plt.tight_layout() # 自动调整子图参数,使之整齐
plt.show()
折线图表示:
# 创建一个包含四个子图的图形
fig = plt.figure(figsize=(12, 8))
gs = gridspec.GridSpec(2, 2, width_ratios=[1, 1], height_ratios=[1, 1])
#分别表示
ax1 = plt.subplot(gs[0, 0])
ax1.plot(mon_sum.index, mon_sum['厨房的有功功率'], label='厨房的有功功率')
ax1.set_title('厨房的有功功率')
ax1.legend()
ax2 = plt.subplot(gs[0, 1])
ax2.plot(mon_sum.index, mon_sum['洗衣房的有功功率'], label='洗衣房的有功功率')
ax2.set_title('洗衣房的有功功率')
ax2.legend()
ax3 = plt.subplot(gs[1, 0])
ax3.plot(mon_sum.index, mon_sum['电热水器和空调的有功功率'], label='电热水器和空调的有功功率')
ax3.set_title('电热水器和空调的有功功率')
ax3.legend()
# 第四幅子图中绘制所有设备的有功功率
ax4 = plt.subplot(gs[1, 1])
lines = ax4.plot(mon_sum.index, mon_sum['厨房的有功功率'], 'b-',
mon_sum.index, mon_sum['洗衣房的有功功率'], 'g-',
mon_sum.index, mon_sum['电热水器和空调的有功功率'], 'r-')
ax4.set_title('所有设备的有功功率')
ax4.legend(lines, ['厨房的有功功率', '洗衣房的有功功率', '电热水器和空调的有功功率'])
# 调整子图布局
plt.tight_layout()
# 显示图形
plt.show()
后面还可在自己加一点!!!!