Skip to content

GarfReport

Iteration and slicing

ApiReportFetcher.fetch method returns an instance of GarfReport object which you can use to perform simple iteration.

query_text = "SELECT campaign.id AS campaign_id, clicks FROM campaign"
campaigns = report_fetcher.fetch(query_text)

# iterate over each row of `campaigns` report
for row in campaigns:
  # Get element as an attribute
  print(row.campaign_id)

  # Get element as a slice
  print(row["campaign_id"])

  # Get element as an index
  print(row[0])

  # Create new column
  row["new_campaign_id"] = row["campaign_id"] + 1

You can easily slice the report

# Create new reports by selecting one or more columns
campaign_only_report = campaigns["campaign_id"]
campaign_name_clicks_report = campaigns[["campaign_id", "clicks"]]

# Get subset of the report
# Get first row only
first_campaign_row = campaigns[0]
# Get first ten rows from the report
first_10_rows_from_campaigns = campaigns[0:10]

Convert report

GarfReport can be easily converted to common data structures:

# convert `campaigns` to list of lists
campaigns_list = campaigns.to_list()

# convert `campaigns` to flatten list
campaigns_list = campaigns.to_list(row_type="scalar")

# convert `campaigns` column campaign_id to list
campaigns_list = campaigns["campaign_id"].to_list()

# convert `campaigns` column campaign_id to list with unique values
campaigns_list = campaigns["campaign_id"].to_list(distinct=True)

# convert `campaigns` to list of dictionaries
# each dictionary maps report column to its value, i.e.
# {"campaign_name": "test_campaign", "campaign_id": 1, "clicks": 10}
campaigns_list = campaigns.to_list(row_type="dict")

# convert `campaigns` to pandas DataFrame
campaigns_df = campaigns.to_pandas()

# convert `campaigns` to polars DataFrame
campaigns_df = campaigns.to_polars()

# convert `campaigns` to dictionary
# map campaign_id to campaign_name one-to-one
campaigns_dict = campaigns.to_dict(
  key_column="campaign_id",
  value_column="clicks",
  value_column_output="scalar",
)

# convert `campaigns` to dictionary
# map campaign_id to campaign_name one-to-many
campaigns_dict = campaigns.to_dict(
  key_column="campaign_id",
  value_column="clicks",
  value_column_output="list",
)

Build report

GarfReport can be easily built from pandas or polars data frame:

import pandas as pd
import polars as pl

# Pandas
df = pd.DataFrame(data=[[1]], columns=["one"])
report = GarfReport.from_pandas(df)

# Polars
df = pl.DataFrame(data=[[1]], schema=["one"], orient='row')
report = GarfReport.from_polars(df)

Save report

GarfReport can be easily saved to local or remote storage:

from garf_io import writer

# initialize CSV writer
csv_writer = writer.create_writer('csv', destination_folder="/tmp")

# save report using one of the writers
csv_writer.write(campaigns, destination="my_file_name")