【數據分析】針對家庭用電數據進行時序分析(1)

来源:https://www.cnblogs.com/benu17/archive/2023/09/26/17730657.html
-Advertisement-
Play Games

0. 數據說明 本項目所用數據集包含了一個家庭6個月的用電數據,收集於2007年1月至2007年6月。 這些數據包括有功功率、無功功率、電壓、電流強度、分項計量1(廚房)、分項計量2(洗衣房)和分項計量3(電熱水器和空調)等信息。該數據集共有260,640個測量值,可以為瞭解家庭用電情況提供重要的見 ...


0. 數據說明

本項目所用數據集包含了一個家庭6個月的用電數據,收集於2007年1月至2007年6月。
這些數據包括有功功率、無功功率、電壓、電流強度、分項計量1(廚房)、分項計量2(洗衣房)和分項計量3(電熱水器和空調)等信息。該數據集共有260,640個測量值,可以為瞭解家庭用電情況提供重要的見解。

我們要感謝databeats團隊提供這個數據集。如果你在你的研究中使用這個數據集,請註明原作者:Georges Hébrail 和 Alice Bérard。

欄位含義對照表:

列名 說明
Date 日期
Time 時間
Globalactivepower 除分項計量外所消耗的總有功功率(千瓦)
Globalreactivepower 該家庭消耗的總無功功率(千瓦)
Voltage 向家庭輸送電力的電壓(伏特)
Global_intensity 輸送到家庭的平均電流強度(安培)
Submetering1 廚房消耗的有功功率(千瓦)
Submetering2 洗衣房所消耗的有功功率(千瓦)
Submetering3 電熱水器和空調所消耗的有功功率(千瓦)
數據來源:
https://www.kaggle.com/datasets/thedevastator/240000-household-electricity-consumption-records

其他說明:
有功功率是保持用電設備正常運行所需的電功率,也就是將電能轉換為其他形式能量(機械能、光能、熱能)的電功率。比如:5.5千瓦的電動機就是把5.5千瓦的電能轉換為機械能,帶動水泵抽水或脫粒機脫粒;各種照明設備將電能轉換為光能,供人們生活和工作照明。無功功率比較抽象,它是用於電路內電場與磁場的交換,並用來在電氣設備中建立和維持磁場的電功率。它不對外作功,而是轉變為其他形式的能量。凡是有電磁線圈的電氣設備,要建立磁場,就要消耗無功功率。比如40瓦的日光燈,除需40多瓦有功功率(鎮流器也需消耗一部分有功功率)來發光外,還需80乏左右的無功功率供鎮流器的線圈建立交變磁場用。由於它不對外做功,才被稱之為“無功”。

1. 前期工作

1.1 導包

import numpy as np
import pandas as pd
from pyecharts.charts import *
import pyecharts.options as opts
from statsmodels.tsa.seasonal import seasonal_decompose
import matplotlib.pyplot as plt
# plt.rcParams['axes.unicode_minus']=False
# plt.rcParams['font.sans-serif'] = ['SimHei']```

1.2 讀取數據

# 數據路徑
data_path = r'/home/mw/input/Household_Electricity4767/household_power_consumption.csv'
# 讀取數據
df = pd.read_csv(data_path,index_col='index')
# 預覽數據
df.head()

輸出結果:

index Date Time Global_active_power Global_reactive_power Voltage Global_intensity Sub_metering_1 Sub_metering_2 Sub_metering_3
0 16/12/2006 17:24:00 4.216 0.418 234.840 18.400 0.000 1.000 17.000
1 16/12/2006 17:25:00 5.360 0.436 233.630 23.000 0.000 1.000 16.000
2 16/12/2006 17:26:00 5.374 0.498 233.290 23.000 0.000 2.000 17.000
3 16/12/2006 17:27:00 5.388 0.502 233.740 23.000 0.000 1.000 17.000
4 16/12/2006 17:28:00 3.666 0.528 235.680 15.800 0.000 1.000 17.000

2. 數據處理

2.1 數據預覽

# 將列名替換為中文
df.rename(columns={
    'Date': '日期',
    'Time': '時間',
    'Global_active_power': '有功功率',
    'Global_reactive_power': '無功功率',
    'Voltage': '電壓',
    'Global_intensity': '電流',
    'Sub_metering_1': '廚房的有功功率',
    'Sub_metering_2': '洗衣房的有功功率',
    'Sub_metering_3': '電熱水器和空調的有功功率',
    },inplace=1)
# 再次預覽前5行數據
df.head()  # 列名改成中文順眼多了

輸出結果:

