基于 Python 的實現:居民用電量數據分析與可視化

基于 Python 的實現:居民用電量數據分析與可視化

本文將介紹如何利用 Python 技術棧(包括 pymysql、pandas、matplotlib 等庫)對居民用電量數據進行分析和可視化,以幫助我們更好地理解用電行為模式。

數據準備

在MySQL數據庫中創建數據,,數據庫表結構如下:

  • date:記錄日期
  • resident:居民標識
  • consumption:當日用電量(千瓦時)
-- 創建表語句..
CREATE TABLE `daily_electricity` (`id` int NOT NULL AUTO_INCREMENT,`date` date NOT NULL,`resident` varchar(50) NOT NULL,`consumption` int NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `unique_record` (`date`,`resident`)
) ENGINE=InnoDB AUTO_INCREMENT=601 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;-- 插入數據語句..INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (1, '2025-02-27', '居民1', 26);
-- 更多數據記錄...

讀取數據

通過 pymysql 庫連接數據庫并獲取數據:

import pymysqldef fetch_data_from_db():"""從數據庫中讀取用電量數據"""connection = pymysql.connect(**DB_CONFIG)data = []try:with connection.cursor() as cursor:cursor.execute("SELECT date, resident, consumption FROM daily_electricity ORDER BY date, resident")data = cursor.fetchall()finally:connection.close()return data

數據處理

將獲取的數據轉換為 pandas DataFrame 格式,便于后續分析:

import pandas as pddef convert_to_dataframe(data):"""將數據轉換為 DataFrame 格式"""df = pd.DataFrame(data, columns=['date', 'resident', 'consumption'])df['date'] = pd.to_datetime(df['date'])return df

數據可視化

1. 折線圖:居民用電量趨勢

通過折線圖可以直觀觀察每個居民在不同日期的用電量變化趨勢:

def plot_trends(df):plt.figure(figsize=(12, 6))for resident, group in df.groupby('resident'):plt.plot(group['date'], group['consumption'], marker='o', linestyle='-', label=resident)plt.title('居民每日用電量趨勢')plt.xlabel('日期')plt.ylabel('用電量 (千瓦時)')plt.legend()plt.xticks(rotation=45)plt.grid(True)plt.tight_layout()plt.show()

在這里插入圖片描述

2. 柱狀圖:最近 7 天平均用電量對比

展示最近一周內各居民的平均用電量對比:

def plot_bar_chart(df):recent_df = df[df['date'] >= df['date'].max() - pd.Timedelta(days=7)]avg_consumption = recent_df.groupby('resident')['consumption'].mean().reset_index()plt.figure(figsize=(10, 5))plt.bar(avg_consumption['resident'], avg_consumption['consumption'], color='orange')plt.title('最近 7 天各居民平均用電量對比')plt.xlabel('居民')plt.ylabel('平均用電量 (千瓦時)')plt.xticks(rotation=0)plt.grid(True, axis='y')plt.tight_layout()plt.show()

在這里插入圖片描述

3. 餅圖:總用電量分布

展示各居民在統計周期內的總用電量占比:

def plot_pie_chart(df):total_consumption = df.groupby('resident')['consumption'].sum()plt.figure(figsize=(8, 8))plt.pie(total_consumption, labels=total_consumption.index, autopct='%1.1f%%', startangle=90, shadow=True, explode=[0.05] * len(total_consumption))plt.title('各居民總用電量占比')plt.axis('equal')plt.tight_layout()plt.show()

在這里插入圖片描述

4. 熱力圖:每周用電量分布

通過熱力圖觀察不同星期幾和不同周的用電量分布模式:

