{"id":24570,"library":"seeq-spy","title":"Seeq Spy","description":"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.","status":"active","version":"201.0","language":"python","source_language":"en","source_url":"https://github.com/seeq12/seeq-spy","tags":["seeq","industrial","time-series","data-analysis","spy"],"install":[{"cmd":"pip install seeq-spy","lang":"bash","label":"Install from PyPI"}],"dependencies":[],"imports":[{"note":"Without the 'seeq' namespace, Python will look for a top-level 'spy' module, which may not exist or conflict.","wrong":"import spy","symbol":"spy","correct":"import seeq.spy as spy"}],"quickstart":{"code":"import seeq.spy as spy\nimport os\n\n# Authenticate using URL and credentials\nurl = os.environ.get('SEEQ_URL', 'https://demo.seeq.com')\nspy.login(url, username='demo', password='demo')\n\n# Search for a signal\nresults = spy.search({'Name': 'Temperature'})\nprint(results.head())","lang":"python","description":"Import the spy module, authenticate via spy.login, and search for data items. Replace credentials with your own."},"warnings":[{"fix":"Use `import seeq.spy as spy` instead of `import spy`.","message":"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.","severity":"breaking","affected_versions":">=201.0"},{"fix":"Access columns via tuples (e.g., `df[('Signal Name', 'Value')]`) or flatten the MultiIndex using `.columns.droplevel()`.","message":"The `spy.pull()` method now returns a Pandas DataFrame with MultiIndex columns. Code that expects single-level columns may break.","severity":"breaking","affected_versions":">=200.0"},{"fix":"Replace `spy.authenticate(url, username, password)` with `spy.login(url, username=..., password=...)`.","message":"`spy.authenticate()` is deprecated in favor of `spy.login()`. The old method may be removed in a future version.","severity":"deprecated","affected_versions":">=200.0"},{"fix":"Use `for index, row in df.iterrows():` or convert to dict with `df.to_dict('records')`.","message":"`spy.search()` returns a DataFrame, not a list. Iterating directly over the DataFrame yields column names, not rows.","severity":"gotcha","affected_versions":"all"},{"fix":"Ensure your DataFrame index uses `pd.DatetimeIndex` with `tz='UTC'`: `df.index = df.index.tz_localize('UTC')` if naive.","message":"When pushing data with `spy.push()`, the index must be timezone-aware (UTC). Naive timestamps will raise a ValueError.","severity":"gotcha","affected_versions":"all"}],"env_vars":null,"last_verified":"2026-05-01T00:00:00.000Z","next_check":"2026-07-30T00:00:00.000Z","problems":[{"fix":"Use: import seeq.spy as spy","cause":"Importing spy without the 'seeq' namespace. In seeq-spy >=201.0, the module is nested under seeq.","error":"ModuleNotFoundError: No module named 'spy'"},{"fix":"Convert index to UTC: df.index = df.index.tz_localize('UTC') if the timestamps are in UTC, or use tz_convert.","cause":"The DataFrame index (timestamp column) is timezone-naive when calling spy.push(). Seeq requires UTC timezone.","error":"ValueError: index must be timezone-aware for push"},{"fix":"Print df.columns to inspect structure, then use tuple indexing: df[('Signal', 'Value')].","cause":"After spy.search(), expecting to access columns directly like df.Signal, but the DataFrame may have MultiIndex columns (since version 200.0).","error":"AttributeError: 'DataFrame' object has no attribute 'Signal'"},{"fix":"Upgrade seeq-spy: pip install --upgrade seeq-spy. Or omit the metadata argument.","cause":"The 'metadata' parameter was added in a specific version; using an older version of seeq-spy that doesn't support it.","error":"TypeError: spy.push() got an unexpected keyword argument 'metadata'"}],"ecosystem":"pypi","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}