PIQuery¶
The PIQuery class provides a fluent, method-chaining interface for
building PI data queries. It’s accessed through PIClient.query().
PIQuery Class¶
- class pipolars.PIQuery[source]¶
Bases:
objectFluent query builder for PI data.
This class provides a method-chaining interface for building PI data queries in a readable, declarative style.
Example
>>> df = client.query("SINUSOID") \ ... .time_range("*-1d", "*") \ ... .recorded() \ ... .with_quality() \ ... .to_dataframe()
>>> df = client.query(["TAG1", "TAG2"]) \ ... .last(hours=24) \ ... .interpolated(interval="15m") \ ... .pivot() \ ... .to_dataframe()
>>> df = client.query("SINUSOID") \ ... .time_range("*-7d", "*") \ ... .summary(SummaryType.AVERAGE, SummaryType.MAXIMUM) \ ... .to_dataframe()
Time Range Methods
Query Type Methods
- summary(*summary_types)[source]¶
Query for summary statistics.
- Parameters:
*summary_types (SummaryType) – Summary types to calculate
- Returns:
Self for method chaining
- Return type:
- snapshot()[source]¶
Query for current snapshot values.
- Returns:
Self for method chaining
- Return type:
Option Methods
- with_quality()[source]¶
Include quality information in results.
- Returns:
Self for method chaining
- Return type:
- without_quality()[source]¶
Exclude quality information from results.
- Returns:
Self for method chaining
- Return type:
- boundary(boundary_type)[source]¶
Set the boundary type for recorded values.
- Parameters:
boundary_type (BoundaryType) – Boundary type to use
- Returns:
Self for method chaining
- Return type:
- pivot()[source]¶
Pivot results to wide format (tags as columns).
- Returns:
Self for method chaining
- Return type:
Execution Methods
- to_dataframe()[source]¶
Execute the query and return a Polars DataFrame.
- Returns:
DataFrame with query results
- Return type:
DataFrame
- to_lazy_frame()[source]¶
Execute the query and return a Polars LazyFrame.
- Returns:
LazyFrame for deferred execution
- Return type:
LazyFrame
- summary(*summary_types)[source]¶
Query for summary statistics.
- Parameters:
*summary_types (SummaryType) – Summary types to calculate
- Returns:
Self for method chaining
- Return type:
- snapshot()[source]¶
Query for current snapshot values.
- Returns:
Self for method chaining
- Return type:
- with_quality()[source]¶
Include quality information in results.
- Returns:
Self for method chaining
- Return type:
- without_quality()[source]¶
Exclude quality information from results.
- Returns:
Self for method chaining
- Return type:
- boundary(boundary_type)[source]¶
Set the boundary type for recorded values.
- Parameters:
boundary_type (BoundaryType) – Boundary type to use
- Returns:
Self for method chaining
- Return type:
- pivot()[source]¶
Pivot results to wide format (tags as columns).
- Returns:
Self for method chaining
- Return type:
- to_dataframe()[source]¶
Execute the query and return a Polars DataFrame.
- Returns:
DataFrame with query results
- Return type:
DataFrame
QueryOptions Class¶
- class pipolars.api.query.QueryOptions[source]¶
Bases:
objectOptions for a PI query.
- boundary_type: BoundaryType = 'inside'¶
- summary_types: list[SummaryType]¶
- __init__(query_type=QueryType.RECORDED, start=None, end=None, interval=None, max_count=0, include_quality=False, boundary_type=BoundaryType.INSIDE, filter_expression=None, summary_types=<factory>, plot_intervals=640, pivot=False)¶
QueryType Enum¶
Usage Examples¶
Basic Query Building¶
from pipolars import PIClient
with PIClient("my-pi-server") as client:
# Simple recorded values query
df = (
client.query("SINUSOID")
.time_range("*-1d", "*")
.recorded()
.to_dataframe()
)
# Using convenience time methods
df = (
client.query("SINUSOID")
.last(hours=24)
.recorded()
.to_dataframe()
)
Interpolated Values¶
with PIClient("my-pi-server") as client:
# Hourly interpolation
df = (
client.query("SINUSOID")
.last(days=7)
.interpolated(interval="1h")
.to_dataframe()
)
# 15-minute intervals with quality
df = (
client.query("SINUSOID")
.time_range("*-4h", "*")
.interpolated(interval="15m")
.with_quality()
.to_dataframe()
)
Multi-Tag Queries¶
with PIClient("my-pi-server") as client:
# Multiple tags, long format
df = (
client.query(["TAG1", "TAG2", "TAG3"])
.last(hours=4)
.interpolated(interval="10m")
.to_dataframe()
)
# Pivot to wide format
df = (
client.query(["TAG1", "TAG2", "TAG3"])
.time_range("*-2h", "*")
.interpolated(interval="10m")
.pivot()
.to_dataframe()
)
Summary Statistics¶
from pipolars import PIClient, SummaryType
with PIClient("my-pi-server") as client:
# Overall summary
df = (
client.query("SINUSOID")
.last(days=7)
.summary(
SummaryType.AVERAGE,
SummaryType.MINIMUM,
SummaryType.MAXIMUM,
SummaryType.STD_DEV
)
.to_dataframe()
)
Lazy Evaluation¶
import polars as pl
with PIClient("my-pi-server") as client:
# Get LazyFrame for deferred execution
lf = (
client.query("SINUSOID")
.last(days=30)
.recorded()
.to_lazy_frame()
)
# Build complex query
result = (
lf.filter(pl.col("value") > 50)
.with_columns(
pl.col("value").rolling_mean(window_size=100).alias("rolling")
)
.collect() # Execute
)
Method Chaining Patterns¶
with PIClient("my-pi-server") as client:
# All options at once
df = (
client.query(["TAG1", "TAG2"])
.time_range("*-1d", "*")
.interpolated(interval="30m")
.with_quality()
.pivot()
.limit(1000)
.to_dataframe()
)
See Also¶
PIClient - PIClient class
Types - SummaryType and other enums
Querying Data - Complete querying guide