Python工具箱系列(三十三)

来源:https://www.cnblogs.com/shanxihualu/archive/2023/05/26/17434151.html
-Advertisement-
Play Games

Timescaledb 在物聯網時代,出現了大量以時間為中心海量產生的感測器數據,稱為時序數據。這類數據的特點是: 數據記錄總有一個時間戳。 數據幾乎總是追加,不更新也不刪除。 大量使用近期的數據。很少更新或者回填時間間隔的缺失數據。 與時間間隔頻率關係不大。但累積的數據量大,可能會有峰值。 對這類 ...


Timescaledb

在物聯網時代,出現了大量以時間為中心海量產生的感測器數據,稱為時序數據。這類數據的特點是:

  • 數據記錄總有一個時間戳。

  • 數據幾乎總是追加,不更新也不刪除。

  • 大量使用近期的數據。很少更新或者回填時間間隔的缺失數據。

  • 與時間間隔頻率關係不大。但累積的數據量大,可能會有峰值。

  • 對這類數據有多種聚合查詢的需求,並且越快越好。例如,截止到目前為止,最大值/最小值/平均值是多少,數據流速是多少等。

為此,IT界興起了時序資料庫。TimeScaleDB是其中的佼佼者,截止到2022年7月,它的排名在第5名,值得使用。由於TimeScaleDB是postgresql的一個插件,因此非常便於安裝與使用。同時,它也是一個開源的時間序列資料庫,為快速獲取和複雜查詢進行了優化。此外,它也是多模型設計,在體現與時序數據相關的特性外,它執行的是“完整的SQL”,程式員很容易使用與管理它。

它的安裝不複雜。使用以下命令在ubuntu bionic下安裝單機版本。

apt install -y gnupg postgresql-common apt-transport-https lsb-release wget
/usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
echo "deb https://packagecloud.io/timescale/timescaledb/ubuntu/ $(lsb_release -c -s) main" > /etc/apt/sources.list.d/timescaledb.list
wget --quiet -O - https://packagecloud.io/timescale/timescaledb/gpgkey | apt-key add -
apt update
apt install -y timescaledb-2-postgresql-14
# 做一個調整
timescaledb-tune --quiet --yes
# 重新啟動資料庫服務
systemctl restart postgresql

# 以postgres用戶啟動命令行
su postgres -c psql

# 在psql命令行環境中。輸入以下命令,從而關聯到timescaledb這個擴展上。
CREATE database sensordb;
\c sensordb
CREATE EXTENSION IF NOT EXISTS timescaledb;
\q

# 再次連接
su postgres -c 'psql -d sensordb'
# 顯示擴展列表(extensions)
\dx

一、創建時序相關得表

在sensordb下創建測試用的表,這個創建的過程有些特殊。相關命令如下:

 

# 感測器表,傳統的表
CREATE TABLE sensors(
  id SERIAL PRIMARY KEY,
  type VARCHAR(50),
  location VARCHAR(50)
);

# 感測器資料庫,這個將轉換成為超表
CREATE TABLE sensor_data (
  time TIMESTAMP NOT NULL,
  sensor_id INTEGER,
  pm25 DOUBLE PRECISION,
  temperature DOUBLE PRECISION,
  FOREIGN KEY (sensor_id) REFERENCES sensors (id)
);

# CREATE EXTENSION IF NOT EXISTS timescaledb;

# 轉換為超表
SELECT create_hypertable('sensor_data', 'time');

# 生成4個感測器
INSERT INTO sensors (type, location) VALUES
('a','地板'),
('a', '天花板'),
('b','地板'),
('b', '天花板');

# 測試一下。
select * from sensors;

 

接下來,使用python連接時序資料庫,並且模擬相關的數據插入到表中。

二、使用Python模擬數據

 

import psycopg2
import random
import datetime

# 事先創建後資料庫demodb
demodb = psycopg2.connect(database="sensordb", user="postgres",
                          password="88488848", host="172.17.2.151", port="5432")

democur = demodb.cursor()

