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
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.
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.

Import the spy module, authenticate via spy.login, and search for data items. Replace credentials with your own.

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())