日期 時間 有功功率 無功功率 電壓 電流 廚房的有功功率 洗衣房的有功功率 電熱水器和空調的有功功率
16/12/2006 17:24:00 4.216 0.418 234.84 18.4 0.0 1.0 17.0
16/12/2006 17:25:00 5.36 0.436 233.63 23.0 0.0 1.0 16.0
16/12/2006 17:26:00 5.374 0.498 233.29 23.0 0.0 2.0 17.0
16/12/2006 17:27:00 5.388 0.502 233.74 23.0 0.0 1.0 17.0
16/12/2006 17:28:00 3.666 0.528 235.68 15.8 0.0 1.0 17.0

解惑:

0、為什麼這樣導包?
a:這樣導包的主要原因是為了方便使用這些庫中的函數和類。具體來說:

- `import numpy as np`:將`numpy`庫導入,並將其命名為`np`,這樣我們在調用`numpy`庫中的函數或類時,可以使用`np`作為首碼,比如`np.array()`。
- `import pandas as pd`:將`pandas`庫導入,並將其命名為`pd`,這樣我們在調用`pandas`庫中的函數或類時,可以使用`pd`作為首碼,比如`pd.DataFrame()`。
- `from pyecharts.charts import *`:從`pyecharts.charts`模塊中導入所有的類和函數,這樣我們在調用`pyecharts`庫中的函數或類時,可以直接使用其名稱,比如`Line()`。
- `import pyecharts.options as opts`:將`pyecharts.options`模塊導入,並將其命名為`opts`,這樣我們在調用`pyecharts`庫中的選項時,可以使用`opts`作為首碼,比如`opts.Title()`。
- `from statsmodels.tsa.seasonal import seasonal_decompose`:從`statsmodels.tsa.seasonal`模塊中導入`seasonal_decompose`函數,這樣我們在調用該函數時,可以直接使用其名稱。
- `import matplotlib.pyplot as plt`:將`matplotlib.pyplot`模塊導入,並將其命名為`plt`,這樣我們在調用`matplotlib`庫中的函數或類時,可以使用`plt`作為首碼,比如`plt.plot()`。
- `plt.rcParams['axes.unicode_minus']=False`和`plt.rcParams['font.sans-serif'] = ['SimHei']`:這兩行代碼是為了設置`matplotlib`庫的顯示參數,使得中文可以正常顯示,並且減少負號顯示的問題。

1、pyecharts.options這個模塊是做什麼的?
a:pyecharts.options模塊是pyecharts庫中的一個子模塊,主要用於定義可視化圖形的各種選項參數,例如圖形的標題、坐標軸的標簽、圖例的樣式等等。pyecharts庫是一個基於echarts庫的Python可視化庫,提供了多種類型的可視化圖表,包括柱狀圖、折線圖、散點圖、地圖等等,pyecharts.options模塊的作用就是為這些圖表提供各種選項參數,以便用戶可以根據自己的需求來自定義圖表的外觀和樣式。例如,可以使用opts.Title()函數來設置圖表的標題,使用opts.Legend()函數來設置圖例的樣式,使用opts.Toolbox()函數來添加工具欄等等。這些選項參數可以通過鏈式調用來設置,例如:

from pyecharts.charts import Bar
import pyecharts.options as opts

bar = Bar()
bar.add_xaxis(["A", "B", "C", "D", "E"])
bar.add_yaxis("Series", [10, 20, 30, 40, 50])
bar.set_global_opts(title_opts=opts.Title(text="Bar Chart", subtext="Example"),
                     legend_opts=opts.Legend(pos_right="10%"),
                     toolbox_opts=opts.Toolbox())
bar.render("bar.html")

上面的代碼中,我們使用opts.Title()函數設置了圖表的標題,使用opts.Legend()函數設置了圖例的位置,使用opts.Toolbox()函數添加了工具欄,並將這些選項參數傳遞給set_global_opts()方法來設置全局選項。
2、pyecharts.charts呢?
a:pyecharts.charts模塊是pyecharts庫中的一個子模塊,主要用於創建各種類型的可視化圖表,例如柱狀圖、折線圖、散點圖、地圖等等。pyecharts庫是一個基於echarts庫的Python可視化庫,提供了多種類型的可視化圖表,pyecharts.charts模塊的作用就是為這些圖表提供各種方法和屬性,以便用戶可以根據自己的需求來創建和自定義圖表。例如,可以使用Line()函數創建一個折線圖,然後使用add_xaxis()函數和add_yaxis()函數來添加數據,最後使用set_global_opts()函數來設置圖表的全局選項,如下所示:

from pyecharts.charts import Line
import pyecharts.options as opts

