Seeq Spy
raw JSON → 201.0 verified Fri May 01 auth: no python
Easy-to-use Python interface for Seeq, providing high-level access to Seeq data, analyses, and workbooks. Current version: 201.0. Release cadence is irregular, following Seeq product updates.
pip install seeq-spy Common errors
error ModuleNotFoundError: No module named 'spy' ↓
cause Importing spy without the 'seeq' namespace. In seeq-spy >=201.0, the module is nested under seeq.
fix
Use: import seeq.spy as spy
error ValueError: index must be timezone-aware for push ↓
cause The DataFrame index (timestamp column) is timezone-naive when calling spy.push(). Seeq requires UTC timezone.
fix
Convert index to UTC: df.index = df.index.tz_localize('UTC') if the timestamps are in UTC, or use tz_convert.
error AttributeError: 'DataFrame' object has no attribute 'Signal' ↓
cause After spy.search(), expecting to access columns directly like df.Signal, but the DataFrame may have MultiIndex columns (since version 200.0).
fix
Print df.columns to inspect structure, then use tuple indexing: df[('Signal', 'Value')].
error TypeError: spy.push() got an unexpected keyword argument 'metadata' ↓
cause The 'metadata' parameter was added in a specific version; using an older version of seeq-spy that doesn't support it.
fix
Upgrade seeq-spy: pip install --upgrade seeq-spy. Or omit the metadata argument.
Warnings
breaking In seeq-spy 201.0, the spy object is no longer a global singleton but must be imported explicitly. Direct import of `spy` without the `seeq.` namespace will fail. ↓
fix Use `import seeq.spy as spy` instead of `import spy`.
breaking The `spy.pull()` method now returns a Pandas DataFrame with MultiIndex columns. Code that expects single-level columns may break. ↓
fix Access columns via tuples (e.g., `df[('Signal Name', 'Value')]`) or flatten the MultiIndex using `.columns.droplevel()`.
deprecated `spy.authenticate()` is deprecated in favor of `spy.login()`. The old method may be removed in a future version. ↓
fix Replace `spy.authenticate(url, username, password)` with `spy.login(url, username=..., password=...)`.
gotcha `spy.search()` returns a DataFrame, not a list. Iterating directly over the DataFrame yields column names, not rows. ↓
fix Use `for index, row in df.iterrows():` or convert to dict with `df.to_dict('records')`.
gotcha When pushing data with `spy.push()`, the index must be timezone-aware (UTC). Naive timestamps will raise a ValueError. ↓
fix Ensure your DataFrame index uses `pd.DatetimeIndex` with `tz='UTC'`: `df.index = df.index.tz_localize('UTC')` if naive.
Imports
- spy wrong
import spycorrectimport seeq.spy as spy
Quickstart
import seeq.spy as spy
import os
# Authenticate using URL and credentials
url = os.environ.get('SEEQ_URL', 'https://demo.seeq.com')
spy.login(url, username='demo', password='demo')
# Search for a signal
results = spy.search({'Name': 'Temperature'})
print(results.head())