Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
enovikov11 committed Sep 23, 2023
0 parents commit 98d9fe7
Show file tree
Hide file tree
Showing 9 changed files with 716 additions and 0 deletions.
8 changes: 8 additions & 0 deletions .gitignore
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
78 changes: 78 additions & 0 deletions README.md
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
67 changes: 67 additions & 0 deletions RtxData.ipynb
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
}
38 changes: 38 additions & 0 deletions dashboard.sql
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;

-- Эффективность конвертации

-- Зарубежные комиссии
Binary file added demo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit 98d9fe7

Please sign in to comment.