currenttime = datetime.datetime.now()

# 插入模擬出來的數據。
for _ in range(100000):
    currenttime = currenttime+datetime.timedelta(seconds=1)
    for id in range(1,5,1):
        pm25 = random.uniform(0, 300)
        temp = random.uniform(0, 40)
        insertsql = f'''insert into sensor_data(sensor_id,pm25,temperature,time) values({id},{pm25},{temp},'{currenttime}')'''
        democur.execute(insertsql)
    demodb.commit()

democur.close()
demodb.close()

 

這裡插入10萬秒的數據,相當於100000/86400=1.15(天)的數據。在插入數據的同時,就可以同時在資料庫中進行按30分鐘的分桶查詢,這是時序資料庫的一個特殊功能。

# su postgres -c 'psql -d sensordb'

SELECT
  time_bucket('30 minutes', time) AS period,
  AVG(temperature) AS avg_temp,
  last(temperature, time) AS last_temp,
  AVG(pm25) AS avg_pm25
FROM sensor_data
GROUP BY period;

SELECT
  time_bucket('60 minutes', time) AS period,
  AVG(temperature) AS avg_temp,
  last(temperature, time) AS last_temp,
  AVG(pm25) AS avg_pm25
FROM sensor_data
GROUP BY period;

此時,按30分鐘時間視窗聚會的數據查詢效果如下圖所示:

可以看出,TimeScaleDB已經將數據按30分鐘來聚合分析。當然,改成任意時間也是可以的,例如,可以改成5秒分析一次也可以,生成結果的時間也非常快。

 


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

