Blueprints

Run a Python script and generate outputs, metrics and downloadable file artifact specified with a variable

Source

yaml
id: python-generate-outputs
namespace: company.team
variables:
  file: orders.csv
tasks:
  - id: analyze_orders
    type: io.kestra.plugin.scripts.python.Script
    warningOnStdErr: false
    beforeCommands:
      - pip install faker kestra > /dev/null
    outputFiles:
      - "*.csv"
    script: >
      import csv

      import random

      import time

      from faker import Faker

      from kestra import Kestra


      start_time = time.time()

      fake = Faker()


      # list of columns for the CSV file

      columns = [
          "order_id",
          "customer_name",
          "customer_email",
          "product_id",
          "price",
          "quantity",
          "total",
      ]

      filename = "{{ vars.file }}"

      tags = {'file': filename}


      # Generate 100 random orders

      orders = []

      for i in range(100):
          order_id = i + 1
          customer_name = fake.name()
          customer_email = fake.email()
          product_id = random.randint(1, 20)
          price = round(random.uniform(10.0, 200.0), 2)
          quantity = random.randint(1, 10)
          total = round(price * quantity, 2)
          orders.append(
              [order_id, customer_name, customer_email, product_id, price, quantity, total]
          )

      # Write the orders to a CSV file

      with open(filename, "w", newline="") as file:
          writer = csv.writer(file)
          writer.writerow(columns)
          writer.writerows(orders)

      # Calculate and print the sum and average of the "total" column

      total_sum = sum(order[6] for order in orders)

      average_order = round(total_sum / len(orders), 2)

      print(f"Total sum: {total_sum}")

      print(f"Average Order value: {average_order}")


      Kestra.outputs({"total_sum": total_sum, "average_order": average_order})

      Kestra.counter('total_sum', total_sum, tags)

      Kestra.counter('average_order', average_order, tags)


      end_time = time.time()  

      processing_time = end_time - start_time

      Kestra.timer('processing_time', processing_time, tags)

      print(f"The script execution took: {processing_time} seconds")

About this blueprint

Metrics pip Python Software Engineering Outputs

This flow generates a CSV file with 100 random orders and then calculates the sum and average of the "total" column. It then reports the results as outputs and metrics.

The CSV file generated by a Python task is set as outputFiles, allowing you to download the file from the UI's Execution page. It is helpful to share the results of your workflow with business stakeholders who can download the file from the UI and use it in their processes.

To avoid hardcoding values, the filename orders.csv is specified as a variable.

Script

New to Kestra?

Use blueprints to kickstart your first workflows.

Get started with Kestra