I don't know about your bank transactions, but at least in my case the descriptions are highly irregular and basically need a hardcode for each and every damn pos location across each of the store location across each vendor.
I attempted that (with a Python script), gave up, and built myself a receipt tracker (photo + gemini based ocr) instead, which was way easier and is more reliable, even though - oh the horror! - it's using AI.
There's a new feeling that I experience when using LLMs to do work. It's that every run, every commit has a financial cost (tokens). Claude code can write a nice commit message for me but it will cost me money. Alternatively, I can try to understand and write the message myself.
Perhaps the middle ground is to have the LLM write the classifier and then just use that on the exported bank statements.
That’s what I mostly do, I give it some examples ask to write code to handle stuff.
I don’t just dump data into LLM and ask for results, mostly because I don’t want to share all the data and I make up examples. But it also is much cheaper as once I have code to process data I don’t have to pay for processing besides what it costs to run that code on my machine.
I think that's what GnuCash does by default. Even with years of past transaction data it still gets some very obvious matches wrong for me. In my experience it's about 90% accurate for the ones it really should be able to do based on the training data.
What's the pathway for the remaining 10%? Are they simply misclassified, and dropped into a queue for manual labeling? Do the outliers get managed by the GnuCash? Or do they get dumped into a misc 9000 account?
There was a time when I'd read this comment and then go looking for a tutorial on building a basic "Bayesian classifier". Invariably, I'd find several, which I'd line up like soldiers in tabs, and go through them until I find one that explained the what, why and how of it that spoke to my use (or near enough).
Of course, now ChatAI does all that for you in several Chat sessions. One does wonder though, if Chat is trained on text, and that was the history of what text was available, 10 years from now after everyone stopped writing 10 Blog posts about the same "Bayesian classifier", where's the ChatAI fodder coming from? I don't even know if this would be an outcome of fewer Blog posts [1]. It just strikes me as interesting because that would be _a very slow process_.
[1]: Not that this is necessarily true. People write blogs for all sorts of reasons, and having knockout quality competition from ChatAI does not KO all of them.
Sure, maybe, if I label enough data? At the number and variety of transactions I do, it wouldn't be be much better than hardcoding.
> It's that every run, every commit has a financial cost (tokens).
Ballpark figure for total cost for the Gemini OCRs for now (for me and a few hundred other people who have downloaded the app), for the past 6 or so months, is a few minutes of my hourly rate.
Absolutely not worth the manual grind for me.
Why don't you accept it as, dude is experimenting and learning new tool, how cool is that, if this is possible, what else can I build with these tools?
* simonw - Simon Willison, he could just continue building datasette or help Django, but he started exploring LLMs
* Armin Ronacher
* Steve Yegge
and many more
"leadership" or real leaders, want people to experiment a lot, so some of them will come up with novel ideas and either decide to build it on their own and get rich or build internally and make company rich.
Not always, but in many cases when someone becomes rich with innovation, it is probably because there was a benefit to a society (excluding gambling, porn, social media addictions)
All they do is buy out companies and make a already finished product theirs.
I think the smarter play is having an agent take the first crack at it, and build up a high confidence regex rule set. And then from there handle things that don't match and do periodic spot checks to maintain the rule set.
Curious, what's the inputs for an agent when handling your dataset? What can you feed the agent so it can later "learn" from your _manual labeling_?
I think it’s clear that he’s just doing this tool for fun and chose to share it. People shouldn’t mix up their anti-Microsoft autoeroticism and a person that happens to work for them.
I had a coding agent write this for me last week. :D
It takes an excel export of my transactions that I have to download obviously since no bank is giving out API access to their customers. It uses some python pandas and excel stuff and streamlit to classify the transactions and "tally" results and show on the screen as color coded tabular data. (Streamlit seems really nice but super super limited in what it can do.) It also creates an excel file (with same color coding) so I can actually open it up and check if necessary. This excel file has dropdowns to reclassify rows. The final excel file also has formulas in place to update live. Code can also compare its own programmatic calculations with the result from formulas from excel. Why not? My little coding sweatshop never complains. (All with free models and clis by the way. I haven't had a reason to try Claude yet.)
I think Citi bank has an API (https://developer.citi.com/). Not that it's public for account holders, but third-parties can build on that. I'm looking at Plaid.com
One thing about Plaid--I've not been happy when encountering Plaid in the wild. For example, when a vendor directs me to use Plaid to validate a new bank account integration. I'd much rather wait a few days and use the 0.01 deposit route. Like using a katana for shaving.
But signing up to use Plaid for bank transaction ingestion via API is a whole different matter.
Regex works well if you have a very limited set of sender and recipient accounts that don't change often
Bayesian or DNN classifiers work well when you have labeled data.
LLMs work well when you have a lot of data from lots of accounts.
You can even combine these approaches for higher accuracy
Just like manually editing Sieve/Gmail filters: I want full determinism, but managing all of that determinism can be annoying…
This is a hard, for all intents and purposes non deterministic problem.
Now if you’ll excuse me I have to draft another post admonishing the use of
curl | sh