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/


Funcionalidades principais:


Código completo:

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.")