Descrição:
Esta aplicação web simples, feita com Streamlit, permite que o usuário envie um extrato bancário em formato Excel e um arquivo Excel contendo regras de categorização. O sistema lê ambos os arquivos e, usando as regras baseadas em palavras-chave no campo "memo" das transações, atribui automaticamente os valores de "Vendor" (fornecedor) e "Account" (conta) a cada linha do extrato.
O usuário pode visualizar as primeiras linhas do extrato categorizado e fazer download do arquivo Excel já categorizado.
Você pode acessar e testar a aplicação online neste link:
👉 https://bank-statement-categorizer.streamlit.app/
python
CopyEdit
import streamlit as st
import pandas as pd
import io
st.set_page_config(page_title="Bank Statement Categorizer", layout="centered")
st.title("📂 Bank Statement Categorizer")
st.write("Upload your bank statement and rules file to automatically categorize transactions.")
# Upload dos arquivos
statement_file = st.file_uploader("Upload the **Bank Statement** (.xlsx)", type=["xlsx"])
rules_file = st.file_uploader("Upload the **Rules File** (.xlsx)", type=["xlsx"])
if statement_file and rules_file:
try:
# Carregar arquivos em DataFrames
statement_df = pd.read_excel(statement_file)
rules_df = pd.read_excel(rules_file)
# Função para aplicar regra baseada no memo
def apply_rule(memo, return_column):
for _, rule in rules_df.iterrows():
keyword = str(rule["Keyword"]).lower()
if pd.notna(keyword) and keyword in str(memo).lower():
return rule[return_column]
return "NO RULE"
# Aplicar regras para colunas Vendor e Account
statement_df["Vendor"] = statement_df["memo"].apply(lambda x: apply_rule(x, "Vendor"))
statement_df["Account"] = statement_df["memo"].apply(lambda x: apply_rule(x, "Account"))
# Exibir prévia dos dados categorizados
st.success("✅ Categorization completed!")
st.dataframe(statement_df.head())
# Preparar arquivo para download
output = io.BytesIO()
statement_df.to_excel(output, index=False, engine='openpyxl')
output.seek(0)
st.download_button(
label="📥 Download Categorized Excel File",
data=output,
file_name="categorized_statement.xlsx",
mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
)
except Exception as e:
st.error(f"⚠️ An error occurred: {e}")
else:
st.info("Please upload both files to proceed.")