def plot_heatmap(df):df['weekday'] = df['date'].dt.day_name()df['week_number'] = df['date'].dt.isocalendar().weekweekly_data = df.groupby(['week_number', 'weekday'])['consumption'].mean().unstack()weekday_order = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']weekly_data = weekly_data.reindex(columns=weekday_order)plt.figure(figsize=(12, 8))plt.imshow(weekly_data, cmap='YlOrRd')plt.colorbar(label='平均用電量 (千瓦時)')plt.title('每周用電量熱力圖')plt.xticks(np.arange(len(weekday_order)), weekday_order, rotation=45)plt.yticks(np.arange(len(weekly_data.index)), weekly_data.index)plt.xlabel('星期')plt.ylabel('周數')for i in range(len(weekly_data.index)):for j in range(len(weekday_order)):if not pd.isna(weekly_data.iloc[i, j]):plt.text(j, i, f"{weekly_data.iloc[i, j]:.1f}", ha="center", va="center", color="black" if weekly_data.iloc[i, j] < 30 else "white")plt.tight_layout()plt.show()

在這里插入圖片描述

5. 箱線圖:用電量分布情況

展示各居民用電量的分布特征(中位數、四分位數、異常值等):

def plot_boxplot(df):plt.figure(figsize=(10, 6))plt.boxplot([df[df['resident'] == resident]['consumption'] for resident in df['resident'].unique()], labels=df['resident'].unique())plt.title('各居民用電量分布箱線圖')plt.xlabel('居民')plt.ylabel('用電量 (千瓦時)')plt.grid(True, linestyle='--')plt.tight_layout()plt.show()

在這里插入圖片描述

主程序與執行流程

完整的代碼執行流程如下:

if __name__ == "__main__":# 從數據庫讀取數據fetched_data = fetch_data_from_db()df = convert_to_dataframe(fetched_data)# 繪制各種圖表plot_trends(df)plot_bar_chart(df)plot_pie_chart(df)plot_heatmap(df)plot_boxplot(df)

通過多種圖表形式直觀展示用電模式和趨勢。這種分析方法有助于:

  1. 識別用電高峰和低谷時段
  2. 發現異常用電行為
  3. 制定個性化的節能策略
  4. 優化社區能源分配

共享源代碼:

1、數據庫數據:

INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (1, '2025-02-27', '居民1', 26);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (2, '2025-02-27', '居民2', 35);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (3, '2025-02-27', '居民3', 28);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (4, '2025-02-27', '居民4', 33);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (5, '2025-02-27', '居民5', 25);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (6, '2025-02-28', '居民1', 29);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (7, '2025-02-28', '居民2', 35);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (8, '2025-02-28', '居民3', 33);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (9, '2025-02-28', '居民4', 37);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (10, '2025-02-28', '居民5', 32);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (11, '2025-03-01', '居民1', 23);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (12, '2025-03-01', '居民2', 24);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (13, '2025-03-01', '居民3', 17);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (14, '2025-03-01', '居民4', 20);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (15, '2025-03-01', '居民5', 19);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (16, '2025-03-02', '居民1', 37);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (17, '2025-03-02', '居民2', 32);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (18, '2025-03-02', '居民3', 31);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (19, '2025-03-02', '居民4', 40);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (20, '2025-03-02', '居民5', 33);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (21, '2025-03-03', '居民1', 30);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (22, '2025-03-03', '居民2', 31);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (23, '2025-03-03', '居民3', 29);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (24, '2025-03-03', '居民4', 25);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (25, '2025-03-03', '居民5', 21);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (26, '2025-03-04', '居民1', 20);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (27, '2025-03-04', '居民2', 25);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (28, '2025-03-04', '居民3', 18);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (29, '2025-03-04', '居民4', 20);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (30, '2025-03-04', '居民5', 25);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (31, '2025-03-05', '居民1', 17);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (32, '2025-03-05', '居民2', 20);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (33, '2025-03-05', '居民3', 17);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (34, '2025-03-05', '居民4', 20);
INSERT INTO `jm_ysl`.`daily_electricity` (`id`, `date`, `resident`, `consumption`) VALUES (35, '2025-03-05', '居民5', 16);
INSERT INTO `jm_ysl`.`daily_electricity` (

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77625.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77625.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77625.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Flow原理

fun main() {runBlocking {launch {flow4.collect{println("---collect-4")}println("---flow4")}}val flow4 flow<Boolean>{delay(5000)emit(false) } 我們分析下整個流程 1.flow為什么之后在collect之后才會發送數據 2.collect的調用流程 我…

設備接入與APP(應用程序)接入華為云iotDA平臺的路徑元素有哪些不同?

目錄 壹、設備接入華為云iotDA &#x1f3e2; 形象比喻&#xff1a;設備 員工&#xff0c;IoTDA 平臺 安保森嚴的總部大樓 一、&#x1f4cd; 平臺接入地址 總部大樓地址 二、&#x1f9fe; 接入憑證 出入證 / 門禁卡 / 工牌 1. 設備密鑰或證書 2. 預置接入憑證密鑰&a…

JavaScript基礎知識合集筆記2——數組排序、數組轉換字符串、迭代方法

文章目錄 排序方法reverse()sort() 轉換方法join() 迭代方法some()every()forEach()filter()map() 排序方法 組有兩個方法可以用來對元素重新排序&#xff1a; reverse()sort() reverse() 顧名思義&#xff0c;將數組元素方向反轉。會直接改變原數組&#xff0c;請謹慎使用…

Redis 筆記(三)-Redis 基本知識及五大數據類型

一、redis 基本知識 redis 默認有 16個 數據庫&#xff0c;config get databases 查看數據庫數量 127.0.0.1:6379> config get databases # 查看數據庫數量 1) "databases" 2) "16"默認使用的是第 0個 16 個數據庫為&#xff1a;DB 0 ~ DB 15&am…

springboot項目文件上傳到服務器本機,返回訪問地址

文件上傳到服務器本機&#xff0c;然后給出訪問地址&#xff1a; 具體如下&#xff1a; 1、添加必要的工具類依賴 <!-- 文件上傳工具類 --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId>…

巧用 Element - UI 實現圖片上傳按鈕的智能隱藏

引言 在前端開發中&#xff0c;使用 Element - UI 組件庫來構建用戶界面是非常常見的操作。其中圖片上傳功能更是在許多項目中頻繁出現&#xff0c;比如用戶頭像上傳、商品圖片上傳等場景。有時候&#xff0c;我們會有這樣的需求&#xff1a;當上傳圖片達到一定數量后&#xf…

Golang|工廠模式

工廠模式是一種創建型設計模式&#xff0c;它的核心思想是&#xff1a;把對象的創建過程封裝起來&#xff0c;不直接在代碼中 new 一個對象&#xff0c;而是通過一個“工廠”來生成對象。這樣做的好處是&#xff1a; 降低了代碼之間的耦合&#xff08;依賴具體類減少&#xff0…

CentOS 使用國內鏡像安裝 nvm 和 Node.js 完整指南

前言?&#xff1a; 本文是實踐過程中的個人總結&#xff0c;介紹在 CentOS 系統上通過國內鏡像快速安裝 nvm&#xff08;Node Version Manager&#xff09;&#xff0c;并配置鏡像源加速 Node.js 的下載和依賴管理&#xff0c;解決因網絡問題導致的安裝失敗或速度緩慢。 一、…

ComfyUI 學習筆記:安裝篇及模型下載

背景 去年在掘金看到一個博主使用 ComfyUI 進行 AI 繪畫&#xff0c;并基于此工具展開個人業務。知道了這個東西&#xff0c;感覺很厲害的樣子。 前段時間玩 DeepSeek 的時候&#xff0c;嘗試用它寫《歷史是一群喵》的漫畫&#xff0c;給出了 AI 作畫的提示詞&#xff0c;但是…

人腦、深思考大模型與其他大模型的區別科普

文章目錄 大模型的基本概念與特點深思考大模型的獨特之處深思考大模型與其他大模型的對比架構與技術訓練數據應用場景提示詞編寫 大模型給出答案的方式&#xff1a;基于概率還是真的會分析問題&#xff1f;人腦的思考過程基本單位與網絡大腦結構與功能分區信息處理流程思維模式…

圖像保邊濾波之BEEPS濾波算法

目錄 1 簡介 2 算法原理 3 代碼實現 4 演示Demo 4.1 開發環境 4.2 功能介紹 4.3 下載地址 參考 1 簡介 BEEPS&#xff08;Bias Elimination in Edge-Preserving Smoothing&#xff09; 是一種基于偏微分方程&#xff08;PDE&#xff09;的邊緣保留平滑濾波算法。它能夠…

怎樣給MP3音頻重命名?是時候管理下電腦中的音頻文件名了

在處理大量音頻文件時&#xff0c;給這些文件起一個有意義的名字可以幫助我們更高效地管理和查找所需的內容。通過使用專業的文件重命名工具如簡鹿文件批量重命名工具&#xff0c;可以極大地簡化這一過程。本文將詳細介紹如何利用該工具對 MP3 音頻文件進行重命名。 步驟一&am…

uniapp實現統一添加后端請求Header方法

uniapp把請求寫完了&#xff0c;發現需要給接口請求添加頭部&#xff0c;每個接口去添加又很麻煩&#xff0c;uniapp可以統一添加&#xff0c;并且還能給某些接口設置不添加頭部。 一般用于添加token登錄驗證信息。 在 main.js 文件中配置。 代碼如下&#xff1a; // 在…

Qt/C++面試【速通筆記四】—Qt中的MVC模式

在軟件開發中&#xff0c;設計模式是為了讓代碼結構更加清晰、可維護和擴展的工具。MVC&#xff08;Model-View-Controller&#xff0c;模型-視圖-控制器&#xff09;模式就是其中一種經典的設計模式&#xff0c;它被廣泛應用于圖形界面&#xff08;GUI&#xff09;應用程序中。…

機器學習-入門-線性模型(2)

機器學習-入門-線性模型(2) 3.4廣義線性回歸 一般形式&#xff1a; y g ? 1 ( w T x b ) y g^{-1} \left( w^T x b \right) yg?1(wTxb) 單調可微的聯系函數 (link function) 令 g ( ? ) ln ? ( ? ) g(\cdot) \ln (\cdot) g(?)ln(?) 則得到對數線性回歸 ln ?…

Scratch——第20課 輾轉相除法/繩子算法

輾轉相除法是用于求取最大公約數時需要用到的方法&#xff0c;它還有個名字稱為繩子算法&#xff0c;這類題目只要理解輾轉相處的原理即可拿下。 一、輾轉相除法的基本原理 兩個整數的最大公約數不變&#xff0c;當較大數減去較小數后&#xff0c;得到的差值與較小數的最大公…

【Keil5-開發指南】

Keil5-編程指南 ■ Keil5 介紹■ Keil5 生成bin文件■ 新建工程后debug在 BX R0 不動了■ J-Flash 使用■ Keil5-Debug調試工具 Jlink---STLink---DAP仿真器■ Keil5 使用 AStyle插件格式化代碼■ Keil5-編譯4個階段■ Keil5-Boot和APP配置■ Keil5-報錯■ 芯片手冊區別 ■ Kei…

HarmonyOS SDK助力鴻蒙版今日水印相機,真實地址防護再升級

今日水印相機是一款真實記錄"工作"和"生活"的水印拍照APP。作為專業的可信影像服務平臺&#xff0c;今日水印相機依托時間、地點、身份三重數字水印技術&#xff0c;為企業和個人提供考勤打卡、外勤巡檢、生活美好時刻記錄等場景的可信存證服務。 面對虛擬…

WSL釋放空間

在 WSL (Windows Subsystem for Linux) 中&#xff0c;Linux 發行版可能會占用越來越多的磁盤空間&#xff0c;即使刪除文件后&#xff0c;空間也可能不會自動釋放。這是因為 WSL 使用虛擬硬盤&#xff08;VHDX 文件&#xff09;來存儲 Linux 文件系統&#xff0c;而 Windows 不…

C#核心知識

委托 如何聲明一個委托&#xff1a;通過 【delegate 返回值類型 委托名稱】 的格式來定義 如何使用一個委托&#xff1a;使用new關鍵字&#xff0c;并傳入和聲明委托的構造相同的方法名&#xff0c;比如&#xff1a;new 委托名稱(與委托的參數和返回值相同的一個方法名) 如何…