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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...