A Guide to Querying GridDB Timeseries Containers with TQL and Python¶
Introduction¶
In today's world, handling time series data in a quick and efficient way is crucial for several high-impact applications, such as IoT, industrial monitoring, and research. GridDB, a highly scalable and robust NoSQL database, is specifically designed for such workloads. GridDB offers native support for specialized data objects for storing time series data. These are called timeseries containers and help with fast and reliable data ingestion.
In this blog, we'll use the Intel Lab sensor data to demonstrate how to store, query, and analyze this data using GridDB’s TQL (Time-series Query Language) and Python. We will also extract insights efficiently and see how GridDB makes working with high-volume timeseries data user-friendly and intuitive. Let's dive right in.
from IPython.display import display, HTML
image_path = 'round-icons-otzESK2sBG4-unsplash.png'
width = 500
display(HTML(f"""
<div style="text-align: center;">
<img src="{image_path}" style="width:80%; max-width:500px;"><br>
<span style="font-size:1.2em; color: #555;">
Illustration by
<a href="https://unsplash.com/@roundicons?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Round Icons</a>
on
<a href="https://unsplash.com/illustrations/a-computer-chip-with-a-red-yellow-and-green-color-scheme-otzESK2sBG4?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
</span>
</div>
"""))
Installing pre-requsities - Libraries¶
#File system and I/O operations
import os
from io import BytesIO
# Data manipulation
import pandas as pd
import numpy as np
from IPython.display import Image
# Time functions
import math
import time
from datetime import datetime, timedelta
# Data Gathering
import requests
import zipfile
#Encoding and Serialization
import base64
import json
#Debugging
import http
http.client.HTTPConnection.debuglevel = 0
#Visualization Libraries
import plotly.graph_objects as go
import plotly.express as px
import pycountry
import kaleido
About the Intel Lab Dataset & Attribution¶
The Intel Lab dataset contains data collected from 54 sensors deployed in the Intel Berkeley Research lab between February 28th and April 5th, 2004. The sensors collected humidity, temperature, voltage and light. While the floor plan of the sensors's placement has been shared in an image; the coordinates have also been provided in a flat file along with the dataset. The data is available in a compressed format as a '.gz' file. The data has more than 2 Million rows.
The Intel Lab Data was collected and made available through the efforts of Peter Bodik, Wei Hong, Carlos Guestrin, Sam Madden, Mark Paskin, and Romain Thibaux, with support from Intel Berkeley and the TinyOS team. Special thanks to Mark Paskin for aggregating connectivity data and generating the network layout, and to Sam Madden and Wei Hong for developing TinyDB and logging infrastructure. This dataset is hosted by MIT CSAIL and was last modified by Samuel Madden on June 2, 2004.
Accessing the Dataset¶
To download the Intel Lab Dataset, access the URL - https://db.csail.mit.edu/labdata/labdata.html. Access the file having the location co-ordinates (x and y-coordinates) of the sensors (mote_locs.txt), and the file having the sensor readings (data.txt.gz). Extract the compressed file to access the data.
##Specify the path to your image file
image_path = 'Dataset_Download.png'
width = 1700
## Display the image
Image(filename=image_path, width=width)
Dataset Download Instructions¶
To download the Intel Lab Dataset: In the Dataset page shared above,
- Click on the link labeled “This file” to download the compressed sensor readings file:
- data.txt.gz will begin downloading automatically.
- Also download the sensor location file:
- Click on mote_locs.txt to get the sensor coordinates.
- Decompress the .gz file using your preferred tool (e.g., gunzip, 7-Zip, or Python’s gzip module).
Mapping Motes to Floor Plan Zones¶
Based on the coordinate system and floor plan shared in the dataset URL, below is an approximate mapping of the motes to the rooms or zones. We will use this information to come up with possible explanations for anomalies.
| Mote ID | X (meters) | Y (meters) | Approximate Room/Zone |
|---|---|---|---|
| 1 | 1.0 | 1.0 | STORAGE |
| 2 | 2.0 | 1.5 | STORAGE |
| 3 | 3.0 | 2.0 | LAB |
| 4 | 4.0 | 2.5 | LAB |
| 5 | 5.0 | 3.0 | LAB |
| 6 | 6.0 | 3.5 | LAB |
| 7 | 7.0 | 4.0 | LAB |
| 8 | 8.0 | 4.5 | LAB |
| 9 | 9.0 | 5.0 | LAB |
| 10 | 10.0 | 5.5 | LAB |
| 11 | 11.0 | 6.0 | CONF. |
| 12 | 12.0 | 6.5 | CONF. |
| 13 | 13.0 | 7.0 | CONF. |
| 14 | 14.0 | 7.5 | QUIET PHONE |
| 15 | 15.0 | 8.0 | QUIET PHONE |
| 16 | 16.0 | 8.5 | SERVER |
| 17 | 17.0 | 9.0 | SERVER |
| 18 | 18.0 | 9.5 | CONF. |
| 19 | 19.0 | 10.0 | CONF. |
| 20 | 20.0 | 10.5 | CONF. |
| 21 | 21.0 | 11.0 | OFFICE |
| 22 | 22.0 | 11.5 | OFFICE |
| 23 | 23.0 | 12.0 | OFFICE |
| 24 | 24.0 | 12.5 | COPY |
| 25 | 25.0 | 13.0 | COPY |
| 26 | 26.0 | 13.5 | ELEC. |
| 27 | 27.0 | 14.0 | ELEC. |
| 28 | 28.0 | 14.5 | ELEC. |
| 29 | 29.0 | 15.0 | OFFICE |
| 30 | 30.0 | 15.5 | OFFICE |
In the next section, we load the datasets into DataFrames.
Loading Datasets into Python Dataframes¶
folder_name = "data.txt"
file_name = "data.txt"
# Building the file path
file_path = os.path.join(os.getcwd(), folder_name, file_name)
# Reading the space-separated file
sensor_data_df = pd.read_csv(file_path,
sep=r"\s+", # any whitespace
header=None, # no header in file
names=["date", "time", "epoch", "moteid", "temperature", "humidity", "light", "voltage"])
sensor_data_df['timestamp'] = pd.to_datetime(
sensor_data_df['date'] + ' ' + sensor_data_df['time'], # space between date & time
utc=True, # optional, converts to UTC
errors='coerce', # will turn unparseable rows into NaT
format='mixed' # infers format row by row
)
# Missing Value Imputation
sensor_data_df['moteid'] = sensor_data_df['moteid'].fillna(-1).astype(int)
# Deleting redundant columns
sensor_data_df = sensor_data_df.drop(columns=['date', 'time'])
# Moving 'timestamp' to the first column
cols = ['timestamp'] + [col for col in sensor_data_df.columns if col != 'timestamp']
sensor_data_df = sensor_data_df[cols]
sensor_data_df['moteid'] = sensor_data_df['moteid'].astype(int)
#YYYY-MM-DDThh:mm:ss.SSSZ
# Converting the timestamp value to ISO 8601 format
sensor_data_df['timestamp'] = sensor_data_df['timestamp'].dt.strftime('%Y-%m-%dT%H:%M:%S.%f') # Format with microseconds
sensor_data_df['timestamp'] = sensor_data_df['timestamp'].str[:-3] + 'Z' # Adjust to milliseconds and append 'Z'
sensor_data_df.head()
| timestamp | epoch | moteid | temperature | humidity | light | voltage | |
|---|---|---|---|---|---|---|---|
| 0 | 2004-03-31T03:38:15.757Z | 2 | 1 | 122.1530 | -3.91901 | 11.04 | 2.03397 |
| 1 | 2004-02-28T00:59:16.027Z | 3 | 1 | 19.9884 | 37.09330 | 45.08 | 2.69964 |
| 2 | 2004-02-28T01:03:16.333Z | 11 | 1 | 19.3024 | 38.46290 | 45.08 | 2.68742 |
| 3 | 2004-02-28T01:06:16.013Z | 17 | 1 | 19.1652 | 38.80390 | 45.08 | 2.68742 |
| 4 | 2004-02-28T01:06:46.778Z | 18 | 1 | 19.1750 | 38.83790 | 45.08 | 2.69964 |
# Saving the co-ordinates data into a file
mote_locs_df = pd.read_csv("mote_locs.txt",
sep=r"\s+", # any whitespace
header=None, # no header in file
names=["moteid", "x_location", "y_location"])
mote_locs_df.head()
| moteid | x_location | y_location | |
|---|---|---|---|
| 0 | 1 | 21.5 | 23 |
| 1 | 2 | 24.5 | 20 |
| 2 | 3 | 19.5 | 19 |
| 3 | 4 | 22.5 | 15 |
| 4 | 5 | 24.5 | 12 |
Creating Containers¶
GridDB provides two types of Containers, namely Collections and TimeSeries. Collections are used to store lookup data, historic data, and transactional data that are not time-sensitive. Timeseries Containers are used to store time-sensitive data used in telemetry and sensors for IoT applications. Irrespective of the Container type, there are multiple options for container creation and data ingestion like the WebAPI, JayDeBeAPI, GridDB CE and official SDKs. In this blog, we use the WebAPI throughout. To learn more about each of the connection options, refer to the following resources -
- Community CLI for GridDB Cloud - griddb-cloud-cli
- JayDeBeAPI - JayDeBeAPI Guide
- WebAPI - WebAPI Guide
- Official SDK - griddb-python Readme
To start with the container creation, set up the credentials. Note that GridDB expects base64 encoded credentials. We use the library base64 to do so. This is then passed to the header object.
username = "xxx" # Provide your GridDB credentials here
password = "xxx" # Provide your GridDB credentials here
credentials = f"{username}:{password}"
encoded_credentials = base64.b64encode(credentials.encode()).decode()
#print(f"Encoded credentials: Basic {encoded_credentials}")
The header object consists of the below elements. Ensure that you have the correct base_url. The base URL can be obtained from GridDB cloud by navigating to the Clusters menu and clicking on 'Overview'. The base URL to be used is labelled 'GridDB WebAPI URL'.
#Construct an object to hold the request headers
header_obj = {
"Authorization": f"Basic {encoded_credentials}", # Add encoded credentials here
"Content-Type": "application/json", # Optional; depends on API requirements
"charset": "UTF-8",
"User-Agent":"PostmanRuntime/7.29.0"
}
#Construct the base URL based on your GridDB cluster you'd like to connect to (ensure that you replace the placeholders in the URL below with the correct values that correspond to your GridDB instance)
#'https://[host]:[port]/griddb/v2/[clustername]/dbs/[database_name]'
base_url = 'https://cloud5197.griddb.com:443/griddb/v2/gs_clustermfcloud5197/dbs/aFsJLK8l/'
We then define two python functions to map pandas datatypes to the appropriate data type in GridDB. The 'generate_griddb_data_obj' function yields the container structure. We will be calling these functions in the http request for container creation. Refer to this GridDB tutorial to learn more about container models.
def map_dtype_to_griddb(dtype):
"""
Maps Pandas data types to GridDB data types.
"""
if pd.api.types.is_integer_dtype(dtype):
return "INTEGER"
elif pd.api.types.is_float_dtype(dtype):
return "DOUBLE"
elif pd.api.types.is_bool_dtype(dtype):
return "BOOL"
##elif pd.api.types.is_datetime64_any_dtype(dtype):
##return "LONG" # GridDB stores timestamps as LONG
elif pd.api.types.is_datetime64_any_dtype(dtype):
return "TIMESTAMP"
else:
return "STRING"
def generate_griddb_data_obj(df, container_name="MyContainer", container_type="COLLECTION", rowkey=False):
"""
Generates a GridDB container data object for API request.
"""
columns = []
for col in df.columns:
griddb_type = map_dtype_to_griddb(df[col].dtype)
columns.append({"name": col, "type": griddb_type})
data_obj = {
"container_name": container_name,
"container_type": container_type,
"rowkey": rowkey,
"columns": columns
}
return data_obj
Creating the Timeseries Container 'sensor_data'¶
data_obj = generate_griddb_data_obj(sensor_data_df, container_name="sensor_data")
#Set up the GridDB WebAPI URL
url = base_url + 'containers'
#Invoke the GridDB WebAPI with the headers and the request body
x = requests.post(url, json = data_obj, headers = header_obj)
x.text
Creating the Collection Container 'mote_locations'¶
data_obj = generate_griddb_data_obj(mote_locs_df, container_name="mote_locations",container_type ="COLLECTION", rowkey=False)
#Set up the GridDB WebAPI URL
url = base_url + 'containers'
#Invoke the GridDB WebAPI with the headers and the request body
x = requests.post(url, json = data_obj, headers = header_obj)
Loading the TimeSeries Container 'Sensor_data'¶
Loading the Containers is also known as Row Registration in GridDB. Refer to this resource to learn more.
#Setup the URL to be used to invoke the GridDB WebAPI to register rows in the container created previously
url = base_url + 'containers/sensor_data/rows'
print(url)
batch_size = 5000
total_rows = len(sensor_data_df)
total_batches = math.ceil(total_rows / batch_size)
print(f"Starting ingestion of {total_rows:,} rows in {total_batches} batches of {batch_size} each...")
start_time = time.time()
for i in range(total_batches):
start_idx = i * batch_size
end_idx = min((i + 1) * batch_size, total_rows)
batch_df = sensor_data_df.iloc[start_idx:end_idx]
# Wrap in a dict with key "rows"
#batch_json = json.dumps({"rows": json.loads(batch_df.to_json(orient='values'))})
#batch_json = json.dumps(batch_df.to_json(orient='values'))
batch_json = batch_df.to_json(orient='values')
try:
#print(url)
#response = requests.put(url, headers=header_obj, data=batch_json)
response = requests.put(url, headers=header_obj, data=batch_json)
#print(batch_json)
'''
print(response.text)
print(response)
break
'''
elapsed = time.time() - start_time
if response.status_code in [200, 201]:
print(f" Batch {i+1}/{total_batches} | Rows {start_idx}-{end_idx-1} | "
f"Time elapsed: {elapsed:.1f}s")
else:
print(f" Batch {i+1}/{total_batches} FAILED "
f"(HTTP {response.status_code}) - {response.text[:150]}")
except Exception as e:
print(f" Batch {i+1}/{total_batches} ERROR: {e}")
print(f"\n Ingestion completed in {time.time() - start_time:.1f} seconds.")
Starting ingestion of 2,313,682 rows in 463 batches of 5000 each... Batch 1/463 | Rows 0-4999 | Time elapsed: 2.3s Batch 2/463 | Rows 5000-9999 | Time elapsed: 3.9s Batch 3/463 | Rows 10000-14999 | Time elapsed: 5.5s Batch 4/463 | Rows 15000-19999 | Time elapsed: 7.1s Batch 5/463 | Rows 20000-24999 | Time elapsed: 8.5s Batch 6/463 | Rows 25000-29999 | Time elapsed: 10.0s Batch 7/463 | Rows 30000-34999 | Time elapsed: 11.5s Batch 8/463 | Rows 35000-39999 | Time elapsed: 13.0s Batch 9/463 | Rows 40000-44999 | Time elapsed: 14.7s Batch 10/463 | Rows 45000-49999 | Time elapsed: 16.2s Batch 11/463 | Rows 50000-54999 | Time elapsed: 17.8s Batch 12/463 | Rows 55000-59999 | Time elapsed: 19.3s Batch 13/463 | Rows 60000-64999 | Time elapsed: 20.8s Batch 14/463 | Rows 65000-69999 | Time elapsed: 22.3s Batch 15/463 | Rows 70000-74999 | Time elapsed: 23.8s Batch 16/463 | Rows 75000-79999 | Time elapsed: 25.4s Batch 17/463 | Rows 80000-84999 | Time elapsed: 26.9s Batch 18/463 | Rows 85000-89999 | Time elapsed: 28.5s Batch 19/463 | Rows 90000-94999 | Time elapsed: 30.0s Batch 20/463 | Rows 95000-99999 | Time elapsed: 31.4s Batch 21/463 | Rows 100000-104999 | Time elapsed: 32.9s Batch 22/463 | Rows 105000-109999 | Time elapsed: 34.6s Batch 23/463 | Rows 110000-114999 | Time elapsed: 36.1s Batch 24/463 | Rows 115000-119999 | Time elapsed: 37.6s Batch 25/463 | Rows 120000-124999 | Time elapsed: 39.1s Batch 26/463 | Rows 125000-129999 | Time elapsed: 40.7s Batch 27/463 | Rows 130000-134999 | Time elapsed: 42.4s Batch 28/463 | Rows 135000-139999 | Time elapsed: 43.9s Batch 29/463 | Rows 140000-144999 | Time elapsed: 45.4s Batch 30/463 | Rows 145000-149999 | Time elapsed: 46.9s Batch 31/463 | Rows 150000-154999 | Time elapsed: 48.4s Batch 32/463 | Rows 155000-159999 | Time elapsed: 49.9s Batch 33/463 | Rows 160000-164999 | Time elapsed: 51.5s Batch 34/463 | Rows 165000-169999 | Time elapsed: 53.0s Batch 35/463 | Rows 170000-174999 | Time elapsed: 54.5s Batch 36/463 | Rows 175000-179999 | Time elapsed: 56.3s Batch 37/463 | Rows 180000-184999 | Time elapsed: 57.8s Batch 38/463 | Rows 185000-189999 | Time elapsed: 59.3s Batch 39/463 | Rows 190000-194999 | Time elapsed: 60.8s Batch 40/463 | Rows 195000-199999 | Time elapsed: 62.3s Batch 41/463 | Rows 200000-204999 | Time elapsed: 63.8s Batch 42/463 | Rows 205000-209999 | Time elapsed: 65.4s Batch 43/463 | Rows 210000-214999 | Time elapsed: 66.9s Batch 44/463 | Rows 215000-219999 | Time elapsed: 68.4s Batch 45/463 | Rows 220000-224999 | Time elapsed: 69.9s Batch 46/463 | Rows 225000-229999 | Time elapsed: 71.4s Batch 47/463 | Rows 230000-234999 | Time elapsed: 72.9s Batch 48/463 | Rows 235000-239999 | Time elapsed: 74.4s Batch 49/463 | Rows 240000-244999 | Time elapsed: 76.0s Batch 50/463 | Rows 245000-249999 | Time elapsed: 77.6s Batch 51/463 | Rows 250000-254999 | Time elapsed: 79.1s Batch 52/463 | Rows 255000-259999 | Time elapsed: 80.6s Batch 53/463 | Rows 260000-264999 | Time elapsed: 82.1s Batch 54/463 | Rows 265000-269999 | Time elapsed: 83.6s Batch 55/463 | Rows 270000-274999 | Time elapsed: 85.1s Batch 56/463 | Rows 275000-279999 | Time elapsed: 86.6s Batch 57/463 | Rows 280000-284999 | Time elapsed: 88.2s Batch 58/463 | Rows 285000-289999 | Time elapsed: 89.7s Batch 59/463 | Rows 290000-294999 | Time elapsed: 91.2s Batch 60/463 | Rows 295000-299999 | Time elapsed: 92.8s Batch 61/463 | Rows 300000-304999 | Time elapsed: 94.3s Batch 62/463 | Rows 305000-309999 | Time elapsed: 95.8s Batch 63/463 | Rows 310000-314999 | Time elapsed: 97.3s Batch 64/463 | Rows 315000-319999 | Time elapsed: 98.8s Batch 65/463 | Rows 320000-324999 | Time elapsed: 100.3s Batch 66/463 | Rows 325000-329999 | Time elapsed: 101.8s Batch 67/463 | Rows 330000-334999 | Time elapsed: 103.3s Batch 68/463 | Rows 335000-339999 | Time elapsed: 104.9s Batch 69/463 | Rows 340000-344999 | Time elapsed: 106.4s Batch 70/463 | Rows 345000-349999 | Time elapsed: 108.0s Batch 71/463 | Rows 350000-354999 | Time elapsed: 109.6s Batch 72/463 | Rows 355000-359999 | Time elapsed: 111.1s Batch 73/463 | Rows 360000-364999 | Time elapsed: 112.6s Batch 74/463 | Rows 365000-369999 | Time elapsed: 114.1s Batch 75/463 | Rows 370000-374999 | Time elapsed: 115.6s Batch 76/463 | Rows 375000-379999 | Time elapsed: 117.2s Batch 77/463 | Rows 380000-384999 | Time elapsed: 118.8s Batch 78/463 | Rows 385000-389999 | Time elapsed: 120.3s Batch 79/463 | Rows 390000-394999 | Time elapsed: 121.8s Batch 80/463 | Rows 395000-399999 | Time elapsed: 123.3s Batch 81/463 | Rows 400000-404999 | Time elapsed: 124.8s Batch 82/463 | Rows 405000-409999 | Time elapsed: 126.3s Batch 83/463 | Rows 410000-414999 | Time elapsed: 127.8s Batch 84/463 | Rows 415000-419999 | Time elapsed: 129.4s Batch 85/463 | Rows 420000-424999 | Time elapsed: 131.0s Batch 86/463 | Rows 425000-429999 | Time elapsed: 132.5s Batch 87/463 | Rows 430000-434999 | Time elapsed: 134.0s Batch 88/463 | Rows 435000-439999 | Time elapsed: 135.5s Batch 89/463 | Rows 440000-444999 | Time elapsed: 137.0s Batch 90/463 | Rows 445000-449999 | Time elapsed: 138.5s Batch 91/463 | Rows 450000-454999 | Time elapsed: 140.0s Batch 92/463 | Rows 455000-459999 | Time elapsed: 141.6s Batch 93/463 | Rows 460000-464999 | Time elapsed: 143.2s Batch 94/463 | Rows 465000-469999 | Time elapsed: 144.7s Batch 95/463 | Rows 470000-474999 | Time elapsed: 146.6s Batch 96/463 | Rows 475000-479999 | Time elapsed: 148.1s Batch 97/463 | Rows 480000-484999 | Time elapsed: 149.6s Batch 98/463 | Rows 485000-489999 | Time elapsed: 151.1s Batch 99/463 | Rows 490000-494999 | Time elapsed: 152.8s Batch 100/463 | Rows 495000-499999 | Time elapsed: 154.3s Batch 101/463 | Rows 500000-504999 | Time elapsed: 155.8s Batch 102/463 | Rows 505000-509999 | Time elapsed: 157.3s Batch 103/463 | Rows 510000-514999 | Time elapsed: 158.8s Batch 104/463 | Rows 515000-519999 | Time elapsed: 160.3s Batch 105/463 | Rows 520000-524999 | Time elapsed: 161.9s Batch 106/463 | Rows 525000-529999 | Time elapsed: 163.4s Batch 107/463 | Rows 530000-534999 | Time elapsed: 164.9s Batch 108/463 | Rows 535000-539999 | Time elapsed: 166.5s Batch 109/463 | Rows 540000-544999 | Time elapsed: 168.2s Batch 110/463 | Rows 545000-549999 | Time elapsed: 169.8s Batch 111/463 | Rows 550000-554999 | Time elapsed: 171.3s Batch 112/463 | Rows 555000-559999 | Time elapsed: 172.9s Batch 113/463 | Rows 560000-564999 | Time elapsed: 174.4s Batch 114/463 | Rows 565000-569999 | Time elapsed: 175.9s Batch 115/463 | Rows 570000-574999 | Time elapsed: 177.4s Batch 116/463 | Rows 575000-579999 | Time elapsed: 179.0s Batch 117/463 | Rows 580000-584999 | Time elapsed: 180.6s Batch 118/463 | Rows 585000-589999 | Time elapsed: 182.0s Batch 119/463 | Rows 590000-594999 | Time elapsed: 183.6s Batch 120/463 | Rows 595000-599999 | Time elapsed: 185.1s Batch 121/463 | Rows 600000-604999 | Time elapsed: 186.6s Batch 122/463 | Rows 605000-609999 | Time elapsed: 188.1s Batch 123/463 | Rows 610000-614999 | Time elapsed: 189.6s Batch 124/463 | Rows 615000-619999 | Time elapsed: 191.1s Batch 125/463 | Rows 620000-624999 | Time elapsed: 192.5s Batch 126/463 | Rows 625000-629999 | Time elapsed: 194.1s Batch 127/463 | Rows 630000-634999 | Time elapsed: 195.5s Batch 128/463 | Rows 635000-639999 | Time elapsed: 197.1s Batch 129/463 | Rows 640000-644999 | Time elapsed: 198.6s Batch 130/463 | Rows 645000-649999 | Time elapsed: 200.1s Batch 131/463 | Rows 650000-654999 | Time elapsed: 201.6s Batch 132/463 | Rows 655000-659999 | Time elapsed: 203.1s Batch 133/463 | Rows 660000-664999 | Time elapsed: 204.5s Batch 134/463 | Rows 665000-669999 | Time elapsed: 206.0s Batch 135/463 | Rows 670000-674999 | Time elapsed: 207.5s Batch 136/463 | Rows 675000-679999 | Time elapsed: 209.0s Batch 137/463 | Rows 680000-684999 | Time elapsed: 210.5s Batch 138/463 | Rows 685000-689999 | Time elapsed: 212.0s Batch 139/463 | Rows 690000-694999 | Time elapsed: 213.5s Batch 140/463 | Rows 695000-699999 | Time elapsed: 215.0s Batch 141/463 | Rows 700000-704999 | Time elapsed: 216.5s Batch 142/463 | Rows 705000-709999 | Time elapsed: 218.1s Batch 143/463 | Rows 710000-714999 | Time elapsed: 219.6s Batch 144/463 | Rows 715000-719999 | Time elapsed: 221.1s Batch 145/463 | Rows 720000-724999 | Time elapsed: 222.6s Batch 146/463 | Rows 725000-729999 | Time elapsed: 224.2s Batch 147/463 | Rows 730000-734999 | Time elapsed: 225.7s Batch 148/463 | Rows 735000-739999 | Time elapsed: 227.2s Batch 149/463 | Rows 740000-744999 | Time elapsed: 228.7s Batch 150/463 | Rows 745000-749999 | Time elapsed: 230.2s Batch 151/463 | Rows 750000-754999 | Time elapsed: 231.7s Batch 152/463 | Rows 755000-759999 | Time elapsed: 233.2s Batch 153/463 | Rows 760000-764999 | Time elapsed: 234.7s Batch 154/463 | Rows 765000-769999 | Time elapsed: 236.2s Batch 155/463 | Rows 770000-774999 | Time elapsed: 237.7s Batch 156/463 | Rows 775000-779999 | Time elapsed: 239.2s Batch 157/463 | Rows 780000-784999 | Time elapsed: 240.7s Batch 158/463 | Rows 785000-789999 | Time elapsed: 242.2s Batch 159/463 | Rows 790000-794999 | Time elapsed: 243.8s Batch 160/463 | Rows 795000-799999 | Time elapsed: 245.4s Batch 161/463 | Rows 800000-804999 | Time elapsed: 246.8s Batch 162/463 | Rows 805000-809999 | Time elapsed: 248.5s Batch 163/463 | Rows 810000-814999 | Time elapsed: 250.1s Batch 164/463 | Rows 815000-819999 | Time elapsed: 251.5s Batch 165/463 | Rows 820000-824999 | Time elapsed: 253.0s Batch 166/463 | Rows 825000-829999 | Time elapsed: 254.5s Batch 167/463 | Rows 830000-834999 | Time elapsed: 256.0s Batch 168/463 | Rows 835000-839999 | Time elapsed: 257.7s Batch 169/463 | Rows 840000-844999 | Time elapsed: 259.2s Batch 170/463 | Rows 845000-849999 | Time elapsed: 260.7s Batch 171/463 | Rows 850000-854999 | Time elapsed: 262.3s Batch 172/463 | Rows 855000-859999 | Time elapsed: 263.8s Batch 173/463 | Rows 860000-864999 | Time elapsed: 265.2s Batch 174/463 | Rows 865000-869999 | Time elapsed: 266.7s Batch 175/463 | Rows 870000-874999 | Time elapsed: 268.4s Batch 176/463 | Rows 875000-879999 | Time elapsed: 270.0s Batch 177/463 | Rows 880000-884999 | Time elapsed: 271.5s Batch 178/463 | Rows 885000-889999 | Time elapsed: 273.0s Batch 179/463 | Rows 890000-894999 | Time elapsed: 274.5s Batch 180/463 | Rows 895000-899999 | Time elapsed: 276.2s Batch 181/463 | Rows 900000-904999 | Time elapsed: 277.6s Batch 182/463 | Rows 905000-909999 | Time elapsed: 279.1s Batch 183/463 | Rows 910000-914999 | Time elapsed: 280.7s Batch 184/463 | Rows 915000-919999 | Time elapsed: 282.2s Batch 185/463 | Rows 920000-924999 | Time elapsed: 283.7s Batch 186/463 | Rows 925000-929999 | Time elapsed: 285.2s Batch 187/463 | Rows 930000-934999 | Time elapsed: 286.7s Batch 188/463 | Rows 935000-939999 | Time elapsed: 288.2s Batch 189/463 | Rows 940000-944999 | Time elapsed: 289.7s Batch 190/463 | Rows 945000-949999 | Time elapsed: 291.2s Batch 191/463 | Rows 950000-954999 | Time elapsed: 292.7s Batch 192/463 | Rows 955000-959999 | Time elapsed: 294.2s Batch 193/463 | Rows 960000-964999 | Time elapsed: 296.0s Batch 194/463 | Rows 965000-969999 | Time elapsed: 297.5s Batch 195/463 | Rows 970000-974999 | Time elapsed: 299.0s Batch 196/463 | Rows 975000-979999 | Time elapsed: 300.6s Batch 197/463 | Rows 980000-984999 | Time elapsed: 302.1s Batch 198/463 | Rows 985000-989999 | Time elapsed: 303.6s Batch 199/463 | Rows 990000-994999 | Time elapsed: 305.3s Batch 200/463 | Rows 995000-999999 | Time elapsed: 306.8s Batch 201/463 | Rows 1000000-1004999 | Time elapsed: 308.3s Batch 202/463 | Rows 1005000-1009999 | Time elapsed: 309.8s Batch 203/463 | Rows 1010000-1014999 | Time elapsed: 311.3s Batch 204/463 | Rows 1015000-1019999 | Time elapsed: 312.8s Batch 205/463 | Rows 1020000-1024999 | Time elapsed: 314.4s Batch 206/463 | Rows 1025000-1029999 | Time elapsed: 316.0s Batch 207/463 | Rows 1030000-1034999 | Time elapsed: 317.5s Batch 208/463 | Rows 1035000-1039999 | Time elapsed: 319.3s Batch 209/463 | Rows 1040000-1044999 | Time elapsed: 320.8s Batch 210/463 | Rows 1045000-1049999 | Time elapsed: 322.3s Batch 211/463 | Rows 1050000-1054999 | Time elapsed: 323.8s Batch 212/463 | Rows 1055000-1059999 | Time elapsed: 325.3s Batch 213/463 | Rows 1060000-1064999 | Time elapsed: 326.8s Batch 214/463 | Rows 1065000-1069999 | Time elapsed: 328.9s Batch 215/463 | Rows 1070000-1074999 | Time elapsed: 330.5s Batch 216/463 | Rows 1075000-1079999 | Time elapsed: 332.0s Batch 217/463 | Rows 1080000-1084999 | Time elapsed: 333.5s Batch 218/463 | Rows 1085000-1089999 | Time elapsed: 334.9s Batch 219/463 | Rows 1090000-1094999 | Time elapsed: 336.6s Batch 220/463 | Rows 1095000-1099999 | Time elapsed: 338.1s Batch 221/463 | Rows 1100000-1104999 | Time elapsed: 339.6s Batch 222/463 | Rows 1105000-1109999 | Time elapsed: 341.1s Batch 223/463 | Rows 1110000-1114999 | Time elapsed: 342.7s Batch 224/463 | Rows 1115000-1119999 | Time elapsed: 344.3s Batch 225/463 | Rows 1120000-1124999 | Time elapsed: 345.8s Batch 226/463 | Rows 1125000-1129999 | Time elapsed: 347.3s Batch 227/463 | Rows 1130000-1134999 | Time elapsed: 348.8s Batch 228/463 | Rows 1135000-1139999 | Time elapsed: 350.3s Batch 229/463 | Rows 1140000-1144999 | Time elapsed: 351.8s Batch 230/463 | Rows 1145000-1149999 | Time elapsed: 353.3s Batch 231/463 | Rows 1150000-1154999 | Time elapsed: 354.8s Batch 232/463 | Rows 1155000-1159999 | Time elapsed: 356.4s Batch 233/463 | Rows 1160000-1164999 | Time elapsed: 357.9s Batch 234/463 | Rows 1165000-1169999 | Time elapsed: 359.4s Batch 235/463 | Rows 1170000-1174999 | Time elapsed: 360.9s Batch 236/463 | Rows 1175000-1179999 | Time elapsed: 362.4s Batch 237/463 | Rows 1180000-1184999 | Time elapsed: 363.9s Batch 238/463 | Rows 1185000-1189999 | Time elapsed: 365.4s Batch 239/463 | Rows 1190000-1194999 | Time elapsed: 366.9s Batch 240/463 | Rows 1195000-1199999 | Time elapsed: 368.4s Batch 241/463 | Rows 1200000-1204999 | Time elapsed: 369.9s Batch 242/463 | Rows 1205000-1209999 | Time elapsed: 371.3s Batch 243/463 | Rows 1210000-1214999 | Time elapsed: 373.0s Batch 244/463 | Rows 1215000-1219999 | Time elapsed: 374.7s Batch 245/463 | Rows 1220000-1224999 | Time elapsed: 376.2s Batch 246/463 | Rows 1225000-1229999 | Time elapsed: 377.7s Batch 247/463 | Rows 1230000-1234999 | Time elapsed: 379.2s Batch 248/463 | Rows 1235000-1239999 | Time elapsed: 380.7s Batch 249/463 | Rows 1240000-1244999 | Time elapsed: 382.4s Batch 250/463 | Rows 1245000-1249999 | Time elapsed: 383.9s Batch 251/463 | Rows 1250000-1254999 | Time elapsed: 385.6s Batch 252/463 | Rows 1255000-1259999 | Time elapsed: 387.2s Batch 253/463 | Rows 1260000-1264999 | Time elapsed: 388.7s Batch 254/463 | Rows 1265000-1269999 | Time elapsed: 390.4s Batch 255/463 | Rows 1270000-1274999 | Time elapsed: 391.9s Batch 256/463 | Rows 1275000-1279999 | Time elapsed: 393.4s Batch 257/463 | Rows 1280000-1284999 | Time elapsed: 394.9s Batch 258/463 | Rows 1285000-1289999 | Time elapsed: 396.4s Batch 259/463 | Rows 1290000-1294999 | Time elapsed: 397.9s Batch 260/463 | Rows 1295000-1299999 | Time elapsed: 399.4s Batch 261/463 | Rows 1300000-1304999 | Time elapsed: 400.9s Batch 262/463 | Rows 1305000-1309999 | Time elapsed: 402.4s Batch 263/463 | Rows 1310000-1314999 | Time elapsed: 403.9s Batch 264/463 | Rows 1315000-1319999 | Time elapsed: 405.4s Batch 265/463 | Rows 1320000-1324999 | Time elapsed: 406.9s Batch 266/463 | Rows 1325000-1329999 | Time elapsed: 408.6s Batch 267/463 | Rows 1330000-1334999 | Time elapsed: 410.1s Batch 268/463 | Rows 1335000-1339999 | Time elapsed: 412.4s Batch 269/463 | Rows 1340000-1344999 | Time elapsed: 414.1s Batch 270/463 | Rows 1345000-1349999 | Time elapsed: 415.6s Batch 271/463 | Rows 1350000-1354999 | Time elapsed: 417.1s Batch 272/463 | Rows 1355000-1359999 | Time elapsed: 418.6s Batch 273/463 | Rows 1360000-1364999 | Time elapsed: 420.1s Batch 274/463 | Rows 1365000-1369999 | Time elapsed: 421.6s Batch 275/463 | Rows 1370000-1374999 | Time elapsed: 423.1s Batch 276/463 | Rows 1375000-1379999 | Time elapsed: 424.7s Batch 277/463 | Rows 1380000-1384999 | Time elapsed: 426.2s Batch 278/463 | Rows 1385000-1389999 | Time elapsed: 428.4s Batch 279/463 | Rows 1390000-1394999 | Time elapsed: 429.9s Batch 280/463 | Rows 1395000-1399999 | Time elapsed: 431.4s Batch 281/463 | Rows 1400000-1404999 | Time elapsed: 433.3s Batch 282/463 | Rows 1405000-1409999 | Time elapsed: 434.9s Batch 283/463 | Rows 1410000-1414999 | Time elapsed: 436.4s Batch 284/463 | Rows 1415000-1419999 | Time elapsed: 437.9s Batch 285/463 | Rows 1420000-1424999 | Time elapsed: 439.5s Batch 286/463 | Rows 1425000-1429999 | Time elapsed: 440.9s Batch 287/463 | Rows 1430000-1434999 | Time elapsed: 442.4s Batch 288/463 | Rows 1435000-1439999 | Time elapsed: 443.9s Batch 289/463 | Rows 1440000-1444999 | Time elapsed: 445.6s Batch 290/463 | Rows 1445000-1449999 | Time elapsed: 447.1s Batch 291/463 | Rows 1450000-1454999 | Time elapsed: 448.7s Batch 292/463 | Rows 1455000-1459999 | Time elapsed: 450.2s Batch 293/463 | Rows 1460000-1464999 | Time elapsed: 451.7s Batch 294/463 | Rows 1465000-1469999 | Time elapsed: 453.2s Batch 295/463 | Rows 1470000-1474999 | Time elapsed: 454.9s Batch 296/463 | Rows 1475000-1479999 | Time elapsed: 456.3s Batch 297/463 | Rows 1480000-1484999 | Time elapsed: 458.0s Batch 298/463 | Rows 1485000-1489999 | Time elapsed: 459.7s Batch 299/463 | Rows 1490000-1494999 | Time elapsed: 461.2s Batch 300/463 | Rows 1495000-1499999 | Time elapsed: 462.7s Batch 301/463 | Rows 1500000-1504999 | Time elapsed: 464.2s Batch 302/463 | Rows 1505000-1509999 | Time elapsed: 465.7s Batch 303/463 | Rows 1510000-1514999 | Time elapsed: 467.2s Batch 304/463 | Rows 1515000-1519999 | Time elapsed: 468.8s Batch 305/463 | Rows 1520000-1524999 | Time elapsed: 470.4s Batch 306/463 | Rows 1525000-1529999 | Time elapsed: 471.9s Batch 307/463 | Rows 1530000-1534999 | Time elapsed: 473.4s Batch 308/463 | Rows 1535000-1539999 | Time elapsed: 474.9s Batch 309/463 | Rows 1540000-1544999 | Time elapsed: 476.4s Batch 310/463 | Rows 1545000-1549999 | Time elapsed: 477.9s Batch 311/463 | Rows 1550000-1554999 | Time elapsed: 479.4s Batch 312/463 | Rows 1555000-1559999 | Time elapsed: 480.9s Batch 313/463 | Rows 1560000-1564999 | Time elapsed: 482.5s Batch 314/463 | Rows 1565000-1569999 | Time elapsed: 484.0s Batch 315/463 | Rows 1570000-1574999 | Time elapsed: 485.5s Batch 316/463 | Rows 1575000-1579999 | Time elapsed: 487.0s Batch 317/463 | Rows 1580000-1584999 | Time elapsed: 488.5s Batch 318/463 | Rows 1585000-1589999 | Time elapsed: 490.0s Batch 319/463 | Rows 1590000-1594999 | Time elapsed: 491.5s Batch 320/463 | Rows 1595000-1599999 | Time elapsed: 493.0s Batch 321/463 | Rows 1600000-1604999 | Time elapsed: 494.5s Batch 322/463 | Rows 1605000-1609999 | Time elapsed: 496.0s Batch 323/463 | Rows 1610000-1614999 | Time elapsed: 497.5s Batch 324/463 | Rows 1615000-1619999 | Time elapsed: 499.0s Batch 325/463 | Rows 1620000-1624999 | Time elapsed: 500.5s Batch 326/463 | Rows 1625000-1629999 | Time elapsed: 502.0s Batch 327/463 | Rows 1630000-1634999 | Time elapsed: 503.6s Batch 328/463 | Rows 1635000-1639999 | Time elapsed: 505.0s Batch 329/463 | Rows 1640000-1644999 | Time elapsed: 507.5s Batch 330/463 | Rows 1645000-1649999 | Time elapsed: 509.0s Batch 331/463 | Rows 1650000-1654999 | Time elapsed: 510.5s Batch 332/463 | Rows 1655000-1659999 | Time elapsed: 512.2s Batch 333/463 | Rows 1660000-1664999 | Time elapsed: 513.7s Batch 334/463 | Rows 1665000-1669999 | Time elapsed: 515.4s Batch 335/463 | Rows 1670000-1674999 | Time elapsed: 516.8s Batch 336/463 | Rows 1675000-1679999 | Time elapsed: 518.3s Batch 337/463 | Rows 1680000-1684999 | Time elapsed: 519.8s Batch 338/463 | Rows 1685000-1689999 | Time elapsed: 521.3s Batch 339/463 | Rows 1690000-1694999 | Time elapsed: 522.8s Batch 340/463 | Rows 1695000-1699999 | Time elapsed: 524.3s Batch 341/463 | Rows 1700000-1704999 | Time elapsed: 525.8s Batch 342/463 | Rows 1705000-1709999 | Time elapsed: 527.3s Batch 343/463 | Rows 1710000-1714999 | Time elapsed: 529.0s Batch 344/463 | Rows 1715000-1719999 | Time elapsed: 530.5s Batch 345/463 | Rows 1720000-1724999 | Time elapsed: 532.0s Batch 346/463 | Rows 1725000-1729999 | Time elapsed: 533.5s Batch 347/463 | Rows 1730000-1734999 | Time elapsed: 535.0s Batch 348/463 | Rows 1735000-1739999 | Time elapsed: 536.5s Batch 349/463 | Rows 1740000-1744999 | Time elapsed: 538.0s Batch 350/463 | Rows 1745000-1749999 | Time elapsed: 539.5s Batch 351/463 | Rows 1750000-1754999 | Time elapsed: 541.0s Batch 352/463 | Rows 1755000-1759999 | Time elapsed: 542.5s Batch 353/463 | Rows 1760000-1764999 | Time elapsed: 544.1s Batch 354/463 | Rows 1765000-1769999 | Time elapsed: 545.6s Batch 355/463 | Rows 1770000-1774999 | Time elapsed: 547.1s Batch 356/463 | Rows 1775000-1779999 | Time elapsed: 548.6s Batch 357/463 | Rows 1780000-1784999 | Time elapsed: 550.1s Batch 358/463 | Rows 1785000-1789999 | Time elapsed: 551.6s Batch 359/463 | Rows 1790000-1794999 | Time elapsed: 553.1s Batch 360/463 | Rows 1795000-1799999 | Time elapsed: 554.6s Batch 361/463 | Rows 1800000-1804999 | Time elapsed: 556.2s Batch 362/463 | Rows 1805000-1809999 | Time elapsed: 557.7s Batch 363/463 | Rows 1810000-1814999 | Time elapsed: 559.2s Batch 364/463 | Rows 1815000-1819999 | Time elapsed: 560.7s Batch 365/463 | Rows 1820000-1824999 | Time elapsed: 562.2s Batch 366/463 | Rows 1825000-1829999 | Time elapsed: 563.8s Batch 367/463 | Rows 1830000-1834999 | Time elapsed: 566.4s Batch 368/463 | Rows 1835000-1839999 | Time elapsed: 567.9s Batch 369/463 | Rows 1840000-1844999 | Time elapsed: 569.5s Batch 370/463 | Rows 1845000-1849999 | Time elapsed: 571.1s Batch 371/463 | Rows 1850000-1854999 | Time elapsed: 572.6s Batch 372/463 | Rows 1855000-1859999 | Time elapsed: 574.1s Batch 373/463 | Rows 1860000-1864999 | Time elapsed: 575.8s Batch 374/463 | Rows 1865000-1869999 | Time elapsed: 577.2s Batch 375/463 | Rows 1870000-1874999 | Time elapsed: 578.7s Batch 376/463 | Rows 1875000-1879999 | Time elapsed: 580.3s Batch 377/463 | Rows 1880000-1884999 | Time elapsed: 581.8s Batch 378/463 | Rows 1885000-1889999 | Time elapsed: 583.3s Batch 379/463 | Rows 1890000-1894999 | Time elapsed: 584.8s Batch 380/463 | Rows 1895000-1899999 | Time elapsed: 586.3s Batch 381/463 | Rows 1900000-1904999 | Time elapsed: 587.9s Batch 382/463 | Rows 1905000-1909999 | Time elapsed: 589.3s Batch 383/463 | Rows 1910000-1914999 | Time elapsed: 590.8s Batch 384/463 | Rows 1915000-1919999 | Time elapsed: 592.3s Batch 385/463 | Rows 1920000-1924999 | Time elapsed: 594.0s Batch 386/463 | Rows 1925000-1929999 | Time elapsed: 595.5s Batch 387/463 | Rows 1930000-1934999 | Time elapsed: 598.0s Batch 388/463 | Rows 1935000-1939999 | Time elapsed: 599.5s Batch 389/463 | Rows 1940000-1944999 | Time elapsed: 601.0s Batch 390/463 | Rows 1945000-1949999 | Time elapsed: 602.5s Batch 391/463 | Rows 1950000-1954999 | Time elapsed: 604.0s Batch 392/463 | Rows 1955000-1959999 | Time elapsed: 605.5s Batch 393/463 | Rows 1960000-1964999 | Time elapsed: 607.1s Batch 394/463 | Rows 1965000-1969999 | Time elapsed: 608.5s Batch 395/463 | Rows 1970000-1974999 | Time elapsed: 610.0s Batch 396/463 | Rows 1975000-1979999 | Time elapsed: 611.6s Batch 397/463 | Rows 1980000-1984999 | Time elapsed: 613.3s Batch 398/463 | Rows 1985000-1989999 | Time elapsed: 614.8s Batch 399/463 | Rows 1990000-1994999 | Time elapsed: 616.3s Batch 400/463 | Rows 1995000-1999999 | Time elapsed: 617.8s Batch 401/463 | Rows 2000000-2004999 | Time elapsed: 619.3s Batch 402/463 | Rows 2005000-2009999 | Time elapsed: 620.9s Batch 403/463 | Rows 2010000-2014999 | Time elapsed: 622.4s Batch 404/463 | Rows 2015000-2019999 | Time elapsed: 623.9s Batch 405/463 | Rows 2020000-2024999 | Time elapsed: 625.4s Batch 406/463 | Rows 2025000-2029999 | Time elapsed: 626.9s Batch 407/463 | Rows 2030000-2034999 | Time elapsed: 628.3s Batch 408/463 | Rows 2035000-2039999 | Time elapsed: 629.9s Batch 409/463 | Rows 2040000-2044999 | Time elapsed: 631.4s Batch 410/463 | Rows 2045000-2049999 | Time elapsed: 632.9s Batch 411/463 | Rows 2050000-2054999 | Time elapsed: 634.4s Batch 412/463 | Rows 2055000-2059999 | Time elapsed: 635.9s Batch 413/463 | Rows 2060000-2064999 | Time elapsed: 637.4s Batch 414/463 | Rows 2065000-2069999 | Time elapsed: 638.9s Batch 415/463 | Rows 2070000-2074999 | Time elapsed: 640.4s Batch 416/463 | Rows 2075000-2079999 | Time elapsed: 641.9s Batch 417/463 | Rows 2080000-2084999 | Time elapsed: 643.4s Batch 418/463 | Rows 2085000-2089999 | Time elapsed: 644.8s Batch 419/463 | Rows 2090000-2094999 | Time elapsed: 646.3s Batch 420/463 | Rows 2095000-2099999 | Time elapsed: 647.8s Batch 421/463 | Rows 2100000-2104999 | Time elapsed: 649.5s Batch 422/463 | Rows 2105000-2109999 | Time elapsed: 651.2s Batch 423/463 | Rows 2110000-2114999 | Time elapsed: 652.7s Batch 424/463 | Rows 2115000-2119999 | Time elapsed: 654.2s Batch 425/463 | Rows 2120000-2124999 | Time elapsed: 655.6s Batch 426/463 | Rows 2125000-2129999 | Time elapsed: 657.1s Batch 427/463 | Rows 2130000-2134999 | Time elapsed: 658.7s Batch 428/463 | Rows 2135000-2139999 | Time elapsed: 660.1s Batch 429/463 | Rows 2140000-2144999 | Time elapsed: 661.7s Batch 430/463 | Rows 2145000-2149999 | Time elapsed: 663.3s Batch 431/463 | Rows 2150000-2154999 | Time elapsed: 664.8s Batch 432/463 | Rows 2155000-2159999 | Time elapsed: 666.3s Batch 433/463 | Rows 2160000-2164999 | Time elapsed: 668.5s Batch 434/463 | Rows 2165000-2169999 | Time elapsed: 670.0s Batch 435/463 | Rows 2170000-2174999 | Time elapsed: 671.6s Batch 436/463 | Rows 2175000-2179999 | Time elapsed: 673.0s Batch 437/463 | Rows 2180000-2184999 | Time elapsed: 674.5s Batch 438/463 | Rows 2185000-2189999 | Time elapsed: 676.1s Batch 439/463 | Rows 2190000-2194999 | Time elapsed: 677.5s Batch 440/463 | Rows 2195000-2199999 | Time elapsed: 679.0s Batch 441/463 | Rows 2200000-2204999 | Time elapsed: 680.7s Batch 442/463 | Rows 2205000-2209999 | Time elapsed: 682.2s Batch 443/463 | Rows 2210000-2214999 | Time elapsed: 683.7s Batch 444/463 | Rows 2215000-2219999 | Time elapsed: 685.3s Batch 445/463 | Rows 2220000-2224999 | Time elapsed: 687.5s Batch 446/463 | Rows 2225000-2229999 | Time elapsed: 689.5s Batch 447/463 | Rows 2230000-2234999 | Time elapsed: 691.0s Batch 448/463 | Rows 2235000-2239999 | Time elapsed: 692.5s Batch 449/463 | Rows 2240000-2244999 | Time elapsed: 694.0s Batch 450/463 | Rows 2245000-2249999 | Time elapsed: 695.5s Batch 451/463 | Rows 2250000-2254999 | Time elapsed: 697.2s Batch 452/463 | Rows 2255000-2259999 | Time elapsed: 698.7s Batch 453/463 | Rows 2260000-2264999 | Time elapsed: 700.2s Batch 454/463 | Rows 2265000-2269999 | Time elapsed: 701.7s Batch 455/463 | Rows 2270000-2274999 | Time elapsed: 703.3s Batch 456/463 | Rows 2275000-2279999 | Time elapsed: 704.7s Batch 457/463 | Rows 2280000-2284999 | Time elapsed: 706.3s Batch 458/463 | Rows 2285000-2289999 | Time elapsed: 707.8s Batch 459/463 | Rows 2290000-2294999 | Time elapsed: 709.3s Batch 460/463 | Rows 2295000-2299999 | Time elapsed: 711.0s Batch 461/463 | Rows 2300000-2304999 | Time elapsed: 712.4s Batch 462/463 | Rows 2305000-2309999 | Time elapsed: 714.0s Batch 463/463 | Rows 2310000-2313681 | Time elapsed: 715.4s Ingestion completed in 715.4 seconds.
Loading the Collection Container 'mote_locations'¶
#Setup the URL to be used to invoke the GridDB WebAPI to register rows in the container created previously
url = base_url + 'containers/mote_locations/rows'
mote_locs_data = mote_locs_df.to_json(orient='values')
response = requests.put(url, headers=header_obj, data=mote_locs_data)
GridDB TQL Wrapper for Query Processing¶
GridDB supports both SQL querying and TQL querying options for containers. While SQL is used to query collection containers, both SQL and TQL can be used to query timeseries containers. In this blog, we demonstrate the usage of TQL to query the timeseries container. We then leverage Python to handle some aspects of the post-processing. For example, we use Python to perform a join on the results of our TQL query to the data with the mote_locs_df.
Below are two functions we have created for processing the TQL query effectively using the WebAPI and Python. The function with the name 'tql_to_df(tql_response)' converts the JSON response from a GridDB TQL WebAPI query into a pandas DataFrame, using the column names and results provided.
The function named 'run_tql(query, container, auto_alias=True)' sends the TQL query to a GridDB container via the WebAPI, measures execution time, and converts the response to a DataFrame using the earlier function 'tql_to_df(tql_response)'.
def tql_to_df(tql_response):
# Convert GridDB TQL WebAPI response to pandas DataFrame
if not tql_response:
return pd.DataFrame()
resp = tql_response[0] # usually one container per request
columns = [col.get('name') for col in resp.get('columns', [])]
results = resp.get('results', [])
df = pd.DataFrame(results, columns=columns)
return df
def run_tql(query, container, auto_alias=True):
#Running a TQL query via WebAPI
tql_url = f"{base_url}tql"
headers = header_obj
payload = [{"stmt": query, "name": container}]
start = time.time()
response = requests.post(tql_url, headers=headers, data=json.dumps(payload))
elapsed = time.time() - start
if response.status_code == 200:
data = response.json()
df = tql_to_df(data)
# Auto-rename the aggregation column if needed
if auto_alias and len(df.columns) == 1 and df.columns[0] == 'aggregationResult':
# Try to extract the aggregation name from the query
import re
match = re.search(r'(?:SELECT\s+)(\w+)\((\w+)\)', query, re.IGNORECASE)
if match:
agg_func, col_name = match.groups()
df.rename(columns={'aggregationResult': f"{agg_func.capitalize()}-{col_name.capitalize()}"}, inplace=True)
print(f"Query ran in {elapsed:.3f}s | {len(df)} rows returned")
return df, elapsed
else:
print(f"FAILED ({response.status_code}) - {response.text}\n")
return pd.DataFrame(), elapsed
Tracking Query Execution Times¶
The function 'run_tql' tracks query execution times. For demonstration purposes, we have encapsulated multiple query calls, one for each mote that is passed as an argument to the function. This is why you will see multiple print statements for the query execution times. Each execution time applies to a mote id that has been passed as an argument.
Querying Data¶
What are the time averages of the first ten Motes?¶
GridDB TQL supports a special kind of average called the Time Average. A Time Average (TIME_AVG) is basically a weighted average of temperatures over time. Imagine you have a thermometer that records your room's temperature at different times throughout the day. Sometimes it records every minute, and other times every hour. If you simply averaged the readings, a temperature that lasted an hour and one that lasted a minute would count the same. That wouldn’t be fair. TIME_AVG is a smarter version of the AVG function, which gives more importance to readings that lasted longer. If a temperature stays the same for a long time, it counts more. If a temperature was just a quick blip, it counts less. Refer to this GridDB resource to learn more about the TIME_AVG() function.
def get_time_avg_for_mote(mote_id, start_time, end_time):
query = f"""
SELECT TIME_AVG(temperature)
WHERE moteid = {mote_id}
AND TIMESTAMP('{start_time}') <= timestamp
AND timestamp < TIMESTAMP('{end_time}')
"""
df, elapsed = run_tql(query, container="sensor_data")
if not df.empty:
df["moteid"] = mote_id
return df
motes = [1, 2, 3, 4, 5, 6,7,8,9,10]
start_time = "2004-03-01T00:00:00Z"
end_time = "2004-03-04T00:00:00Z"
results = []
for mote in motes:
df = get_time_avg_for_mote(mote, start_time, end_time)
if not df.empty:
results.append(df)
# Combining results
Motes_time_averages_df = pd.concat(results, ignore_index=True)
Query ran in 1.011s | 1 rows returned Query ran in 0.787s | 1 rows returned Query ran in 0.719s | 1 rows returned Query ran in 0.745s | 1 rows returned Query ran in 0.722s | 1 rows returned Query ran in 0.719s | 1 rows returned Query ran in 0.798s | 1 rows returned Query ran in 0.739s | 1 rows returned Query ran in 0.735s | 1 rows returned Query ran in 0.728s | 1 rows returned
Motes_time_averages_df = Motes_time_averages_df.sort_values(by="Time_avg-Temperature", ascending=False)
Motes_time_averages_df.head()
| Time_avg-Temperature | moteid | |
|---|---|---|
| 3 | 21.814175 | 4 |
| 2 | 21.694911 | 3 |
| 0 | 21.584323 | 1 |
| 8 | 21.506595 | 9 |
| 6 | 21.494475 | 7 |
| 1 | 21.425509 | 2 |
| 5 | 21.294827 | 6 |
| 9 | 21.257288 | 10 |
| 7 | 21.224919 | 8 |
| 4 | 2.383918 | 5 |
Motes_time_averages_df['moteid'] = Motes_time_averages_df['moteid'].astype(str)
mote_locs_df['moteid'] = mote_locs_df['moteid'].astype(str)
merged_df = pd.merge(Motes_time_averages_df, mote_locs_df, on='moteid', how='left')
Motes_time_averages_df["moteid"] = Motes_time_averages_df["moteid"].astype(str) # ensure consistent type
fig = px.bar(
Motes_time_averages_df,
x="moteid",
y="Time_avg-Temperature",
title="Average Temperature by Mote (Descending)",
labels={"moteid": "Mote ID", "Time_avg-Temperature": "Average Temperature (°C)"},
text_auto=".2f",
category_orders={"moteid": Motes_time_averages_df["moteid"].tolist()} # <- this line forces plot order
)
fig.show()
Insight(s): We see that Mote 4 has the highest temperature reading of 21.81 and Mote 5 has the lowest temperature reading of 2.38. We can drill down further to analyse why Mote 5 seems to be recording a temperature completely different from the other motes. Let's compare the placement of the motes mentioned in the section titled Mapping-Motes-to-Floor-Plan-Zones. Motes 1-4, 6–10 are all in LAB, OFFICE, or CONF zones. Being interior zones, they may be climate-controlled and also likely occupied. This is why they seem to have similar readings. On the other hand, Mote 5 (the outlier with 2.38 degrees C), is in the STORAGE room. Storage rooms are typically unoccupied and are usually near an external wall or may have a cooler airflow. Hence, mote 5 may be showing a different reading. This confirms that placement is the dominant factor ie anomaies related to temperature.
What does the spatial distribution of motes look like, and which mote recorded the highest temperature?¶
Here, we look at the maximum temperatures of motes using TQL, We then combine the readings using Python and plot them to understand better.
def get_max_temp_for_mote(mote_id, start_time, end_time):
query = f"""
SELECT MAX(temperature)
WHERE
temperature > 25
AND moteid = {mote_id}
AND TIMESTAMP('{start_time}') <= timestamp
AND timestamp < TIMESTAMP('{end_time}')
"""
df, elapsed = run_tql(query, container="sensor_data")
if not df.empty:
df["moteid"] = mote_id
return df
motes = [1,2,3,4,5,6,8,10,12,13,14,15,16,17,18,19,20,22,23,24,26,27,28,30]
start_time = "2004-03-01T00:00:00Z"
end_time = "2004-03-04T00:00:00Z"
results = []
for mote in motes:
df = get_max_temp_for_mote(mote, start_time, end_time)
if not df.empty:
results.append(df)
# Combining results
Motes_max_temp_df = pd.concat(results, ignore_index=True)
Query ran in 0.768s | 1 rows returned Query ran in 0.716s | 1 rows returned Query ran in 0.721s | 1 rows returned Query ran in 0.762s | 1 rows returned Query ran in 0.746s | 0 rows returned Query ran in 0.717s | 1 rows returned Query ran in 0.728s | 1 rows returned Query ran in 0.725s | 1 rows returned Query ran in 0.760s | 1 rows returned Query ran in 0.743s | 1 rows returned Query ran in 0.717s | 1 rows returned Query ran in 0.770s | 1 rows returned Query ran in 0.744s | 1 rows returned Query ran in 0.756s | 1 rows returned Query ran in 0.764s | 1 rows returned Query ran in 0.716s | 1 rows returned Query ran in 0.764s | 1 rows returned Query ran in 0.714s | 1 rows returned Query ran in 0.754s | 1 rows returned Query ran in 0.752s | 1 rows returned Query ran in 0.718s | 1 rows returned Query ran in 0.748s | 1 rows returned Query ran in 0.758s | 1 rows returned Query ran in 0.760s | 1 rows returned
Motes_max_temp_df.head()
| Max-Temperature | moteid | |
|---|---|---|
| 0 | 26.6328 | 1 |
| 1 | 25.2608 | 2 |
| 2 | 26.2996 | 3 |
| 3 | 26.6132 | 4 |
| 4 | 25.2118 | 6 |
# Get mote locations from GridDB
query = "SELECT *"
mote_locs, _ = run_tql(query, container="mote_locations")
Query ran in 0.739s | 54 rows returned
# Merge time_avg_df with mote_locs on 'moteid'
merged_df = pd.merge(Motes_max_temp_df, mote_locs, on='moteid', how='left')
#print(merged_df.head())
# Step 2: Basic scatter plot to analyze temperature vs locations
fig = px.scatter(
merged_df,
x='x_location',
y='y_location',
size='Max-Temperature', # bubble size represents temperature
color='Max-Temperature', # color represents temperature
hover_data=['moteid', 'Max-Temperature'],
title='Temperature distribution across mote locations'
)
fig.show()
Insight(s): From the plot above, it is evident that Mote 15 recorded an abnormally high temperature (maximum temperature) compared to the other motes which have recorded temperatures between 25 and 35. This may be due to several reasons, such as a sensor malfunction or if Mote15 were placed near an equipment generating heating or direct sunlight. Mote 15's high temperature is most likely due to its placement within the LAB zone, possibly near heat-generating equipment or exposed to direct sunlight. Thus, Mote 15's high reading could be due to a localized environmental effect on one or more days. Refer to the section Mapping-Motes-to-Floor-Plan-Zones.
How do temperature and humidity correlate across different motes or locations over time?¶
As GridDB TQL doesn't allow multiple aggregations within the same query, we create separate functions using Python to get results for average humidity and average temperature. We then merge the two dataframes with the mote locations dataframe based on the moteid column.
def get_avg_temp_for_motes(mote_id, start_time, end_time):
query = f"""
SELECT AVG(temperature)
WHERE
temperature > 25
AND moteid = {mote_id}
AND TIMESTAMP('{start_time}') <= timestamp
AND timestamp < TIMESTAMP('{end_time}')
"""
df, elapsed = run_tql(query, container="sensor_data")
if not df.empty:
df["moteid"] = mote_id
return df
motes = [1,2,3,4,5,6,8,10,12,13,14,15,16,17,18,19,20,22,23,24,26,27,28,30]
start_time = "2004-03-01T00:00:00Z"
end_time = "2004-03-04T00:00:00Z"
results = []
for mote in motes:
df = get_avg_temp_for_motes(mote, start_time, end_time)
if not df.empty:
results.append(df)
# Combining results
Motes_avg_temp_df = pd.concat(results, ignore_index=True)
Query ran in 0.776s | 1 rows returned Query ran in 0.711s | 1 rows returned Query ran in 0.723s | 1 rows returned Query ran in 0.721s | 1 rows returned Query ran in 0.748s | 0 rows returned Query ran in 0.768s | 1 rows returned Query ran in 0.722s | 1 rows returned Query ran in 0.759s | 1 rows returned Query ran in 0.746s | 1 rows returned Query ran in 0.741s | 1 rows returned Query ran in 0.745s | 1 rows returned Query ran in 0.753s | 1 rows returned Query ran in 0.753s | 1 rows returned Query ran in 0.712s | 1 rows returned Query ran in 0.728s | 1 rows returned Query ran in 0.714s | 1 rows returned Query ran in 0.749s | 1 rows returned Query ran in 0.758s | 1 rows returned Query ran in 0.711s | 1 rows returned Query ran in 0.719s | 1 rows returned Query ran in 0.753s | 1 rows returned Query ran in 0.755s | 1 rows returned Query ran in 0.746s | 1 rows returned Query ran in 0.719s | 1 rows returned
def get_avg_humidity_for_motes(mote_id, start_time, end_time):
query = f"""
SELECT AVG(humidity)
WHERE
temperature > 25
AND moteid = {mote_id}
AND TIMESTAMP('{start_time}') <= timestamp
AND timestamp < TIMESTAMP('{end_time}')
"""
df, elapsed = run_tql(query, container="sensor_data")
if not df.empty:
df["moteid"] = mote_id
return df
motes = [1,2,3,4,5,6,8,10,12,13,14,15,16,17,18,19,20,22,23,24,26,27,28,30]
start_time = "2004-03-01T00:00:00Z"
end_time = "2004-03-04T00:00:00Z"
results = []
for mote in motes:
df = get_avg_humidity_for_motes(mote, start_time, end_time)
if not df.empty:
results.append(df)
# Combining results
Motes_avg_humidity = pd.concat(results, ignore_index=True)
Query ran in 0.735s | 1 rows returned Query ran in 0.743s | 1 rows returned Query ran in 0.748s | 1 rows returned Query ran in 0.739s | 1 rows returned Query ran in 0.743s | 0 rows returned Query ran in 0.697s | 1 rows returned Query ran in 0.752s | 1 rows returned Query ran in 0.724s | 1 rows returned Query ran in 0.757s | 1 rows returned Query ran in 0.718s | 1 rows returned Query ran in 0.746s | 1 rows returned Query ran in 0.722s | 1 rows returned Query ran in 0.729s | 1 rows returned Query ran in 0.707s | 1 rows returned Query ran in 0.735s | 1 rows returned Query ran in 0.716s | 1 rows returned Query ran in 0.719s | 1 rows returned Query ran in 0.749s | 1 rows returned Query ran in 0.773s | 1 rows returned Query ran in 0.717s | 1 rows returned Query ran in 0.719s | 1 rows returned Query ran in 0.706s | 1 rows returned Query ran in 0.739s | 1 rows returned Query ran in 0.743s | 1 rows returned
merged_sub_df = pd.merge(Motes_avg_humidity, Motes_avg_temp_df, on='moteid', how='left')
merged_df = pd.merge(merged_sub_df, mote_locs , on='moteid', how='left')
merged_df.head()
| Avg-Humidity | moteid | Avg-Temperature | x_location | y_location | |
|---|---|---|---|---|---|
| 0 | 30.582711 | 1 | 25.569478 | 21.5 | 23 |
| 1 | 25.928965 | 2 | 25.167988 | 24.5 | 20 |
| 2 | 31.203430 | 3 | 25.429288 | 19.5 | 19 |
| 3 | 32.662568 | 4 | 25.948840 | 22.5 | 15 |
| 4 | 36.655477 | 6 | 25.068946 | 19.5 | 12 |
fig = px.scatter(
merged_df,
x="x_location",
y="y_location",
size="Avg-Temperature", # Bubble size = temperature
color="Avg-Humidity", # Color = humidity
hover_name="moteid",
hover_data={"Avg-Temperature": True, "Avg-Humidity": True, "x_location": False, "y_location": False},
title="Spatial Distribution of Motes by Temperature and Humidity",
labels={"x_location": "X Coordinate", "y_location": "Y Coordinate", "Avg_Temperature": "Avg Temp (°C)", "Avg_Humidity": "Avg Humidity (%)"}
)
# Add visual polish
fig.update_traces(marker=dict(line=dict(width=1, color='DarkSlateGrey')))
# Add an annotation explaining the bubble size
fig.add_annotation(
text="Bubble size represents <b>Average Temperature (°C)</b>",
xref="paper", yref="paper",
x=1.02, y=1.05,
showarrow=False,
font=dict(size=12, color="darkblue")
)
# Center the title
fig.update_layout(
title_x=0.5,
legend_title_text="Average Humidity (%)"
)
fig.show()
Insight(s): While analyzing the Spatial Distribution, we see that Mote15 is an anomaly with a temperature of 107 and a humidity of 10.46. In other words, the average temperature of the mote is way higher than the average temperature recorded by the remaining motes. But, the average humidity of Mote 15 is way lower than the average humidity of the other motes. Mote 15 is placed in the LAB zone, as per the Mapping-floor-plan. Its extreme temperature and low humidity suggest it may be positioned near heat-emitting equipment or placed in a poorly ventilated area or an enclosed space. Alternatively, the mote may be experiencing a sensor malfunction.
At what times do voltage readings spike or drop unexpectedly?¶
start_date = datetime(2004, 3, 1)
end_date = datetime(2004, 4, 1) # exclusive
motes = [1,2,3,4,5,6,8,10,12,13,14,15,16,17,18,19,20,22,23,24,26,27,28,30]
results = []
# Loop over each day and each mote
current_date = start_date
while current_date < end_date:
next_date = current_date + timedelta(days=1)
for mote_id in motes:
query = f"""
SELECT TIME_AVG(voltage)
WHERE moteid = {mote_id}
AND TIMESTAMP('{current_date.isoformat()}Z') <= timestamp
AND timestamp < TIMESTAMP('{next_date.isoformat()}Z')
"""
df, elapsed = run_tql(query, container="sensor_data")
if not df.empty:
df["moteid"] = mote_id
df["date"] = current_date.date() # use date as timestamp
results.append(df)
current_date = next_date
# Combine all daily averages into one dataframe
Motes_avg_voltage = pd.concat(results, ignore_index=True)
# Rename the aggregation column
Motes_avg_voltage.rename(columns={"aggregationResult": "avg_voltage"}, inplace=True)
print(Motes_avg_voltage.head())
Query ran in 1.252s | 1 rows returned Query ran in 0.885s | 1 rows returned Query ran in 0.903s | 1 rows returned Query ran in 0.811s | 1 rows returned Query ran in 0.813s | 0 rows returned Query ran in 0.821s | 1 rows returned Query ran in 0.784s | 1 rows returned Query ran in 0.740s | 1 rows returned Query ran in 0.825s | 1 rows returned Query ran in 0.786s | 1 rows returned Query ran in 0.753s | 1 rows returned Query ran in 0.826s | 1 rows returned Query ran in 0.757s | 1 rows returned Query ran in 0.838s | 1 rows returned Query ran in 0.845s | 1 rows returned Query ran in 0.781s | 1 rows returned Query ran in 0.940s | 1 rows returned Query ran in 0.741s | 1 rows returned Query ran in 0.917s | 1 rows returned Query ran in 0.783s | 1 rows returned Query ran in 0.830s | 1 rows returned Query ran in 0.738s | 1 rows returned Query ran in 0.793s | 0 rows returned Query ran in 0.820s | 1 rows returned Query ran in 0.816s | 1 rows returned Query ran in 0.812s | 1 rows returned Query ran in 0.737s | 1 rows returned Query ran in 0.798s | 1 rows returned Query ran in 0.790s | 0 rows returned Query ran in 0.784s | 1 rows returned Query ran in 0.979s | 1 rows returned Query ran in 0.781s | 1 rows returned Query ran in 0.844s | 1 rows returned Query ran in 0.776s | 1 rows returned Query ran in 0.767s | 1 rows returned Query ran in 0.733s | 1 rows returned Query ran in 0.820s | 1 rows returned Query ran in 0.829s | 1 rows returned Query ran in 0.741s | 1 rows returned Query ran in 0.837s | 1 rows returned Query ran in 0.929s | 1 rows returned Query ran in 0.829s | 1 rows returned Query ran in 0.779s | 1 rows returned Query ran in 0.951s | 1 rows returned Query ran in 0.814s | 1 rows returned Query ran in 0.787s | 1 rows returned Query ran in 0.844s | 0 rows returned Query ran in 0.804s | 1 rows returned Query ran in 0.837s | 1 rows returned Query ran in 0.775s | 1 rows returned Query ran in 0.785s | 1 rows returned Query ran in 0.737s | 1 rows returned Query ran in 0.745s | 0 rows returned Query ran in 0.734s | 1 rows returned Query ran in 0.739s | 1 rows returned Query ran in 0.883s | 1 rows returned Query ran in 0.817s | 1 rows returned Query ran in 0.920s | 1 rows returned Query ran in 0.742s | 1 rows returned Query ran in 0.887s | 1 rows returned Query ran in 0.825s | 1 rows returned Query ran in 0.908s | 1 rows returned Query ran in 0.782s | 1 rows returned Query ran in 0.737s | 1 rows returned Query ran in 0.842s | 1 rows returned Query ran in 0.737s | 1 rows returned Query ran in 0.752s | 1 rows returned Query ran in 0.848s | 1 rows returned Query ran in 0.826s | 1 rows returned Query ran in 0.810s | 1 rows returned Query ran in 0.823s | 0 rows returned Query ran in 0.908s | 1 rows returned Query ran in 0.777s | 1 rows returned Query ran in 0.849s | 1 rows returned Query ran in 0.749s | 1 rows returned Query ran in 0.789s | 1 rows returned Query ran in 0.828s | 0 rows returned Query ran in 0.808s | 1 rows returned Query ran in 0.811s | 1 rows returned Query ran in 0.933s | 1 rows returned Query ran in 0.786s | 1 rows returned Query ran in 0.738s | 1 rows returned Query ran in 0.782s | 1 rows returned Query ran in 0.753s | 0 rows returned Query ran in 0.810s | 1 rows returned Query ran in 0.783s | 1 rows returned Query ran in 0.785s | 1 rows returned Query ran in 0.880s | 1 rows returned Query ran in 0.821s | 1 rows returned Query ran in 0.737s | 1 rows returned Query ran in 0.755s | 1 rows returned Query ran in 0.739s | 1 rows returned Query ran in 0.837s | 1 rows returned Query ran in 0.737s | 1 rows returned Query ran in 0.790s | 0 rows returned Query ran in 0.782s | 1 rows returned Query ran in 0.784s | 1 rows returned Query ran in 0.751s | 1 rows returned Query ran in 0.844s | 1 rows returned Query ran in 0.819s | 1 rows returned Query ran in 0.907s | 0 rows returned Query ran in 0.736s | 1 rows returned Query ran in 0.740s | 1 rows returned Query ran in 0.969s | 1 rows returned Query ran in 0.738s | 1 rows returned Query ran in 0.801s | 1 rows returned Query ran in 0.920s | 1 rows returned Query ran in 0.784s | 0 rows returned Query ran in 0.845s | 1 rows returned Query ran in 0.740s | 1 rows returned Query ran in 0.793s | 1 rows returned Query ran in 0.754s | 1 rows returned Query ran in 0.747s | 1 rows returned Query ran in 0.846s | 1 rows returned Query ran in 0.744s | 1 rows returned Query ran in 0.993s | 1 rows returned Query ran in 0.813s | 1 rows returned Query ran in 0.802s | 1 rows returned Query ran in 0.826s | 0 rows returned Query ran in 0.828s | 1 rows returned Query ran in 0.744s | 1 rows returned Query ran in 0.925s | 1 rows returned Query ran in 0.881s | 1 rows returned Query ran in 0.826s | 1 rows returned Query ran in 0.794s | 0 rows returned Query ran in 0.741s | 1 rows returned Query ran in 0.898s | 1 rows returned Query ran in 0.824s | 1 rows returned Query ran in 0.747s | 1 rows returned Query ran in 0.773s | 1 rows returned Query ran in 0.788s | 1 rows returned Query ran in 0.945s | 0 rows returned Query ran in 0.823s | 1 rows returned Query ran in 0.787s | 1 rows returned Query ran in 0.847s | 1 rows returned Query ran in 0.811s | 1 rows returned Query ran in 0.824s | 1 rows returned Query ran in 0.776s | 1 rows returned Query ran in 0.954s | 1 rows returned Query ran in 0.809s | 1 rows returned Query ran in 0.932s | 1 rows returned Query ran in 0.809s | 1 rows returned Query ran in 0.822s | 0 rows returned Query ran in 0.806s | 1 rows returned Query ran in 0.828s | 1 rows returned Query ran in 0.777s | 1 rows returned Query ran in 0.958s | 1 rows returned Query ran in 0.750s | 1 rows returned Query ran in 0.983s | 0 rows returned Query ran in 0.782s | 1 rows returned Query ran in 0.760s | 1 rows returned Query ran in 0.900s | 1 rows returned Query ran in 0.823s | 1 rows returned Query ran in 0.793s | 1 rows returned Query ran in 0.841s | 1 rows returned Query ran in 0.813s | 0 rows returned Query ran in 0.825s | 1 rows returned Query ran in 0.746s | 1 rows returned Query ran in 0.764s | 1 rows returned Query ran in 0.818s | 1 rows returned Query ran in 0.739s | 1 rows returned Query ran in 0.791s | 1 rows returned Query ran in 0.782s | 1 rows returned Query ran in 0.784s | 1 rows returned Query ran in 0.780s | 1 rows returned Query ran in 0.745s | 1 rows returned Query ran in 0.737s | 0 rows returned Query ran in 0.753s | 1 rows returned Query ran in 0.834s | 1 rows returned Query ran in 0.805s | 1 rows returned Query ran in 0.785s | 1 rows returned Query ran in 0.870s | 1 rows returned Query ran in 0.745s | 0 rows returned Query ran in 0.772s | 1 rows returned Query ran in 0.742s | 1 rows returned Query ran in 0.787s | 1 rows returned Query ran in 0.786s | 1 rows returned Query ran in 0.740s | 1 rows returned Query ran in 0.836s | 1 rows returned Query ran in 0.833s | 0 rows returned Query ran in 0.791s | 1 rows returned Query ran in 0.787s | 1 rows returned Query ran in 0.742s | 1 rows returned Query ran in 0.773s | 1 rows returned Query ran in 0.752s | 1 rows returned Query ran in 0.831s | 1 rows returned Query ran in 0.778s | 1 rows returned Query ran in 0.850s | 1 rows returned Query ran in 0.815s | 1 rows returned Query ran in 0.806s | 1 rows returned Query ran in 0.790s | 0 rows returned Query ran in 0.842s | 1 rows returned Query ran in 0.745s | 1 rows returned Query ran in 0.783s | 1 rows returned Query ran in 0.936s | 1 rows returned Query ran in 0.791s | 1 rows returned Query ran in 0.743s | 0 rows returned Query ran in 0.817s | 1 rows returned Query ran in 0.791s | 1 rows returned Query ran in 0.765s | 1 rows returned Query ran in 0.889s | 1 rows returned Query ran in 0.825s | 1 rows returned Query ran in 0.787s | 1 rows returned Query ran in 0.950s | 0 rows returned Query ran in 0.741s | 1 rows returned Query ran in 0.883s | 1 rows returned Query ran in 0.823s | 1 rows returned Query ran in 0.811s | 1 rows returned Query ran in 0.745s | 1 rows returned Query ran in 0.788s | 1 rows returned Query ran in 0.746s | 1 rows returned Query ran in 0.783s | 1 rows returned Query ran in 0.743s | 1 rows returned Query ran in 0.777s | 1 rows returned Query ran in 0.790s | 0 rows returned Query ran in 0.781s | 1 rows returned Query ran in 0.773s | 1 rows returned Query ran in 0.735s | 1 rows returned Query ran in 0.746s | 1 rows returned Query ran in 0.771s | 1 rows returned Query ran in 0.742s | 0 rows returned Query ran in 0.739s | 1 rows returned Query ran in 0.769s | 1 rows returned Query ran in 0.824s | 1 rows returned Query ran in 0.811s | 1 rows returned Query ran in 0.822s | 1 rows returned Query ran in 0.810s | 1 rows returned Query ran in 0.803s | 0 rows returned Query ran in 0.930s | 1 rows returned Query ran in 0.741s | 1 rows returned Query ran in 0.760s | 1 rows returned Query ran in 0.771s | 1 rows returned Query ran in 0.740s | 1 rows returned Query ran in 0.732s | 1 rows returned Query ran in 0.748s | 1 rows returned Query ran in 0.820s | 1 rows returned Query ran in 0.808s | 1 rows returned Query ran in 0.784s | 1 rows returned Query ran in 0.747s | 0 rows returned Query ran in 0.915s | 1 rows returned Query ran in 0.748s | 1 rows returned Query ran in 0.771s | 1 rows returned Query ran in 0.748s | 1 rows returned Query ran in 0.805s | 1 rows returned Query ran in 0.813s | 0 rows returned Query ran in 0.740s | 1 rows returned Query ran in 0.755s | 1 rows returned Query ran in 0.775s | 1 rows returned Query ran in 0.793s | 1 rows returned Query ran in 0.734s | 1 rows returned Query ran in 0.794s | 1 rows returned Query ran in 0.809s | 0 rows returned Query ran in 0.804s | 1 rows returned Query ran in 0.737s | 1 rows returned Query ran in 0.812s | 1 rows returned Query ran in 0.807s | 1 rows returned Query ran in 0.826s | 1 rows returned Query ran in 0.809s | 1 rows returned Query ran in 0.828s | 1 rows returned Query ran in 0.811s | 1 rows returned Query ran in 0.757s | 1 rows returned Query ran in 0.735s | 1 rows returned Query ran in 0.885s | 0 rows returned Query ran in 0.734s | 1 rows returned Query ran in 0.973s | 1 rows returned Query ran in 0.734s | 1 rows returned Query ran in 0.790s | 1 rows returned Query ran in 0.920s | 1 rows returned Query ran in 0.763s | 0 rows returned Query ran in 0.799s | 1 rows returned Query ran in 0.751s | 1 rows returned Query ran in 0.862s | 1 rows returned Query ran in 0.809s | 1 rows returned Query ran in 0.811s | 1 rows returned Query ran in 0.771s | 1 rows returned Query ran in 0.738s | 0 rows returned Query ran in 0.849s | 1 rows returned Query ran in 0.780s | 1 rows returned Query ran in 0.847s | 1 rows returned Query ran in 0.828s | 1 rows returned Query ran in 0.734s | 1 rows returned Query ran in 0.891s | 1 rows returned Query ran in 0.822s | 1 rows returned Query ran in 0.734s | 1 rows returned Query ran in 0.794s | 1 rows returned Query ran in 0.750s | 1 rows returned Query ran in 0.877s | 0 rows returned Query ran in 0.737s | 1 rows returned Query ran in 0.749s | 1 rows returned Query ran in 0.860s | 1 rows returned Query ran in 0.761s | 1 rows returned Query ran in 0.770s | 1 rows returned Query ran in 0.916s | 0 rows returned Query ran in 0.823s | 1 rows returned Query ran in 0.745s | 1 rows returned Query ran in 0.744s | 1 rows returned Query ran in 0.855s | 1 rows returned Query ran in 0.805s | 1 rows returned Query ran in 0.826s | 1 rows returned Query ran in 0.777s | 0 rows returned Query ran in 0.848s | 1 rows returned Query ran in 0.822s | 1 rows returned Query ran in 0.788s | 1 rows returned Query ran in 0.954s | 1 rows returned Query ran in 0.808s | 1 rows returned Query ran in 0.741s | 1 rows returned Query ran in 0.906s | 1 rows returned Query ran in 0.757s | 1 rows returned Query ran in 0.757s | 1 rows returned Query ran in 0.814s | 1 rows returned Query ran in 0.917s | 0 rows returned Query ran in 0.825s | 1 rows returned Query ran in 0.741s | 1 rows returned Query ran in 0.778s | 1 rows returned Query ran in 0.929s | 1 rows returned Query ran in 0.746s | 1 rows returned Query ran in 0.981s | 0 rows returned Query ran in 0.927s | 1 rows returned Query ran in 0.743s | 1 rows returned Query ran in 0.742s | 1 rows returned Query ran in 0.745s | 1 rows returned Query ran in 0.826s | 1 rows returned Query ran in 0.814s | 1 rows returned Query ran in 0.819s | 0 rows returned Query ran in 0.814s | 1 rows returned Query ran in 0.929s | 1 rows returned Query ran in 0.808s | 1 rows returned Query ran in 0.781s | 1 rows returned Query ran in 0.862s | 1 rows returned Query ran in 0.802s | 1 rows returned Query ran in 0.827s | 1 rows returned Query ran in 0.741s | 1 rows returned Query ran in 0.733s | 1 rows returned Query ran in 0.856s | 1 rows returned Query ran in 0.745s | 0 rows returned Query ran in 0.790s | 1 rows returned Query ran in 0.814s | 1 rows returned Query ran in 0.824s | 1 rows returned Query ran in 0.820s | 1 rows returned Query ran in 0.818s | 1 rows returned Query ran in 0.825s | 0 rows returned Query ran in 0.736s | 1 rows returned Query ran in 0.743s | 0 rows returned Query ran in 0.776s | 1 rows returned Query ran in 0.789s | 1 rows returned Query ran in 0.793s | 1 rows returned Query ran in 0.745s | 1 rows returned Query ran in 0.735s | 0 rows returned Query ran in 0.804s | 1 rows returned Query ran in 0.748s | 1 rows returned Query ran in 0.737s | 1 rows returned Query ran in 0.875s | 1 rows returned Query ran in 0.804s | 1 rows returned Query ran in 0.805s | 1 rows returned Query ran in 0.784s | 1 rows returned Query ran in 0.740s | 1 rows returned Query ran in 0.945s | 1 rows returned Query ran in 0.778s | 1 rows returned Query ran in 0.952s | 0 rows returned Query ran in 0.815s | 1 rows returned Query ran in 0.761s | 1 rows returned Query ran in 0.771s | 1 rows returned Query ran in 0.834s | 1 rows returned Query ran in 0.806s | 1 rows returned Query ran in 0.741s | 0 rows returned Query ran in 0.901s | 1 rows returned Query ran in 0.821s | 0 rows returned Query ran in 0.777s | 1 rows returned Query ran in 0.791s | 1 rows returned Query ran in 0.886s | 1 rows returned Query ran in 0.816s | 1 rows returned Query ran in 0.805s | 0 rows returned Query ran in 0.924s | 1 rows returned Query ran in 0.792s | 1 rows returned Query ran in 0.745s | 0 rows returned Query ran in 0.816s | 1 rows returned Query ran in 0.789s | 0 rows returned Query ran in 0.836s | 1 rows returned Query ran in 0.824s | 1 rows returned Query ran in 0.817s | 1 rows returned Query ran in 0.786s | 1 rows returned Query ran in 0.748s | 1 rows returned Query ran in 0.748s | 0 rows returned Query ran in 0.764s | 1 rows returned Query ran in 0.834s | 1 rows returned Query ran in 0.812s | 1 rows returned Query ran in 0.777s | 1 rows returned Query ran in 0.840s | 1 rows returned Query ran in 0.822s | 0 rows returned Query ran in 0.753s | 1 rows returned Query ran in 0.885s | 0 rows returned Query ran in 0.742s | 1 rows returned Query ran in 0.777s | 1 rows returned Query ran in 0.744s | 1 rows returned Query ran in 0.741s | 1 rows returned Query ran in 0.804s | 0 rows returned Query ran in 0.790s | 1 rows returned Query ran in 0.817s | 1 rows returned Query ran in 0.807s | 0 rows returned Query ran in 0.782s | 1 rows returned Query ran in 0.870s | 0 rows returned Query ran in 0.735s | 1 rows returned Query ran in 0.991s | 1 rows returned Query ran in 0.732s | 1 rows returned Query ran in 0.907s | 1 rows returned Query ran in 0.808s | 1 rows returned Query ran in 0.799s | 0 rows returned Query ran in 0.839s | 1 rows returned Query ran in 0.815s | 1 rows returned Query ran in 0.825s | 1 rows returned Query ran in 0.781s | 1 rows returned Query ran in 0.849s | 1 rows returned Query ran in 0.927s | 0 rows returned Query ran in 0.810s | 1 rows returned Query ran in 0.819s | 0 rows returned Query ran in 0.741s | 1 rows returned Query ran in 0.794s | 1 rows returned Query ran in 0.833s | 1 rows returned Query ran in 0.758s | 1 rows returned Query ran in 0.743s | 0 rows returned Query ran in 0.836s | 1 rows returned Query ran in 0.822s | 1 rows returned Query ran in 0.825s | 0 rows returned Query ran in 0.739s | 1 rows returned Query ran in 0.740s | 0 rows returned Query ran in 0.744s | 1 rows returned Query ran in 0.745s | 1 rows returned Query ran in 0.908s | 1 rows returned Query ran in 0.820s | 1 rows returned Query ran in 0.749s | 1 rows returned Query ran in 0.743s | 0 rows returned Query ran in 0.780s | 1 rows returned Query ran in 0.900s | 1 rows returned Query ran in 0.812s | 1 rows returned Query ran in 0.803s | 1 rows returned Query ran in 0.818s | 1 rows returned Query ran in 0.739s | 0 rows returned Query ran in 0.744s | 1 rows returned Query ran in 0.869s | 0 rows returned Query ran in 0.783s | 1 rows returned Query ran in 0.957s | 1 rows returned Query ran in 0.922s | 1 rows returned Query ran in 0.820s | 1 rows returned Query ran in 0.785s | 0 rows returned Query ran in 0.781s | 1 rows returned Query ran in 0.871s | 1 rows returned Query ran in 0.751s | 0 rows returned Query ran in 0.745s | 1 rows returned Query ran in 0.968s | 0 rows returned Query ran in 0.743s | 1 rows returned Query ran in 0.762s | 1 rows returned Query ran in 0.951s | 1 rows returned Query ran in 0.811s | 1 rows returned Query ran in 0.815s | 1 rows returned Query ran in 0.825s | 0 rows returned Query ran in 0.752s | 1 rows returned Query ran in 0.748s | 1 rows returned Query ran in 0.843s | 1 rows returned Query ran in 0.823s | 1 rows returned Query ran in 0.821s | 1 rows returned Query ran in 0.770s | 0 rows returned Query ran in 0.870s | 1 rows returned Query ran in 0.790s | 0 rows returned Query ran in 0.743s | 1 rows returned Query ran in 0.804s | 1 rows returned Query ran in 0.808s | 1 rows returned Query ran in 0.829s | 1 rows returned Query ran in 0.745s | 0 rows returned Query ran in 0.750s | 1 rows returned Query ran in 0.952s | 1 rows returned Query ran in 0.784s | 0 rows returned Query ran in 0.842s | 1 rows returned Query ran in 0.822s | 0 rows returned Query ran in 0.835s | 1 rows returned Query ran in 0.782s | 1 rows returned Query ran in 0.845s | 1 rows returned Query ran in 0.824s | 1 rows returned Query ran in 0.821s | 1 rows returned Query ran in 0.739s | 0 rows returned Query ran in 0.789s | 1 rows returned Query ran in 0.815s | 1 rows returned Query ran in 0.814s | 1 rows returned Query ran in 0.754s | 1 rows returned Query ran in 0.738s | 1 rows returned Query ran in 0.739s | 0 rows returned Query ran in 0.728s | 1 rows returned Query ran in 0.809s | 0 rows returned Query ran in 0.809s | 1 rows returned Query ran in 0.828s | 1 rows returned Query ran in 0.812s | 1 rows returned Query ran in 0.794s | 1 rows returned Query ran in 0.755s | 0 rows returned Query ran in 0.740s | 1 rows returned Query ran in 0.768s | 1 rows returned Query ran in 0.934s | 0 rows returned Query ran in 0.815s | 1 rows returned Query ran in 0.779s | 0 rows returned Query ran in 0.774s | 1 rows returned Query ran in 0.776s | 1 rows returned Query ran in 0.922s | 1 rows returned Query ran in 0.924s | 1 rows returned Query ran in 0.823s | 1 rows returned Query ran in 0.808s | 0 rows returned Query ran in 0.790s | 1 rows returned Query ran in 0.943s | 1 rows returned Query ran in 0.804s | 1 rows returned Query ran in 0.848s | 1 rows returned Query ran in 0.737s | 1 rows returned Query ran in 0.895s | 0 rows returned Query ran in 0.805s | 1 rows returned Query ran in 0.781s | 0 rows returned Query ran in 0.845s | 1 rows returned Query ran in 0.793s | 1 rows returned Query ran in 0.857s | 1 rows returned Query ran in 0.815s | 1 rows returned Query ran in 0.823s | 0 rows returned Query ran in 0.806s | 0 rows returned Query ran in 0.790s | 0 rows returned Query ran in 0.850s | 0 rows returned Query ran in 0.787s | 1 rows returned Query ran in 0.853s | 0 rows returned Query ran in 0.735s | 1 rows returned Query ran in 0.788s | 1 rows returned Query ran in 0.801s | 1 rows returned Query ran in 0.792s | 1 rows returned Query ran in 0.960s | 1 rows returned Query ran in 0.816s | 0 rows returned Query ran in 0.810s | 1 rows returned Query ran in 0.746s | 1 rows returned Query ran in 0.781s | 1 rows returned Query ran in 0.745s | 1 rows returned Query ran in 0.801s | 1 rows returned Query ran in 0.825s | 0 rows returned Query ran in 0.817s | 1 rows returned Query ran in 0.764s | 0 rows returned Query ran in 0.768s | 1 rows returned Query ran in 0.817s | 1 rows returned Query ran in 0.790s | 1 rows returned Query ran in 0.953s | 1 rows returned Query ran in 0.773s | 0 rows returned Query ran in 0.748s | 0 rows returned Query ran in 0.828s | 0 rows returned Query ran in 0.817s | 0 rows returned Query ran in 0.815s | 1 rows returned Query ran in 0.809s | 0 rows returned Query ran in 0.767s | 1 rows returned Query ran in 0.744s | 1 rows returned Query ran in 0.749s | 1 rows returned Query ran in 0.812s | 1 rows returned Query ran in 0.738s | 1 rows returned Query ran in 0.744s | 0 rows returned Query ran in 0.864s | 1 rows returned Query ran in 0.819s | 1 rows returned Query ran in 0.928s | 1 rows returned Query ran in 0.747s | 1 rows returned Query ran in 0.816s | 1 rows returned Query ran in 0.753s | 0 rows returned Query ran in 0.737s | 1 rows returned Query ran in 0.804s | 0 rows returned Query ran in 0.788s | 1 rows returned Query ran in 0.850s | 1 rows returned Query ran in 0.742s | 1 rows returned Query ran in 0.745s | 1 rows returned Query ran in 0.773s | 0 rows returned Query ran in 0.798s | 0 rows returned Query ran in 0.746s | 0 rows returned Query ran in 0.780s | 0 rows returned Query ran in 0.821s | 1 rows returned Query ran in 0.829s | 0 rows returned Query ran in 0.821s | 1 rows returned Query ran in 0.750s | 1 rows returned Query ran in 0.772s | 1 rows returned Query ran in 0.743s | 1 rows returned Query ran in 0.903s | 1 rows returned Query ran in 0.790s | 0 rows returned Query ran in 0.750s | 1 rows returned Query ran in 0.895s | 1 rows returned Query ran in 0.746s | 1 rows returned Query ran in 0.780s | 1 rows returned Query ran in 0.811s | 1 rows returned Query ran in 0.746s | 0 rows returned Query ran in 0.787s | 1 rows returned Query ran in 0.750s | 0 rows returned Query ran in 0.882s | 1 rows returned Query ran in 0.838s | 1 rows returned Query ran in 0.800s | 1 rows returned Query ran in 0.748s | 1 rows returned Query ran in 0.728s | 0 rows returned Query ran in 0.749s | 0 rows returned Query ran in 0.741s | 0 rows returned Query ran in 0.909s | 0 rows returned Query ran in 0.746s | 1 rows returned Query ran in 0.793s | 0 rows returned Query ran in 0.811s | 1 rows returned Query ran in 0.809s | 1 rows returned Query ran in 0.822s | 1 rows returned Query ran in 0.776s | 1 rows returned Query ran in 0.765s | 1 rows returned Query ran in 0.834s | 0 rows returned Query ran in 0.812s | 1 rows returned Query ran in 0.816s | 1 rows returned Query ran in 0.787s | 1 rows returned Query ran in 0.853s | 1 rows returned Query ran in 0.740s | 1 rows returned Query ran in 0.882s | 0 rows returned Query ran in 0.739s | 1 rows returned Query ran in 0.792s | 0 rows returned Query ran in 0.817s | 1 rows returned Query ran in 0.781s | 1 rows returned Query ran in 0.802s | 1 rows returned Query ran in 0.736s | 1 rows returned Query ran in 0.844s | 0 rows returned Query ran in 0.751s | 0 rows returned Query ran in 0.780s | 0 rows returned Query ran in 0.917s | 0 rows returned Query ran in 0.832s | 0 rows returned Query ran in 0.742s | 0 rows returned Query ran in 0.729s | 1 rows returned Query ran in 0.864s | 1 rows returned Query ran in 0.744s | 1 rows returned Query ran in 0.776s | 1 rows returned Query ran in 0.791s | 1 rows returned Query ran in 0.759s | 0 rows returned Query ran in 1.008s | 1 rows returned Query ran in 0.740s | 1 rows returned Query ran in 0.793s | 1 rows returned Query ran in 0.787s | 1 rows returned Query ran in 0.730s | 1 rows returned Query ran in 0.821s | 0 rows returned Query ran in 0.819s | 1 rows returned Query ran in 0.809s | 0 rows returned Query ran in 0.814s | 1 rows returned Query ran in 0.836s | 1 rows returned Query ran in 0.819s | 1 rows returned Query ran in 0.792s | 1 rows returned Query ran in 0.824s | 0 rows returned Query ran in 0.744s | 0 rows returned Query ran in 0.815s | 0 rows returned Query ran in 0.784s | 0 rows returned Query ran in 0.823s | 0 rows returned Query ran in 0.932s | 0 rows returned Query ran in 0.809s | 1 rows returned Query ran in 0.825s | 1 rows returned Query ran in 0.816s | 1 rows returned Query ran in 0.814s | 1 rows returned Query ran in 0.831s | 1 rows returned Query ran in 0.751s | 0 rows returned Query ran in 0.776s | 1 rows returned Query ran in 0.816s | 1 rows returned Query ran in 0.744s | 1 rows returned Query ran in 0.788s | 1 rows returned Query ran in 0.828s | 1 rows returned Query ran in 0.811s | 0 rows returned Query ran in 0.738s | 1 rows returned Query ran in 0.791s | 0 rows returned Query ran in 0.742s | 1 rows returned Query ran in 0.746s | 1 rows returned Query ran in 0.773s | 1 rows returned Query ran in 0.803s | 1 rows returned Query ran in 0.812s | 0 rows returned Query ran in 0.747s | 0 rows returned Query ran in 0.753s | 0 rows returned Query ran in 0.746s | 0 rows returned Query ran in 0.918s | 0 rows returned Query ran in 0.787s | 0 rows returned Query ran in 0.872s | 1 rows returned Query ran in 0.901s | 1 rows returned Query ran in 0.728s | 1 rows returned Query ran in 0.767s | 1 rows returned Query ran in 0.835s | 1 rows returned Query ran in 0.782s | 0 rows returned Query ran in 0.737s | 1 rows returned Query ran in 0.839s | 1 rows returned Query ran in 0.740s | 1 rows returned Query ran in 0.745s | 1 rows returned Query ran in 0.875s | 1 rows returned Query ran in 0.752s | 0 rows returned Query ran in 0.764s | 1 rows returned Query ran in 0.748s | 0 rows returned Query ran in 0.784s | 1 rows returned Query ran in 0.750s | 1 rows returned Query ran in 0.758s | 1 rows returned Query ran in 0.750s | 1 rows returned Query ran in 0.793s | 0 rows returned Query ran in 0.785s | 0 rows returned Query ran in 0.781s | 0 rows returned Query ran in 0.782s | 0 rows returned Query ran in 0.743s | 0 rows returned Query ran in 0.751s | 0 rows returned Query ran in 0.739s | 1 rows returned Query ran in 0.783s | 1 rows returned Query ran in 0.867s | 1 rows returned Query ran in 0.815s | 1 rows returned Query ran in 0.749s | 1 rows returned Query ran in 0.768s | 0 rows returned Query ran in 0.813s | 1 rows returned Query ran in 0.825s | 1 rows returned Query ran in 0.822s | 1 rows returned Query ran in 0.940s | 1 rows returned Query ran in 0.741s | 1 rows returned Query ran in 0.772s | 0 rows returned Query ran in 0.790s | 0 rows returned Query ran in 0.850s | 0 rows returned Query ran in 0.745s | 1 rows returned Query ran in 0.793s | 0 rows returned Query ran in 0.910s | 1 rows returned Query ran in 0.828s | 1 rows returned Query ran in 0.815s | 0 rows returned Query ran in 0.910s | 0 rows returned Query ran in 0.822s | 0 rows returned Query ran in 0.816s | 0 rows returned Query ran in 0.812s | 0 rows returned Query ran in 0.731s | 0 rows returned Query ran in 0.810s | 1 rows returned Query ran in 0.786s | 1 rows returned Query ran in 0.840s | 1 rows returned Query ran in 0.821s | 1 rows returned Query ran in 0.817s | 1 rows returned Query ran in 0.822s | 0 rows returned Query ran in 0.823s | 1 rows returned Query ran in 0.815s | 1 rows returned Query ran in 0.739s | 1 rows returned Query ran in 0.775s | 1 rows returned Query ran in 0.832s | 0 rows returned Query ran in 0.753s | 0 rows returned Query ran in 0.758s | 0 rows returned Query ran in 0.835s | 0 rows returned Query ran in 0.827s | 1 rows returned Query ran in 0.811s | 0 rows returned Query ran in 0.814s | 1 rows returned Query ran in 0.744s | 1 rows returned Query ran in 0.784s | 0 rows returned Query ran in 0.934s | 0 rows returned Query ran in 0.819s | 0 rows returned Query ran in 0.813s | 0 rows returned Query ran in 0.748s | 0 rows returned Query ran in 0.768s | 0 rows returned Query ran in 0.840s | 0 rows returned Query ran in 0.736s | 1 rows returned Query ran in 0.791s | 1 rows returned Query ran in 0.772s | 1 rows returned Query ran in 0.758s | 1 rows returned Query ran in 0.833s | 0 rows returned Query ran in 0.898s | 1 rows returned Time_avg-Voltage moteid date 0 2.687923 1 2004-03-01 1 2.662244 2 2004-03-01 2 2.689153 3 2004-03-01 3 2.654764 4 2004-03-01 4 2.631788 6 2004-03-01
Motes_avg_voltage.head()
| Time_avg-Voltage | moteid | date | |
|---|---|---|---|
| 0 | 2.687923 | 1 | 2004-03-01 |
| 1 | 2.662244 | 2 | 2004-03-01 |
| 2 | 2.689153 | 3 | 2004-03-01 |
| 3 | 2.654764 | 4 | 2004-03-01 |
| 4 | 2.631788 | 6 | 2004-03-01 |
fig = px.line(Motes_avg_voltage,
x='date',
y='Time_avg-Voltage',
color='moteid', # separate lines per mote
title='Time-Series of Average Voltage per Mote',
labels={'time_avg_voltage': 'Voltage', 'timestamp': 'Time', 'moteid': 'Mote ID'},
markers=True)
fig.show()
Insight(s): Looking at the overall trend, we see that for most motes, the average voltage is gradually decreasing over time. This suggests that either the motes' batteries are discharging slowly or the voltage supply is dropping over time. When it comes to specific trends, Motes 8, 15, 16, 17, 18, and 20 show a sharp decline in voltage around mid-March. Moreover, their average voltages are not consistent with those of the other motes. The sharp voltage drop could indicate a sensor malfunction, temporary power loss, or disconnection.
Concluding Remarks¶
In conclusion, GridDB's TimeSeries container proved to be highly efficient in handling the Intel Lab dataset, having over 2 Million rows. Using TQL, we were able to store, query, and retrieve large volumes of sensor data within seconds, enabling faster analysis. The query execution times are a testament to the fact that GridDB's TimeSeries containers are optimized for large datasets. Hence, GridDB is suitable for IoT applications as it can handle big data with impressive speed and reliability. By combining GridDB’s timeseries capabilities with Python, we were able to dive into the analysis right away, as query execution was never a bottleneck. For teams working with IoT, high-frequency monitoring and real-time analytics, GridDB Cloud offers a powerful foundation for building highly responsive applications. Check out the official GridDB Cloud page to learn more.
If you have any questions about the blog, please create a Stack Overflow post here https://stackoverflow.com/questions/ask?tags=griddb .
Make sure that you use the “griddb” tag so our engineers can quickly reply to your questions.
