Bank Statement Transactions dataset
Personal bank statements with salary, rent, bills and UPI spends, plus a running balance.
About this dataset
Transactions from fictional savings accounts, laid out like a downloaded bank statement: date, description, category, mode (UPI, NEFT, card...), debit, credit and the running balance. Big downloads contain several accounts one after another, each with a different salary and rent.
There are no account numbers, card numbers or real merchant names, only generic descriptions such as 'UPI/Grocery store'. That makes it a safe file for learning personal-budget analysis, running totals and monthly summaries.
Good for practising: Budget analysis, Categorisation, Running totals, Excel.
What's built into the data
The rows are random, but they follow rules, so there is something real to find. These are the patterns to look for:
- Salary arrives on the 1st of every month and goes up each April.
- Rent goes out on the 5th, an investment SIP (if the account has one) on the 7th, electricity on the 10th, and the mobile recharge on the 15th.
- Electricity bills are higher from April to June.
- Interest is credited at the end of each quarter.
- A spend that would take the balance below zero is skipped, so the balance never goes negative.
Columns
| Column | Type | Description |
|---|---|---|
account | Category | Fictional account label (ACC-01, ACC-02...). |
txn_id | ID (text) | Transaction reference. |
txn_date | Date | Transaction date. |
description | Text | Generic narration, as on a statement. |
category | Category | Spending or income category. |
mode | Category | UPI, NEFT, IMPS, Card, ATM, Auto-debit or Interest. |
debit | Amount (₹) | Money out, in rupees (empty for credits). |
credit | Amount (₹) | Money in, in rupees (empty for debits). |
balance | Amount (₹) | Balance after this transaction. |
Preview: the first 8 rows
A sample with seed 2026. Your download will have different values but the same columns and patterns.
| account | txn_id | txn_date | description | category | mode | debit | credit | balance |
|---|---|---|---|---|---|---|---|---|
| ACC-01 | TXN01000001 | 2024-04-01 | Salary credit | Income | NEFT | 48000.0 | 101626.59 | |
| ACC-01 | TXN01000002 | 2024-04-01 | ATM withdrawal | Cash | ATM | 863.0 | 100763.59 | |
| ACC-01 | TXN01000003 | 2024-04-02 | UPI/Auto rickshaw | Transport | UPI | 111.0 | 100652.59 | |
| ACC-01 | TXN01000004 | 2024-04-03 | UPI/Grocery store | Groceries | UPI | 1740.0 | 98912.59 | |
| ACC-01 | TXN01000005 | 2024-04-03 | UPI/Auto rickshaw | Transport | UPI | 193.0 | 98719.59 | |
| ACC-01 | TXN01000006 | 2024-04-05 | Rent transfer | Rent | IMPS | 11500.0 | 87219.59 | |
| ACC-01 | TXN01000007 | 2024-04-05 | UPI/Tea stall | Food & drink | UPI | 21.0 | 87198.59 | |
| ACC-01 | TXN01000008 | 2024-04-05 | UPI/Food delivery | Food & drink | UPI | 685.0 | 86513.59 |
Practice exercises
- Recalculate the running balance from the debits and credits and confirm it matches the balance column.
- Summarise spending by category per month. What share of salary goes on rent?
- Find the month with the lowest closing balance for each account.
- Count UPI transactions under ₹100. How much do small payments add up to over a year?
- Build a monthly budget sheet in Excel: income, fixed costs, variable costs and savings, with a chart.
Stuck on one? Each exercise uses ideas from the lessons below, and trying it with the messy option on turns it into a cleaning exercise as well.
Load it straight into Python
You don't have to download first. Pandas can read the link directly, in Jupyter, Google Colab or a script. Keep the seed so you get the same data every time you run the notebook:
import pandas as pd
url = "https://beeprotonai.info/resources/datasets/bank-statement/download/?rows=1000&seed=42"
df = pd.read_csv(url, parse_dates=["txn_date"])
df.head()
For SQL practice, download the SQL format and run it against an empty database, for example sqlite3 practice.db < bank-statement-1000-rows-seed42.sql or mysql -u root -p practice < bank-statement-1000-rows-seed42.sql (use your file's name). It creates a table called bank_statement and fills it.
About the data
Everything in this file is invented. Names are random pairings of common first names and surnames, email addresses use example.com (reserved for examples, so it can never reach anyone), and phone numbers start with +91 00, which no real Indian mobile number does. Any resemblance to a real person or business is coincidence. Dates run from 1 April 2024 to 31 March 2026 unless a column says otherwise. Use it freely for learning, teaching and projects, including commercial ones, with no attribution required (CC0).
Lessons that go with it
More datasets
Two years of orders from a fictional chain of Indian sweet shops, with Diwali …
Employee & Attrition RecordsAn HR file of employees with salary, satisfaction, overtime and whether they left: built …
Student Exam ResultsMarks in five subjects with attendance and study hours, plus totals, percentage, result and …
Customer List (CRM)Customer records with contact details, segment, orders and spend: ideal for cleaning, deduplication and …
Stock Register (Inventory)Monthly stock register for five warehouses: opening, received, issued, closing, reorder level and value.
Website Traffic (Analytics)Daily sessions, users, bounce rate and conversions by page, traffic source and device.