Skip to main content

Dataframe-like wrapper for SeaTable API.

Project description

sea-serpent

A dataframe-like wrapper around the SeaTable API.

This library tries to make interacting with SeaTables as if you were working with a local pandas DataFrame.

Some notes:

  • This library is at an early stage and the interface might still change somewhat.
  • For convenience and ease of access we're using names to identify tables, columns and bases. Hence you should avoid duplicate names if at all possible.

Install

pip3 install git+git://github.com/schlegelp/sea-serpent@main

Examples

Getting your API (auth) token

>>> import seaserpent as ss
>>> ss.get_auth_token(username='USER',
...                   password='PASSWORD',
...                   server='https://cloud.seatable.io')
{'token': 'somelongassstring1234567@£$^@£$^£'}

For future use set your default server and auth token as SEATABLE_SERVER and SEATABLE_TOKEN environment variable, respectively.

Initializing a table

Table works as connection to a single SeaTable table. If its name is unique, you can initialize the connection with just the name:

>>> import seaserpent as ss
>>> # Initialize the table
>>> # (if there are multiple tables with this name you need to provide more details)
>>> table = ss.Table(table='MyTable')
>>> table
SeaTable <"MyTable", 10 rows, 2 columns>
>>> # Inspect the first couple rows
>>> table.head()
    column1     labels
0         1          A
1         2          B
2         3          C

Fetching data

The Table itself doesn't download any of the data. Reading the data works via an interface similar to pandas.DataFrames:

>>> # Fetching a column returns a promise
>>> c = table['column1']  # this works too: c = table.column1
>>> c
Column <column="column1", table="LH_bodies", datatype=number>
>>> # To get the values
>>> c.values
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> # Filters are automatically translated into SQL query
>>> table.loc[table.column1 >= 7]
    column1     labels
0         7          H
1         8          I
2         9          J
>>> table.loc[table.labels.isin(['D', 'E']) ]
    column1     labels
0         4          D
1         5          E
>>> # Download the whole table as pandas DataFrame
>>> df = table.to_frame()

Adding a column

>>> # First we need to re-initialize the table with write access
>>> table = ss.Table(table='MyTable', read_only=False)
>>> table.add_column(col_name='checked', col_type=bool)
>>> # The column will be empty
>>> table.head()
    column1     labels   checked
0         1          A      None
1         2          B      None
2         3          C      None

Pushing data to table

>>> # Overwrite the whole column
>>> table['checked'] = False
>>> table.head()
    column1     labels   checked
0         1          A     False
1         2          B     False
2         3          C     False
>>> # Alternatively pass a list of values
>>> table['checked'] = [False, True, False]
>>> table.head()
    column1     labels   checked
0         1          A     False
1         2          B      True
2         3          C     False
>>> # Write to a subset of the column
>>> table.loc[:2, 'checked'] = False
>>> table.loc[table.labels == 'C', 'checked'] = True
>>> table.head()
    column1     labels   checked
0         1          A     False
1         2          B     False
2         3          C      True

Deleting a column

>>> table['checked'].delete()
>>> table.head()
    column1     labels
0         1          A
1         2          B
2         3          C

Creating a new table

Empty table:

>>> table = ss.Table.new(table_name='MyNewTable', base='MyBase')

From pandas DataFrame:

>>> table = ss.Table.from_frame(df, table_name='MyNewTable', base='MyBase')

Linking tables

Create links:

>>> table.link(other_table='OtherTable',    # name of the other table (must be same base)
...            link_on='Column1',           # column in this table to link on
...            link_on_other='ColumnA',     # column in other table to link on
...            link_col='OtherTableLinks')  # name of column to store links in

Create column that pulls data from linked table:

>>> table.add_linked_column(col_name='LinkedData',      # name of new column
...                         link_col='OtherTableLinks', # column with link(s) to other table
...                         link_on='some_value',       # which column in other table to link to
...                         formula='lookup')           # how to aggregate data (lookup, mean, max, etc)

Known limitations & oddities

  1. 64 bit integers are truncated when writing to a table. I suspect this happens on the server side when decoding the JSON payload because manually entering large numbers through the web interface works perfectly well. Hence, seaserpent safely (and quietly) downcasts 64 bit integers to 32 bit or failing that converts them to floats before uploading.
  2. The web interface appears to only show floats up to the 8th decimal. In the database the precision must be higher though because I have successfully written 1e-128 floats.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sea-serpent-0.1.0.tar.gz (16.8 kB view details)

Uploaded Source

Built Distribution

sea_serpent-0.1.0-py3-none-any.whl (29.3 kB view details)

Uploaded Python 3

File details

Details for the file sea-serpent-0.1.0.tar.gz.

File metadata

  • Download URL: sea-serpent-0.1.0.tar.gz
  • Upload date:
  • Size: 16.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 importlib_metadata/0.23 pkginfo/1.5.0.1 requests/2.24.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.7.5

File hashes

Hashes for sea-serpent-0.1.0.tar.gz
Algorithm Hash digest
SHA256 9670df761468077b852b7297da071b7167eece12466c9e2309e9dcc8b1b5798b
MD5 a17525fb29279df366b63d1a06c3c1ea
BLAKE2b-256 39f69ad702668a9a4c1307b0e77074ae8f71a25e4c92032fd71e4df066e95370

See more details on using hashes here.

File details

Details for the file sea_serpent-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: sea_serpent-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 29.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 importlib_metadata/0.23 pkginfo/1.5.0.1 requests/2.24.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.7.5

File hashes

Hashes for sea_serpent-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2984470c67633b19551586936d66bf5211ff4453f4237b888101610fb05a65f4
MD5 e43d39828f07e425d442399c074b7040
BLAKE2b-256 96c7e1a8896290bd6727959ec016f4f71b04f4b1c2460bd04e187ed0538ac0c1

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page