Data solutions

Making operational data useful to products.

My work connects data cleaning and standardization with SQL transformations, APIs and dashboards—so teams can use consistent information in their products and decisions.

Understand

Trace source data and business rules before deciding how a product or report should use them.

Transform

Clean and standardize source records with Python and SQL, keeping transformation rules clear.

Deliver

Serve analysis-ready datasets for dashboards, reporting, and product features.

Tools & delivery methods

Core

SQLPythonTypeScript

Data work

CleaningStandardizationTransformation

Delivery

REST APIsDashboardsPostgreSQL

Deployment

DockerLinux / VMGit

Project Bersama

Standardization built for analytics

I contributed to product-data cleaning, standardization, SQL transformations, and API/dashboard delivery with the joint Delman–Bersama team.

1.7M+

source product records in the pipeline

6.4M+

analytics output rows

Up to 50%

forecasting accuracy improvement in project work

Transforming with SQL

Deduplicating raw orders and aggregating daily revenue per customer using window functions.

daily_revenue.sql
-- Daily revenue per customer, deduplicated and cleaned
WITH ranked_orders AS (
  SELECT
    customer_id,
    order_id,
    order_date::date           AS order_day,
    amount,
    ROW_NUMBER() OVER (
      PARTITION BY order_id
      ORDER BY updated_at DESC
    ) AS rn                       -- keep the latest version of each order
  FROM raw.orders
  WHERE status = 'paid'
    AND amount > 0
)
SELECT
  customer_id,
  order_day,
  COUNT(*)            AS orders,
  SUM(amount)         AS revenue,
  ROUND(AVG(amount),2) AS avg_order_value
FROM ranked_orders
WHERE rn = 1            -- drop duplicate order rows
GROUP BY customer_id, order_day
ORDER BY order_day DESC, revenue DESC;

ETL with Python

A small, readable extract → transform → load job with cleaning, deduplication, and feature derivation.

transform_orders.py
import pandas as pd
from sqlalchemy import create_engine

def transform_orders(raw_path: str) -> pd.DataFrame:
    """Extract raw orders, clean them, return analysis-ready rows."""
    df = pd.read_csv(raw_path)

    # 1. Standardize & clean
    df.columns = [c.strip().lower() for c in df.columns]
    df["order_date"] = pd.to_datetime(df["order_date"], errors="coerce")
    df = df.dropna(subset=["order_id", "customer_id", "order_date"])

    # 2. Keep only valid, paid orders and drop duplicates
    df = df[(df["status"] == "paid") & (df["amount"] > 0)]
    df = df.sort_values("updated_at").drop_duplicates("order_id", keep="last")

    # 3. Derive features
    df["order_day"] = df["order_date"].dt.date
    df["revenue"] = df["amount"].round(2)
    return df[["customer_id", "order_day", "order_id", "revenue"]]

def load(df: pd.DataFrame, table: str, dsn: str) -> int:
    engine = create_engine(dsn)
    df.to_sql(table, engine, schema="marts", if_exists="replace", index=False)
    return len(df)

if __name__ == "__main__":
    clean = transform_orders("data/raw/orders.csv")
    rows = load(clean, "fct_orders", "postgresql://localhost/warehouse")
    print(f"Loaded {rows} clean rows into marts.fct_orders")

Example Data Workflow

An illustrative path from source data to analytics-ready outputs, with validation checks along the way. It is not a client-specific architecture.

Example transformation

An illustrative before-and-after of inconsistent source values; no client data is shown.

Raw — messy
customerdateamount
Andi 12/03/26"150.000"
andi2026-03-12150000
Budinull-5
Clean — modeled
customer_idorder_dayrevenue
andi2026-03-12150000
budi—invalid

Duplicates merged, dates normalized, invalid rows dropped.

Need a technical partner for data delivery?

I work across product requirements, data workflows and implementation. Let’s connect about your project.