家庭用电数据分析与 Prophet 时间序列预测
家庭用电数据分析与 Prophet 时间序列预测。文章基于 Kaggle 提供的 24 万条家庭用电记录,使用 Python 进行数据清洗与探索性分析。通过可视化展示功率、电压等指标的相关性。利用 Facebook Prophet 模型对有功功率、无功功率及电压等关键指标进行未来半年的趋势预测,展示了 Prophet 在季节性时间序列处理上的优势与鲁棒性。

家庭用电数据分析与 Prophet 时间序列预测。文章基于 Kaggle 提供的 24 万条家庭用电记录,使用 Python 进行数据清洗与探索性分析。通过可视化展示功率、电压等指标的相关性。利用 Facebook Prophet 模型对有功功率、无功功率及电压等关键指标进行未来半年的趋势预测,展示了 Prophet 在季节性时间序列处理上的优势与鲁棒性。

240000-household-electricity-consumption-records 数据集包含了一个家庭 6 个月的用电数据,收集于 2007 年 1 月至 2007 年 6 月。这些数据包括全球有功功率、全球无功功率、电压、全球强度、分项计量 1(厨房)、分项计量 2(洗衣房)和分项计量 3(电热水器和空调)等信息。该数据集共有 260,640 个测量值。
| 列名 | 说明 |
|---|---|
| Date | 日期 |
| Time | 时间 |
| Globalactivepower | 该家庭所消耗的总有功功率(千瓦) |
| Globalreactivepower | 该家庭消耗的总无功功率(千瓦) |
| Voltage | 向家庭输送电力的电压(伏特) |
| Global_intensity | 输送到家庭的平均电流强度(安培) |
| Submetering1 | 厨房消耗的有功功率(千瓦) |
| Submetering2 | 洗衣房所消耗的有功功率(千瓦) |
| Submetering3 | 电热水器和空调所消耗的有功功率(千瓦) |
导入数据集并读取头部
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data_path = "./household_power_consumption.csv"
df = pd.read_csv(data_path, index_col='index')
df.head()

对 DataFrame 中的数值列进行统计
df.describe()

查看 DataFrame 中各列的数据类型
df.dtypes

转换数据格式
from tqdm.auto import tqdm
from ipywidgets import HBox, FloatProgress, HTML
# 将'Date'列转换为日期时间格式
df['Date'] = pd.DatetimeIndex(df['Date'])
# 定义需要转换为数字的列
make_em_num = ['Global_active_power', 'Global_reactive_power', 'Voltage', 'Global_intensity', 'Sub_metering_1', 'Sub_metering_2', 'Sub_metering_3']
# 定义一个函数,将字符串转换为浮点数,如果转换失败则返回 0
def floating(string):
try:
return float(string)
except:
return float(0)
# 遍历需要转换为数字的列
for column in tqdm(make_em_num):
df[column] = df[column].apply(lambda item: floating(item))
# 创建一个水平布局,包含一个浮点进度条和一个 HTML 元素
HBox(children=(FloatProgress(value=0.0, max=7.0), HTML(value='')))
查看转换效果,转换后的数据类型
df.dtypes

查看转换效果,转换后的数据头部
df.head()

绘制相关系数热力图。使用 Seaborn 库中的 heatmap 函数来绘制一个热力图,展示数据框 df 中各列之间的相关性
import seaborn as sns
sns.heatmap(df.drop(['Date','Time'], axis=1).corr(), annot=True)

Prophet 是一种基于可加性模型预测时间序列数据的程序,其中非线性趋势可以按年度、每周和每日的季节性,以及假日效应进行拟合。它最适合于具有强烈季节效应的时间序列和有几个季节的历史数据。Prophet 对于缺失的数据和趋势的变化是稳健的,并且通常能够很好地处理异常值。
获取 DataFrame 的形状
from prophet import Prophet
df.shape

通过 Prophet 对有功功率和电压进行预测
# 从数据框中随机抽取 10000 行
df = df.sample(n=10000)
# 定义一个函数,用于使用 Prophet 模型进行预测
def prophet_forecaster(data, x, y, period=100):
# 创建一个新的数据框,包含日期和目标变量
new_df = pd.DataFrame(columns=['ds', 'y'])
new_df['ds'] = data[x]
new_df['y'] = data[y]
# 创建一个 Prophet 模型
model = Prophet()
# 使用新的数据框进行模型训练
model.fit(new_df)
# 创建未来日期的数据框
future_dates = model.make_future_dataframe(periods=period)
# 使用模型进行预测
forecast = model.predict(future_dates)
# 绘制预测结果
model.plot(forecast)
# 设置图表标题
plt.title(f"Forecasting on the next {period} days for {y}")
# 使用 Prophet 模型对 Global_active_power 进行预测
prophet_forecaster(df, x='Date', y='Global_active_power', period=180)
# 使用 Prophet 模型对 Global_reactive_power 进行预测
prophet_forecaster(df, x='Date', y='Global_reactive_power', period=180)
# 使用 Prophet 模型对 Voltage 进行预测
prophet_forecaster(df, x='Date', y='Voltage', period=180)
# 使用 Prophet 模型对 Global_intensity 进行预测
prophet_forecaster(df, x='Date', y='Global_intensity', period=180)
未来半年有功功率预测结果:

未来半年无功功率预测结果

未来半年电压预测结果:

未来半年电流预测结果


微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online