line = Line()
line.add_xaxis(["A", "B", "C", "D", "E"])
line.add_yaxis("Series", [10, 20, 30, 40, 50])
line.set_global_opts(title_opts=opts.Title(text="Line Chart", subtext="Example"),
                     legend_opts=opts.Legend(pos_right="10%"))
line.render("line.html")

上面的代碼中,我們使用Line()函數創建了一個折線圖,使用add_xaxis()函數和add_yaxis()函數添加了數據,使用set_global_opts()函數設置了圖表的標題和圖例位置,並將這些選項參數傳遞給set_global_opts()方法來設置全局選項。最後,使用render()函數將圖表渲染成HTML文件。
3、from statsmodels.tsa.seasonal import seasonal_decompose呢?
a:from statsmodels.tsa.seasonal import seasonal_decompose這行代碼是從statsmodels.tsa.seasonal模塊中導入了seasonal_decompose函數。statsmodels是一個Python庫,提供了各種統計模型和方法,包括時間序列分析、回歸分析、統計模型檢驗等等。tsatime series analysis的縮寫,表示時間序列分析,其中seasonal表示季節性分析,seasonal_decompose函數用於對季節性時間序列進行分解,將其分解為趨勢、季節和殘差三個部分。這個函數的主要作用是幫助用戶瞭解時間序列數據的季節性變化趨勢,從而更好地進行數據分析和預測。在使用該函數時,需要將時間序列數據作為函數的參數傳遞進去,並指定季節周期的長度。例如:

from statsmodels.tsa.seasonal import seasonal_decompose
import pandas as pd

# 創建一個季節性時間序列
data = pd.DataFrame({'date': pd.date_range(start='2022-01-01', end='2022-12-31', freq='D'),
                     'value': [i % 7 + 1 for i in range(365)]})

# 對時間序列進行季節性分解
result = seasonal_decompose(data['value'], model='additive', period=7)

# 輸出分解結果
print(result.trend)
print(result.seasonal)
print(result.resid)
print(result.observed)

上面的代碼中,我們首先創建了一個季節性時間序列,然後使用seasonal_decompose()函數對其進行季節性分解,其中model參數指定了分解模型,可以是additivemultiplicativeperiod參數指定了季節周期的長度,這裡我們指定為7,表示一周的周期。最後,我們輸出了分解結果中的趨勢、季節和殘差三個部分,以及原始數據。
4、import matplotlib.pyplot as plt這個呢?
a:import matplotlib.pyplot as plt是將matplotlib.pyplot模塊導入,並將其命名為plt,這樣我們在調用matplotlib庫中的函數或類時,可以使用plt作為首碼,比如plt.plot()matplotlib是一個Python繪圖庫,提供了各種類型的圖表,包括線性圖、散點圖、柱狀圖、餅圖等等,pyplotmatplotlib庫中的一個子模塊,提供了一些方便的函數和工具,可以幫助用戶更方便地進行圖表繪製和數據可視化。例如,可以使用plot()函數來繪製線性圖,使用scatter()函數來繪製散點圖,使用bar()函數來繪製柱狀圖等等。以下是一個簡單的例子:

import matplotlib.pyplot as plt

# 創建數據
x = [1, 2, 3, 4, 5]
y = [10, 20, 30, 40, 50]

# 繪製線性圖
plt.plot(x, y)

# 添加標題和坐標軸標簽
plt.title("Line Chart")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")

# 顯示圖表
plt.show()

上面的代碼中,我們首先創建了一個包含5個數據點的線性數據,然後使用plot()函數繪製了這些數據的線性圖,使用title()函數、xlabel()函數和ylabel()函數添加了標題和坐標軸標簽,最後使用show()函數顯示圖表。
5、df = pd.read_csv(data_path,index_col='index'),index_col是什麼?
a:index_colpandas.read_csv()函數中的一個參數,用於指定將哪一列作為數據的索引(行標簽)。預設情況下,read_csv()函數會自動為數據生成一個整數索引,但是在某些情況下,我們可能需要將某一列作為數據的索引,這時就可以使用index_col參數。例如,如果我們有一個包含日期和數值的CSV文件,想要將日期作為數據的索引,可以使用以下代碼:

import pandas as pd

data_path = 'data.csv'
df = pd.read_csv(data_path, index_col='date')

在上面的代碼中,我們使用read_csv()函數讀取了一個CSV文件,並將其中的date列作為數據的索引。這樣,我們就可以通過日期來索引和操作數據了。如果不指定index_col參數,則預設使用第一列作為數據的索引。
6、索引是用來幹嘛的,為什麼要指定?
a:索引是用來標識和訪問數據的標簽或鍵,它可以幫助我們更方便地對數據進行操作和分析。在pandas庫中,索引分為行索引和列索引兩種。行索引用於標識和訪問數據行,列索引用於標識和訪問數據列。

