Skip to main content

Create Excel spreadsheets with formulas using a DataFrame-like API

Project description

Excelify: Create Excel spreadsheets using DataFrame-like API

Python tests

Excelify is a DataFrame-like library that lets users create Excel spreadsheets.

To learn more, read Getting Started. TODO: Add a link.

Demo

excelify-viewer

(Click the image above to go to a demo video.)

Example

We'll create a table that demonstrates compounded interest. We first define an "emtpy table" using el.ExcelFrame:

import excelify as el
df = el.ExcelFrame.empty(
    columns=["year", "boy_amount", "annual_return", "eoy_amount"],
    height=3,
)

Printing df will show the following:

>>> df
shape: (3, 4)
+---+----------+----------------+-------------------+----------------+
|   | year (A) | boy_amount (B) | annual_return (C) | eoy_amount (D) |
+---+----------+----------------+-------------------+----------------+
| 1 |          |                |                   |                |
| 2 |          |                |                   |                |
| 3 |          |                |                   |                |
+---+----------+----------------+-------------------+----------------+

The letters A, B, C, D,... in each column after the column name represents the column index, similar to Excel.

Excelify has a Polars-like API that lets you define the formula for all the cells in a given column. For example, we can define static integer value representing the number of years elapsed using el.lit():

df = df.with_columns(
   el.lit([i for i in range(3)]).alias("year"),
)

However, unlike DataFrame, you can define a formula that'll be evaluated lazily, just like Excel spreadsheets.

For example, suppose you'd like to define annual return to be 10% every year. You can either use above el.lit function, or you can define a static value on the first row cell and make subsequent rows refer to the previous row's value using el.map and el.col().prev(1):

def annual_return_formula(idx: int):
    if idx == 0:
        return 0.10
    else:
        return el.col("annual_return").prev(1)

df = df.with_columns(
    el.map(annual_return_formula).alias("annual_return")
)

This way, you can edit only the first row cell of annual_return to change the annual return value for all the years.

Similarly, you can define the amount of money in the beginning and end of the year as follows:

df = df.with_columns(
    el.map(
        # You can also use lambda expression to make it more concise.
        lambda idx: 100.0
        if idx == 0
        else el.col("eoy_amount").prev(1)
    ).alias("boy_amount"),
    (el.col("boy_amount") * (1.0 + el.col("annual_return"))).alias("eoy_amount"),
)

If you print df, you'll get the following:

>>> print(df)
shape: (3, 4)
+---+----------+----------------+-------------------+-------------------+
|   | year (A) | boy_amount (B) | annual_return (C) |  eoy_amount (D)   |
+---+----------+----------------+-------------------+-------------------+
| 1 |   0.00   |     100.00     |       0.10        | (B1 * (1.0 + C1)) |
| 2 |   1.00   |       D1       |        C1         | (B2 * (1.0 + C2)) |
| 3 |   2.00   |       D2       |        C2         | (B3 * (1.0 + C3)) |
+---+----------+----------------+-------------------+-------------------+

Unlike DataFrame, ExcelFrame stores the formula of the cell by default. To see numerical values, you can call df.evaluate() - it'll return a new ExcelFrame where each cell will store the computed value of the formula in df:

>>> print(df.evaluate())
shape: (3, 4)
+---+----------+----------------+-------------------+----------------+
|   | year (A) | boy_amount (B) | annual_return (C) | eoy_amount (D) |
+---+----------+----------------+-------------------+----------------+
| 1 |   0.00   |     100.00     |       0.10        |     110.00     |
| 2 |   1.00   |     110.00     |       0.10        |     121.00     |
| 3 |   2.00   |     121.00     |       0.10        |     133.10     |
+---+----------+----------------+-------------------+----------------+

To export the ExcelFrame to excel, simply call df.to_excel().

Excelify-Viewer

To run excelify-viewer locally, you can run

excelify-viewer --file-path $FILE_NAME

where FILE_NAME points to the python script that constructs the table. The script must end with excelify.display. See files in examples/ directory to see sample scripts.

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

excelify_lib-0.1.0.tar.gz (22.4 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

excelify_lib-0.1.0-py3-none-any.whl (137.9 kB view details)

Uploaded Python 3

File details

Details for the file excelify_lib-0.1.0.tar.gz.

File metadata

  • Download URL: excelify_lib-0.1.0.tar.gz
  • Upload date:
  • Size: 22.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.11

File hashes

Hashes for excelify_lib-0.1.0.tar.gz
Algorithm Hash digest
SHA256 0a66ba9706f804a0c9bacaf72ed0767ddeb02e62977d4041c6963f814c825674
MD5 610b945ba1cd5938f841f30ad24274ac
BLAKE2b-256 166a65f12bc8a43259c4cae673027b8e4fc2b5628b3a136f77bf7694c03ec3fd

See more details on using hashes here.

File details

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

File metadata

  • Download URL: excelify_lib-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 137.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.11

File hashes

Hashes for excelify_lib-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 faf9aa1047be918334e12acefa98d9ce6b348cd8736a95be20b67f60784de009
MD5 dca8e5a6769cf817723c3d0bd023b9d1
BLAKE2b-256 ee6d5a5a3492a3ec7fb49ce1aa91018a95916eeaaf8176cad6c64f51a3e7bd2c

See more details on using hashes here.

Supported by

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