Как стать автором
Обновить

Манименеджмент для гика: откуда брать данные?

Время на прочтение3 мин
Количество просмотров9.9K

image


Если вы всерьёз решили заняться учётом личных финансов, то одной из первых трудностей для вас, вероятно, будет сбор данных. В комментариях к предыдущей статье, где я неудачно пытался обосновать саму необходимость манименеджмента, отметились люди с высочайшим уровнем самодисциплины, для которых этот вопрос — не вопрос. Они дисциплинированно день за днём записывают свои траты в мобильный телефон на протяжении многих лет. Лично я за себя могу сказать, что мне никогда это не удавалось, и если быть честным с самим собой, вероятно, никогда не начнёт удаваться в будущем. Поэтому, этот путь явно не для меня. Но я нашёл решение!


К моему счастью, мой телефон и так регистрирует все мои траты без моего участия. На каждую операцию по моей карте мне прилетает SMS-уведомление от банка, в котором содежится большая часть необходимой информации:


  • Сумма платежа
  • Код терминала продавца
  • Время совершения платежа
  • Остаток на балансе
  • Идентификатор карты списания

Таким образом, для получения первичных данных для анализа нам потребуется выгрузить SMS сообщения. Я гик и поэтому у меня рутованный телефон на Android. В моём случае эта задача тривиальна:


$ adb shell "su -c 'cp /data/data/com.android.providers.telephony/databases/mmssms.db /mnt/sdcard'"
$ adb pull /mnt/sdcard/mmssms.db > /dev/null
$ adb shell "rm /mnt/sdcard/mmssms.db"

(adb [android debug bridge] программа, входящая в пакет Android SDK. Есть реализации как под Windows, так и под Linux/Mac. Для доступа к базе данных mmssms.db нужны привелегии root. Если кто-нибудь знает, как можно получить этот файл без root, напишите, пожалуйста в комментариях)


В результате работы скрипта мы иммем обычную базу данных SQLite3. Работать с ней можно при помощи пакета sqlite, реализации которого так же есть в Linux, Windows и Mac. В этой базе нас интересует таблица SMS, которая содержит колонки address и body.


$ sqlite3 mmssms.db 
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help" for usage hints.
sqlite> PRAGMA table_info(sms);
0|_id|INTEGER|0||1
1|thread_id|INTEGER|0||0
2|address|TEXT|0||0
3|m_size|INTEGER|0||0
4|person|INTEGER|0||0
5|date|INTEGER|0||0
6|date_sent|INTEGER|0|0|0
7|protocol|INTEGER|0||0
8|read|INTEGER|0|0|0
9|status|INTEGER|0|-1|0
10|type|INTEGER|0||0
11|reply_path_present|INTEGER|0||0
12|subject|TEXT|0||0
13|body|TEXT|0||0
14|service_center|TEXT|0||0
15|locked|INTEGER|0|0|0
16|sim_id|INTEGER|0|-1|0
17|error_code|INTEGER|0|0|0
18|seen|INTEGER|0|0|0
19|ipmsg_id|INTEGER|0|0|0

При помощи обычного sql-запроса мы можем выбрать SMS-сообщения отправленные Сбербанком:


 $ echo "select trim(body, X'0A') from sms where address = '900' order by date asc" | sqlite3 mmssms.db

Здесь 900 — это номер с которого Сбербанк рассылает уведомления. Функция trim убирает перенос каретки в конце сообщения, который зачем-то ставят некоторые банки. Вот пример вывода:


VISA2222 01.01.18 08:43 покупка 1245р GAZPROMNEFT Баланс: 1985.29р
VISA2222 01.01.18 12:05 покупка 176.50р YARCHE Баланс: 1808.79р
VISA2222 01.01.18 12:16 покупка 504р FRUKTY Баланс: 1304.79р
VISA2222 01.01.18 15:09 покупка 441р KFC Баланс: 863.79р
ECMC1111 01.01.18 17:52 покупка 15.09EUR HOSTING COMPANY Баланс: 66679.05р
ECMC1111 02.01.18 19:41 покупка 104р MCDONALDS Баланс: 66583.47р
ECMC1111 03.01.18 08:49 покупка 205.10р MARIYA-RA Баланс: 66378.37р
ECMC1111 03.01.18 09:16 покупка 810р FIT SERVICE Баланс: 65568.37р
VISA2222 03.01.18 09:17 покупка 220р EKSKLYUZIV Баланс: 643.79р
ECMC1111 03.01.18 09:18 покупка 4200р FIT SERVICE Баланс: 61368.37р

Я и супруга пользуемся разными картами. По идентификатору карты можно дифференцировать плательщика. По коду терминала можно выяснить, на что именно были потрачены деньги и потраченную сумму. В принципе, этого вполне достаточно для того, чтобы получить какую-то статистическую картину.


Обработка данных


Начиная с этой точки, дальше каждый может пойти своим путём. Кто-то может написать скрипт на Python для парсинга и анализа. Кто-то может при помощи AWK перегнать данные в CSV и анализировать в Excel. Я для анализа использую ledger cli. На тему ledger на Хабре есть только одна статья "Финансовый учёт в текстовой консоли" за авторством estet. Если вам не терпится начать, рекомендую ознакомиться с этой статьёй.


В следующей статье я расскажу как я перегоняю данные из SMS-сообщений в текстовый формат Ledger, а также, как у меня организован этот файл.

Теги:
Хабы:
Всего голосов 13: ↑13 и ↓0+13
Комментарии31

Публикации