pandas中,數據的索引可以由用戶指定,也可以由系統自動生成。如果數據沒有指定索引,則預設使用從0開始的整數索引。但是,在某些情況下,我們可能需要根據數據的特性或需求來指定索引,例如,如果數據中包含日期或時間等信息,我們可以將其作為索引,便於按時間序列進行分析和操作;如果數據中有某一列唯一標識每個數據項,則可以將其作為索引,便於按照該列進行數據查找和聚合。

指定索引可以讓我們更方便地訪問和操作數據,例如,可以通過索引來選擇特定的行或列,可以通過索引來對數據進行排序、切片、分組和聚合等操作。因此,在讀取數據時,根據數據的特性和需求來指定索引是一個很好的選擇。
7、rcParams

plt.rcParams['axes.unicode_minus']=False
plt.rcParams['font.sans-serif'] = ['SimHei']:
這兩行代碼是為了設置matplotlib庫的顯示參數,使得中文可以正常顯示,並且減少負號顯示的問題。

8、inplace = 1什麼意思?
a:inplacepandas庫中很多方法的一個可選參數,用於指示是否將修改應用到原DataFrame中。如果inplace=True,則會直接在原DataFrame上進行修改,並返回None;如果inplace=False(預設值),則會返回一個新的DataFrame,原DataFrame不會改變。

使用inplace=True可以提高代碼的效率,避免在記憶體中創建新的對象,特別是當數據集很大時。但是,需要註意的是,這樣會直接修改原始數據,可能會影響到後續的操作。因此,在使用inplace參數時,需要謹慎考慮是否需要在原始數據上進行修改。

在上面的代碼中,使用了inplace=1,這相當於inplace=True,表示直接在原DataFrame上進行修改。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 環境:Windows,cmake,gcc,g++,CLion 一、下載源碼 二、解壓並構建(我是怎麼知道的?) 進入處於解壓目錄的cmd視窗 輸入以下命令cmake以下 使用以下命令構建 100%即構建成功 找到這些東西,複製到CLion項目中,文件結構在後面 我這裡是先創建一個gtest目錄,在g ...
  • 不知道大家平時開發響應式前端代碼是如何調試的?是不是也跟我一樣,通過瀏覽器的開發者工具來切換不同的界面尺寸來看驗證效果呢? 可能是因為習慣了,平時就不停的切換不同尺寸來看效果。直到TJ君看到今天要推薦的這個免費工具,我才發現之前的調試方式好傻... 使用體驗 下麵,我們還一起來看看今天要推薦的這款名 ...
  • 3.1、環境搭建 創建名為spring_mvc_demo的新module,過程參考2.1節 3.1.1、創建SpringMVC的配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.o ...
  • 共兩個依賴的需提前安裝的第三方庫:requests和bs4庫 cmd命令行輸入安裝requests庫:pip3 install -i https://pypi.douban.com/simple requests 安裝bs4庫:pip3 install -i https://pypi.douban. ...
  • Matplotlib 庫是一個用於數據可視化和繪圖的 Python 庫。 它提供了大量的函數和類,可以幫助用戶輕鬆地創建各種類型的圖表,包括直方圖、箱形圖、散點圖、餅圖、條形圖和密度圖等。 本系列具體內容包括: 畫布 畫布是其他所有的元素的載體,可以說是最重要,也是最容易被忽視的元素。 繪製圖形之前 ...
  • Context本質 golang標準庫里Context實際上是一個介面(即一種編程規範、 一種約定)。 type Context interface { Deadline() (deadline time.Time, ok bool) Done() <-chan struct{} Err() err ...
  • Merkle 樹(Merkle Tree)是一種樹狀數據結構,通常用於驗證大規模數據集的完整性和一致性。它的名字來源於其發明者 Ralph Merkle。Merkle 樹在密碼學、分散式系統和區塊鏈等領域得到廣泛應用,尤其在區塊鏈中,它用於驗證交易和區塊的完整性,確保數據不被篡改。 下麵是 Merk ...
  • 歡迎訪問我的GitHub 這裡分類和彙總了欣宸的全部原創(含配套源碼):https://github.com/zq2599/blog_demos 關於《Strimzi Kafka Bridge(橋接)實戰》 在strimzi技術體系中,橋接(bridge)是很要的功能,內容也很豐富,因此將橋接相關的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...