-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 98d9fe7
Showing
9 changed files
with
716 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
.DS_Store | ||
__pycache__ | ||
.ipynb_checkpoints | ||
.venv | ||
.vscode | ||
Raiff*.json | ||
temp | ||
private |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
## RtxData - Анализ данных из Райфайзен Банка (Сербия) | ||
|
||
- Безопасный: Для выгрузки не нужен пароль, только небольшой скрипт в консоли браузера | ||
- Приватный: Данные остаются на устройстве | ||
- Удобный: Работает в браузере | ||
|
||
![Demo](./demo.png) | ||
|
||
### Скачиваем свои данные | ||
|
||
1) Логинимся в личном кабинете https://rol.raiffeisenbank.rs/Retail/Home/Login | ||
2) Открываем консоль разработчика, в Chrome/Yandex/Firefox это `F12` или `Cmd + Opt + I` | ||
3) Вставляем в консоль скрипт | ||
```javascript | ||
// Берем транзакции за 2023 год | ||
filter = '"filterParam":{"FromDate":"01.01.2023","ToDate":"01.01.2024"}' | ||
|
||
// URL фронтового API Райфа | ||
base = "https://rol.raiffeisenbank.rs/Retail/Protected/Services/DataService.svc/" | ||
// Получаем банковские счета | ||
accounts = await fetch(base + "GetAllAccountBalance", | ||
{ body: '{"gridName":"RetailAccountBalancePreviewFlat-L"}', | ||
method: "POST" }).then(res => res.json()); | ||
|
||
// Получаем транзакции | ||
transactions = {}; | ||
for (number of new Set(accounts.map(a => a[1]))) { | ||
// Скачиваем информацию о транзакции | ||
transactions[number] = await fetch(base + "GetTransactionalAccountTurnover", { | ||
body: '{"gridName":"RetailAccountTurnoverTransactionPreviewMasterDetail-S",' + | ||
'"productCoreID":"541","accountNumber":"' + number + '",' + filter + '}', | ||
method: "POST"}).then(res => res.json()); | ||
} | ||
|
||
// Сохраняем транзакции как файл | ||
element = document.createElement('a'); | ||
// Кодируем данные | ||
element.href = URL.createObjectURL(new Blob([JSON.stringify({ transactions })], | ||
{ type: "application/json" })); | ||
// Сохраняем в загрузки | ||
element.download = 'Raiff_2023_' + new Date().toISOString() + '.json'; | ||
element.click(); | ||
``` | ||
4) Ожидаем скачивания файла с транзакциями за 2023 год | ||
|
||
### Строим графики, круговые диаграммы и таблицы | ||
|
||
Способ не работает в Safari на Mac, тк в нем нет поддержки Web SQL | ||
|
||
1) Заходим https://rtxdata.github.io | ||
2) Открываем полученный `Raiff.json` и смотрим аналитику, данные обрабатываются на устройстве | ||
|
||
### Пишем кастомные SQL запросы | ||
|
||
1) Клонируем репозиторий `git clone [email protected]:rtxdata/rtxdata.github.io.git` | ||
2) Кладем полученный `Raiff.json` в папку с репозиторием | ||
3) `python3.9 -m venv .venv` | ||
4) `. ./.venv/bin/activate` | ||
5) `pip install -r requirements.txt` | ||
6) Запускаем `jupyter notebook` или открываем `RtxData.ipynb` в VSCode с расширением Jupyter Notebook | ||
7) Запускаем ячейки, запросы можно редактировать | ||
|
||
#### Какой график получится? | ||
|
||
- Круговая диаграмма будет построена если выбраны 2 колонки и вторая называется `total` | ||
- Линия по датам будет построена если выбраны 2 колонки и первая называется `date` | ||
- Таблица будет построена в остальных случаях | ||
|
||
### Добавляем графики и пополняем классификатор | ||
|
||
1) Запросы находятся в `dashboard.sql`, `init` выполняется перед всеми и нужен для вспомогательных таблиц | ||
2) Классификатор находится в `patterns.json` и работает как паттерн матчинг, поддерживается только 2 уровня вложенности | ||
3) Пожалуйста отправьте пулл реквест с новыми графиками и обновлениями классификатора | ||
|
||
#### Перестроение категорий | ||
|
||
- В случае Jupyter нужно перезагрузить kernel | ||
- В случае браузера очистить данные сайта в DevTools |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
{ | ||
"cells": [ | ||
{ | ||
"cell_type": "code", | ||
"execution_count": null, | ||
"metadata": { | ||
"scrolled": true | ||
}, | ||
"outputs": [], | ||
"source": [ | ||
"from utils import dashboard, get_queries, query\n", | ||
"\n", | ||
"# Строим дашборд по dashboard.sql, можно добавлять SQL запросы\n", | ||
"dashboard([\n", | ||
" # \"SELECT * FROM TX LIMIT 3\",\n", | ||
" 'По категориям',\n", | ||
" 'Интернет',\n", | ||
" # 'Траты',\n", | ||
" # 'Транзакций в день',\n", | ||
" # 'Динарных транзакций в день',\n", | ||
" 'Не динарных транзакций в день',\n", | ||
" # 'Макдак с Июня',\n", | ||
" 'Топ 5 трат',\n", | ||
" # 'Зарплата в евро',\n", | ||
" # 'Траты по валютам'\n", | ||
"])\n", | ||
"\n", | ||
"# Посмотреть названия из dashboard.sql\n", | ||
"names = get_queries().keys()\n", | ||
"\n", | ||
"# Получить датафрейм\n", | ||
"pandas_dataframe = query(\"SELECT * FROM TX LIMIT 3\")" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": null, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"from utils import dashboard\n", | ||
"dashboard([\"SELECT ref, ABS(rsum) FROM POS LIMIT 3\"])" | ||
] | ||
} | ||
], | ||
"metadata": { | ||
"kernelspec": { | ||
"display_name": "Python 3 (ipykernel)", | ||
"language": "python", | ||
"name": "python3" | ||
}, | ||
"language_info": { | ||
"codemirror_mode": { | ||
"name": "ipython", | ||
"version": 3 | ||
}, | ||
"file_extension": ".py", | ||
"mimetype": "text/x-python", | ||
"name": "python", | ||
"nbconvert_exporter": "python", | ||
"pygments_lexer": "ipython3", | ||
"version": "3.9.18" | ||
} | ||
}, | ||
"nbformat": 4, | ||
"nbformat_minor": 4 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
-- init | ||
DROP TABLE IF EXISTS POS; | ||
CREATE TEMPORARY TABLE IF NOT EXISTS POS AS SELECT id, SUM(sum) as sum, SUM(rsum) as rsum, curr, kat1, kat2, | ||
date, type, card, ref, ref2, acc FROM TX WHERE sum < 0 AND type = "POS" GROUP BY curr, date, type, card, ref, ref2, acc; | ||
|
||
-- По категориям | ||
SELECT kat1, SUM(ABS(rsum)) as total FROM POS GROUP BY kat1 ORDER BY total DESC LIMIT 10; | ||
|
||
-- Интернет | ||
SELECT kat2, SUM(ABS(rsum)) as total FROM POS WHERE kat1 = 'internet' GROUP BY kat2 ORDER BY total DESC LIMIT 10; | ||
|
||
-- Траты | ||
SELECT date, SUM(ABS(rsum)) FROM POS GROUP BY date ORDER BY date ASC; | ||
|
||
-- Транзакций в день | ||
SELECT date, count(*) FROM POS GROUP BY date ORDER BY date ASC; | ||
|
||
-- Динарных транзакций в день | ||
SELECT date, count(*) FROM POS WHERE curr = 'RSD' GROUP BY date ORDER BY date ASC; | ||
|
||
-- Не динарных транзакций в день | ||
SELECT date, count(*) FROM POS WHERE curr != 'RSD' GROUP BY date ORDER BY date ASC; | ||
|
||
-- Макдак с Июня | ||
SELECT sum(abs(rsum)) FROM POS WHERE kat2='McDonalds' AND date > '2023-06-01'; | ||
|
||
-- Топ 5 трат | ||
SELECT rsum, ref FROM POS ORDER BY rsum LIMIT 5; | ||
|
||
-- Зарплата в евро | ||
SELECT SUM(sum) / 117.3 FROM TX WHERE curr = 'RSD' AND type = 'Income'; | ||
|
||
-- Траты по валютам | ||
SELECT SUM(ABS(sum)), curr FROM POS GROUP BY curr; | ||
|
||
-- Эффективность конвертации | ||
|
||
-- Зарубежные комиссии |
Oops, something went wrong.