Banking Dataset for Power BI
This ready-made banking dataset is perfect for analysts looking to practice Power BI dashboard creation. Analyze financial data with a sample of 1,000 customers, 5,000 accounts, and 50,148 transactions.
At a glance
- 3tables
- 56,148rows
- 14columns
- Jan 2022 – Dec 2024date range
The 3 tables
preview and data dictionary per tableCustomers customers · dimension table · 1,000 rows
Contains information about individual bank customers.
Preview
| customer_iduuid | first_namestring | last_namestring | citystring | countrystring |
|---|---|---|---|---|
| 7944174a-8c4f-4ed6-bf73-3f800f494eb2 | Eleanor | Armstrong | Montreal | Canada |
| 8884672d-73bf-4002-a007-e15ec1676109 | Arthur | Newton | Montreal | Canada |
| decb4112-1abe-4d22-a77a-e05953bacd93 | Walter | Adams | Toronto | Canada |
| 9d948eb4-7c45-478e-bec4-1c044d1b5304 | Arthur | Nelson | Montreal | Canada |
| e8f6192a-36fc-49de-90e6-5dfe3f2463ea | George | Armstrong | Vancouver | Canada |
| 1c1b6d81-a3b5-4167-a9f3-7e1da1a4102b | Agnes | Newton | Vancouver | Canada |
| cf88e080-1591-4d00-9e2c-da279eb58708 | Harold | Adams | Vancouver | Canada |
| e7055632-83b1-4323-8f0c-9efbc0a782ab | Arthur | Nelson | Montreal | Canada |
| e71219d5-06b8-4f83-b269-4dc8988a1f90 | Clarence | Armstrong | Montreal | Canada |
| 212c3e10-1eda-4cd9-ba08-f90fcd5d8288 | Arthur | Newton | Montreal | Canada |
Data dictionary
| column | type | description | example | null % |
|---|---|---|---|---|
customer_ | uuid | Unique identifier for each bank customer.unique | 7944174a-8c4f-4ed6-bf73-3f800f494eb2 | 0% |
first_ | string | Customer legal first name. | Eleanor | 0% |
last_ | string | Customer legal last name or surname. | Armstrong | 0% |
city | string | Residential city of the customer. | Montreal | 0% |
country | string | Country of residence where banking activity is registered. | Canada | 0% |
Accounts accounts · table · 5,000 rows
Details of bank accounts held by customers.
Preview
| account_iduuid | account_typestring | balancedecimal | customer_iduuid |
|---|---|---|---|
| 462e5b11-b7d9-4881-b680-6b2b7c1808b3 | Checking | 3433.54 | c2eb7675-69d4-4153-a544-c2ecaccb74ac |
| 93a34d7a-33a9-4d50-a8dc-ed54cbc420e9 | Checking | 2472.43 | 200379e1-8489-4179-88e1-4cf719f5469c |
| ff7604d6-81eb-49c5-800b-ba1fc09bf5eb | Checking | 9878.73 | c6e263ee-53a2-4393-9b52-4136812b412f |
| 2a8a0302-ad29-4bb7-87e0-849e071d20c7 | Checking | 22389.06 | 9c34e406-cd24-4e88-b7db-a41f4a865761 |
| 2edab8d5-ab73-415f-a649-a407d6bff411 | Checking | 4904.03 | 4750250c-5fdc-4b36-a646-1d82de874706 |
| 2d75044a-cce9-4652-83d7-0ae893219871 | Checking | 2468.94 | 4037ae3d-ab27-4052-8377-de16aeca691a |
| fb88c69c-917f-4817-ac19-08932d2134d0 | Checking | 11074.77 | e76b2873-86d2-488e-a50c-9b3810f71e8d |
| 0f5fe50a-28b3-4d5c-9846-5c25665f5261 | Checking | 807.3 | 3bbe022f-9d5b-40ef-8d3a-2d94ec522127 |
| 4be95946-fa3f-4987-90cd-2a18ed98bb2c | Checking | 24408.3 | 9477015b-c015-482d-86b8-bb08c55a4ba1 |
| bca370dc-83cf-49c3-a00d-f176fe1a1521 | Checking | 12067.55 | 969a2364-ee37-4421-a44c-23f4f6bf53f0 |
Data dictionary
| column | type | description | example | null % |
|---|---|---|---|---|
account_ | uuid | Unique identifier for the bank account.unique | 462e5b11-b7d9-4881-b680-6b2b7c1808b3 | 0% |
account_ | string | Category of account: Checking, Savings, Credit Card, or Loan. | Checking | 0% |
balance | decimal | Current balance of the account in standard currency units. | 3433.54 | 0% |
customer_ | uuid | Foreign key to customers.customer_id. | c2eb7675-69d4-4153-a544-c2ecaccb74ac | 0% |
Transactions transactions · fact table · 50,148 rows
Records of all financial transactions.
Preview
| transaction_iduuid | transaction_datedate | typestring | amountdecimal | account_iduuid |
|---|---|---|---|---|
| 3369b485-2340-44f7-98d4-47285ec832cc | 2024-12-11 | Withdrawal | -211.69 | 2d75044a-cce9-4652-83d7-0ae893219871 |
Data dictionary
| column | type | description | example | null % |
|---|---|---|---|---|
transaction_ | uuid | Unique identifier for each transaction record. | b5a61514-48a7-4a8e-8d08-331325ac7e7c | 0% |
transaction_ | date | The calendar date on which the transaction occurred. | 2024-09-22 | 0% |
type | string | The category or nature of the transaction (Deposit, Withdrawal, Payment, Transfer). | Withdrawal | 0% |
amount | decimal | The monetary value of the transaction. Positive for Deposits and negative for Withdrawals, Payments, and Transfers. | -114.32 | 0% |
account_ | uuid | Foreign key to accounts.account_id. | f6bdadc4-2a06-4455-b02e-4349de7f7f0f | 0% |
How the tables join
accounts.customer_id references customers.customer_idmany to one: each Accounts row points to one Customers rowtransactions.account_id references accounts.account_idmany to one: each Transactions row points to one Accounts row
Questions to answer with it
Visualize the distribution of account types by customer country.
Join accounts and customers tables, then group by country and account_type.
tables: accounts, customers
Create a dashboard showing monthly transaction volume and average transaction amount for each account type.
Join accounts and transactions tables, extract month from transaction_date, and group by account_type and month. Calculate count and average of amount.
tables: accounts, transactions
Identify the top 5 customers by total transaction value.
Join all three tables, sum the amount for each customer, and order by the sum in descending order.
tables: accounts, customers, transactions
Write a SQL query to find the total balance for each customer, including their first name and last name.
Join accounts and customers tables, group by customer_id, first_name, and last_name, and sum the balance.
tables: accounts, customers
Starter SQL
run against this data before publishingTable names match the SQLite file and the SQL script.
Total Balance per Customer
SELECT c.first_name, c.last_name, SUM(a.balance) AS total_balance
FROM customers c
JOIN accounts a ON c.customer_id = a.customer_id
GROUP BY c.customer_id, c.first_name, c.last_name
ORDER BY total_balance DESC
LIMIT 20;Monthly Transaction Volume by Account Type
SELECT strftime('%Y-%m', t.transaction_date) AS transaction_month, a.account_type, COUNT(t.transaction_id) AS transaction_count
FROM transactions t
JOIN accounts a ON t.account_id = a.account_id
GROUP BY transaction_month, a.account_type
ORDER BY transaction_month, a.account_type
LIMIT 20;Top 5 Customers by Total Transaction Amount
SELECT c.first_name, c.last_name, SUM(t.amount) AS total_transaction_amount
FROM customers c
JOIN accounts a ON c.customer_id = a.customer_id
JOIN transactions t ON a.account_id = t.account_id
GROUP BY c.customer_id, c.first_name, c.last_name
ORDER BY total_transaction_amount DESC
LIMIT 5;Customer Distribution by Country
SELECT country, COUNT(customer_id) AS customer_count
FROM customers
GROUP BY country
ORDER BY customer_count DESC
LIMIT 20;Load it with pandas
import pandas as pd
# Unzip the CSV download first: one file per table
customers = pd.read_csv("customers.csv")
accounts = pd.read_csv("accounts.csv")
transactions = pd.read_csv("transactions.csv")
# Join accounts to customers
df = accounts.merge(customers, left_on="customer_id", right_on="customer_id", how="left", suffixes=("", "_customers"))
print(df.groupby("city").size().sort_values(ascending=False))Using it in your tool
- Power BI
- Create relationships between customers and accounts (one-to-many on customer_id), and between accounts and transactions (one-to-many on account_id). Suggested DAX measures: Total Balance = SUM(accounts[balance]), Total Transactions = COUNT(transactions[transaction_id]).
Formats available
- CSV (zip)One CSV file per table, zipped
- Excel workbookOne worksheet per table
- SQLite databaseA ready-to-query database file with every table
- Parquet (zip)One Parquet file per table, zipped
- SQL scriptCREATE TABLE with primary and foreign keys, then INSERTs
- CSVA single CSV file
- JSONA single JSON file
How this data was generated
Synthetic data. Every row was generated: no real people, customers or companies are in this dataset.
Synthetic data generated by GoMask DataFactory from a relational blueprint: keys, links and rules are enforced in code, text columns are filled by a language model. No real people, companies or transactions.
- Data generated using GoMask DataFactory.
- Synthetic data mimics banking operations.
- Includes customers, accounts, and transactions.
- Checked by an automated quality gate: unique keys, no orphan foreign keys, required columns filled, declared rules and date ranges (realism score 84).
Limitations
- The data is synthetic and does not represent real individuals or events.
- Transaction amounts are simplified and may not reflect all real-world complexities.
- Limited date range from 2022-01-01 to 2024-12-31.
- Distributions and correlations are modelled, not measured from real records.
blueprint · banking-dataset-for-power-bi
Scale this dataset
Same tables. As many rows as you need.
Open the blueprint behind these 3 tables in Data Factory: keep the relationships, change a column, and generate it at the size you need.
- 200,000 rows
- 1,000,000 rows
- Tables
- customers, accounts, transactions
- Licence
- yours to use, including commercially
- API slug
- banking-dataset-for-power-bi