-Advertisement-
Play Games
更多相關文章
  • 列表分類是指在Word文檔中使用不同格式排序的列表,來幫助我們一目瞭然地表達出一段文字的主要內容。比如,當我們描述了某個主題的若幹點,就可以用列表把它們一一表達出來,而不是寫成完整的段落形式。同時,列表也可以幫助我們做出精確的計算和比較,簡潔有效地表示出不同部分之間的關係。在Word文檔中創建列表可 ...
  • Java SDK 併發包里提供了豐富的原子類,我們可以將其分為五個類別,這五個類別提供的方法基本上是相似的,並且每個類別都有若幹原子類。 ...
  • ## 教程簡介 Angular Material是Angular JS開發人員的UI組件庫。 Angular Material的可重用UI組件有助於構建有吸引力,一致且功能強大的Web頁面和Web應用程式,同時遵循現代Web設計原則,如瀏覽器可移植性,設備獨立性和優雅降級。 [Angular Mat ...
  • AIGC Hackathon 2023 北京站 我參加了選手採訪提綱,這裡我感覺有些點可以分享給大家。之前復盤的鏈接: 下麵是採訪我的回答內容: ## 1. 請向大家簡單介紹一下自己吧? - 子木,社區名稱為程式員泥瓦匠,年齡三十歲,畢業於溫州醫科大學。 - 有8年SaaS經驗,曾在有贊和售後寶等S ...
  • # Rust async 編程 Asynchronous Programming in Rust: 中文書名《Rust 非同步編程指南》: Rust語言聖經(Rust Course): ## 一、[Getting Started](https://rust-lang.github.io/async-b ...
  • - 題目描述: 輸入單行英文句子,裡面包含英文字母,空格以及,.?三種標點符號,請將句子內每個單詞進行倒序,並輸出倒序後的語句 - 輸入描述: 輸入字元串 S, S 的長度 1≤N≤100 - 輸出描述: 輸出逆序後的字元串。 - 解題思路: 遍歷給定句子,判斷如果字母,則插入到指定位置,如果是指定 ...
  • > 本教程計劃通過100天的時間,每天分享一篇關於python的知識點,與大家一起學習python這門編程語言。 Python 對初學者來說是一門很棒的語言: - 容易學 - 有一個積極的支持社區 - 在網路開發、游戲、數據科學方面提供多種機會。 ## Python的應用領域 目前Python在We ...
  • 本節我們看看Netty的傳輸(全是乾貨,自帶水杯 # 一、Java的NIO和OIO 流經網路的數據總是具有相同的類型:位元組。這些位元組是如何流動的主要取決於我們所說的網路傳輸。 ## 1.1 OIO 我們先來看一段Java的阻塞應用程式程式: ```java package com.example.j ...
一周排行
    -Advertisement-
    Play Games
  • MQTTnet 是一個高性能的MQTT類庫,支持.NET Core和.NET Framework。 MQTTnet 原理: MQTTnet 是一個用於.NET的高性能MQTT類庫,實現了MQTT協議的各個層級,包括連接、會話、發佈/訂閱、QoS(服務質量)等。其原理涉及以下關鍵概念: MqttCli ...
  • 在WPF中,源屬性(Source Property)指的是提供數據的屬性,通常是數據模型或者其他控制項的屬性,而目標屬性(Target Property)則是數據綁定的目標,通常是綁定到控制項的屬性,例如TextBlock的Text屬性。數據綁定將源屬性的值自動更新到目標屬性中。 主要包含以下幾個事件: ...
  • async/await 是 C# 中非同步編程的關鍵特性,它使得非同步代碼編寫更為簡單和直觀。下麵深入詳細描述了 async/await 的使用場景、優點以及一些高級使用方法,並提供了相應的實例源代碼。 使用場景: I/O 操作: 非同步編程特別適用於涉及 I/O 操作(如文件讀寫、網路請求等)的場景。在 ...
  • 使用過office的visio軟體畫圖的小伙伴都知道,畫圖軟體分為兩部分,左側圖形庫,存放各種圖標,右側是一個畫布,將左側圖形庫的圖標控制項拖拽到右側畫布,就會生成一個新的控制項,並且可以自由拖動。那如何在WPF程式中,實現類似的功能呢?今天就以一個簡單的小例子,簡述如何在WPF中實現控制項的拖拽和拖動,... ...
  • 1、Blazor Hybrid簡介 Blazor Hybrid 使開發人員能夠將桌面和移動本機客戶端框架與 .NET 和 Blazor 結合使用。在 Blazor Hybrid 應用中,Razor 組件在設備上是本機運行的。 這些組件通過本地互操作通道呈現到嵌入式 Web 視圖控制項。 組件不在瀏覽器 ...
  • 除了內置的數據集,scikit-learn還提供了隨機樣本的生成器。通過這些生成器函數,可以生成具有特定特性和分佈的隨機數據集,以幫助進行機器學習演算法的研究、測試和比較。 目前,scikit-learn庫(v1.3.0版)中有20個不同的生成樣本的函數。本篇重點介紹其中幾個具有代表性的函數。 1. ...
  • 從0到1,手把手帶你開發截圖工具ScreenCap------002實現通過文件對話框,選擇合適的文件夾,自定義預設的圖片保存位置,簡單易學 ...
  • 每次談到容器的時候,除了Docker之外,都會說起 Kubernetes,那麼什麼是 Kubernetes呢?今天就來一起學快速入門一下 Kubernetes 吧!希望本文對您有所幫助。 Kubernetes,一種用於管理和自動化雲中容器化工作負載的工具。 想象一下你有一個管弦樂隊,將每個音樂家視為 ...
  • 目錄 基本說明 安裝 Nginx 部署 VUE 前端 部署 Django 後端 Django admin 靜態文件(CSS,JS等)丟失的問題 總結 1. 基本說明 本文介紹了在 windows 伺服器下,通過 Nginx 部署 VUE + Django 前後端分離項目。本項目前端運行在 80 埠 ...
  • 從0到1,手把手帶你開發截圖工具ScreenCap------003實現最小化程式到托盤運行,- 為了方便截圖乾凈,實現最小化程式到托盤運行,簡潔,勿擾,實現最小化程式到托盤運行, 實現托盤菜單功能,實現回顯主窗體, 實現托盤開始截屏, 實現氣泡信息提示,實現托盤程式提示,實現托盤退出程式, 封裝完... ...