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庫,提供了各種統計模型和方法,包括時間序列分析、回歸分析、統計模型檢驗等等。tsa
是time 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
參數指定了分解模型,可以是additive
或multiplicative
,period
參數指定了季節周期的長度,這裡我們指定為7,表示一周的周期。最後,我們輸出了分解結果中的趨勢、季節和殘差三個部分,以及原始數據。
4、import matplotlib.pyplot as plt這個呢?
a:import matplotlib.pyplot as plt
是將matplotlib.pyplot
模塊導入,並將其命名為plt
,這樣我們在調用matplotlib
庫中的函數或類時,可以使用plt
作為首碼,比如plt.plot()
。matplotlib
是一個Python繪圖庫,提供了各種類型的圖表,包括線性圖、散點圖、柱狀圖、餅圖等等,pyplot
是matplotlib
庫中的一個子模塊,提供了一些方便的函數和工具,可以幫助用戶更方便地進行圖表繪製和數據可視化。例如,可以使用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_col
是pandas.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:inplace
是pandas
庫中很多方法的一個可選參數,用於指示是否將修改應用到原DataFrame中。如果inplace=True
,則會直接在原DataFrame上進行修改,並返回None
;如果inplace=False
(預設值),則會返回一個新的DataFrame,原DataFrame不會改變。
使用inplace=True
可以提高代碼的效率,避免在記憶體中創建新的對象,特別是當數據集很大時。但是,需要註意的是,這樣會直接修改原始數據,可能會影響到後續的操作。因此,在使用inplace
參數時,需要謹慎考慮是否需要在原始數據上進行修改。
在上面的代碼中,使用了inplace=1
,這相當於inplace=True
,表示直接在原DataFrame上進行修改。