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
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...