git / code.ach.gov.ru / gavrin / jupyter_snippet

commit 8cf6323b079d8a3e0487b03eb8ee77a15bbe63fb

author Дмитрий Сергеевич Гаврин <gavrin_ds@ach.gov.ru>

date 2020-03-29 23:27:55 +0300

parents f22db172

browse tree at this commit

message

класс для объединения множества excel файлов в один набор данных

files

fileadddel
ExcelPreporcessor.ipynb+1573-0

patch

diff --git a/ExcelPreporcessor.ipynb b/ExcelPreporcessor.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..9c56945158686c16b8a2cc8f7155010741618261
--- /dev/null
+++ b/ExcelPreporcessor.ipynb
@@ -0,0 +1,1573 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Класс для объединения множества однотипных файлов excel в один набор данных\n",
+    "----------\n",
+    "\n",
+    "Постановка задачи (что наш класс должен уметь):\n",
+    "  - собирать файлы:\n",
+    "    - из файловой системы по маске;\n",
+    "    - с веб-сервера (может быть даже с предварительной авторизацией);\n",
+    "    - скачивать и доставать книги из архивов, в т.ч. если в архиве много однотипных файлов;\n",
+    "  - объединять таблицы с данными:\n",
+    "    - из определённых листов загружаемых книг (например первый лист каждой книги)\n",
+    "    - перебирая все рабочие листы всех загружаемых книг\n",
+    "  - добавлять в итоговый набор произвольное количество колонок, идентифицирующих источник:\n",
+    "    - название файла;\n",
+    "    - название рабочего листа;\n",
+    "    - произвольные ячейки каждого рабочего листа, например заголовок или подпись ответственного лица, даты и т.д.\n",
+    "  - выводить получаемый набор в выбранном формате:\n",
+    "    - DataFrame;\n",
+    "    - генератор словарей;\n",
+    "    - генератор NamedTyple;\n",
+    "    - записывать в csv или базу данных."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 1. Установка и импорт зависимостей"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Requirement already satisfied: pandas in c:\\dev\\.jupyter\\.venv\\lib\\site-packages (1.0.1)\n",
+      "Requirement already satisfied: openpyxl in c:\\dev\\.jupyter\\.venv\\lib\\site-packages (3.0.3)\n",
+      "Requirement already satisfied: xlrd in c:\\dev\\.jupyter\\.venv\\lib\\site-packages (1.2.0)\n",
+      "Requirement already satisfied: chardet in c:\\dev\\.jupyter\\.venv\\lib\\site-packages (3.0.4)\n",
+      "Requirement already satisfied: numpy>=1.13.3 in c:\\dev\\.jupyter\\.venv\\lib\\site-packages (from pandas) (1.18.1)\n",
+      "Requirement already satisfied: pytz>=2017.2 in c:\\dev\\.jupyter\\.venv\\lib\\site-packages (from pandas) (2019.3)\n",
+      "Requirement already satisfied: python-dateutil>=2.6.1 in c:\\dev\\.jupyter\\.venv\\lib\\site-packages (from pandas) (2.8.1)\n",
+      "Requirement already satisfied: jdcal in c:\\dev\\.jupyter\\.venv\\lib\\site-packages (from openpyxl) (1.4.1)\n",
+      "Requirement already satisfied: et_xmlfile in c:\\dev\\.jupyter\\.venv\\lib\\site-packages (from openpyxl) (1.0.1)\n",
+      "Requirement already satisfied: six>=1.5 in c:\\dev\\.jupyter\\.venv\\lib\\site-packages (from python-dateutil>=2.6.1->pandas) (1.14.0)\n"
+     ]
+    }
+   ],
+   "source": [
+    "!pip install pandas openpyxl xlrd chardet"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import os\n",
+    "import sys\n",
+    "import glob\n",
+    "import re\n",
+    "from itertools import islice\n",
+    "from collections.abc import Iterable\n",
+    "from urllib.parse import urlparse\n",
+    "from urllib.request import urlopen\n",
+    "\n",
+    "import pandas as pd\n",
+    "import openpyxl"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Объявление класса"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "class ExcelPreprocessor:\n",
+    "    def __init__(self, *wb, append_global_index=False, append_wb_index=False, \n",
+    "                 filename_parser=None, append_ws_title_column=False, first_row_number=1,\n",
+    "                 iterate_over_worksheet=0, cells=None, headers=None):\n",
+    "        '''\n",
+    "        параметр iterate_over_worksheet отвечает за то, какой именно рабочий лист в каждой прочитанной\n",
+    "        книге будет разобран по умолчанию это лист с индексом 0, т.е. 1 в списке.\n",
+    "        Номера листов можно задать списком, например [4, 5] (пятый и шестой соответственно)\n",
+    "        также можно указать \"ALL\" или True, тогда будут прочитаны все листы всех книг\n",
+    "        и данные из них объединены в один набор\n",
+    "        '''\n",
+    "        self.wb = []\n",
+    "        for w in wb:\n",
+    "            if isinstance(w, list):\n",
+    "                self.wb += w\n",
+    "            elif isinstance(w, str):\n",
+    "                self.wb += [w]\n",
+    "            else:\n",
+    "                raise Exception(f'the \"{w}\" is of type {type(w)}, need list or str')\n",
+    "\n",
+    "        self.global_index = append_global_index\n",
+    "        self.wb_index = append_wb_index\n",
+    "        self.filename_parser = filename_parser\n",
+    "        self.append_ws_title_column = append_ws_title_column\n",
+    "        self.first_row_number = first_row_number\n",
+    "        self.iterate_over_worksheet = iterate_over_worksheet\n",
+    "        self.cells = cells\n",
+    "        self.headers = headers\n",
+    "\n",
+    "    def __repr__(self):\n",
+    "        return f'''{ExcelPreprocessor.__name__}{self.wb}:\n",
+    "          add global index: {self.global_index}\n",
+    "          add workbook index: {self.wb_index}\n",
+    "          filename parser: {self.filename_parser}\n",
+    "          append worksheet title: {self.append_ws_title_column}\n",
+    "          first row number in worksheet: {self.first_row_number}\n",
+    "          worksheets in all wb to iterate: {self.iterate_over_worksheet}\n",
+    "          cells: {self.cells}\n",
+    "          headers: {self.headers}'''\n",
+    "\n",
+    "    @property\n",
+    "    def _process_files(self):\n",
+    "        '''\n",
+    "        обрабатывает файлы в списке\n",
+    "        принимает обычные файлы, zip-архивы и http - пути\n",
+    "        '''\n",
+    "        for filename in self.wb:\n",
+    "            rf = filename\n",
+    "            if filename.startswith('http'):\n",
+    "                import io\n",
+    "                with urlopen(filename) as resp:\n",
+    "                    rf = io.BytesIO(resp.read())\n",
+    "                    if filename.endswith('.xlsx'):\n",
+    "                        yield filename, rf\n",
+    "            elif filename.endswith('xlsx'):\n",
+    "                yield filename, open(filename, 'rb')\n",
+    "\n",
+    "            if filename.endswith('.zip'):\n",
+    "                from zipfile import ZipFile\n",
+    "                import chardet\n",
+    "                ZIP_FILENAME_UTF8_FLAG = 0x800\n",
+    "                zf = ZipFile(rf , 'r')\n",
+    "                for info in zf.filelist:\n",
+    "                    filename = info.filename\n",
+    "                    if info.flag_bits & ZIP_FILENAME_UTF8_FLAG == 0:\n",
+    "                        filename_bytes = filename.encode('437')\n",
+    "                        guessed_encoding = chardet.detect(filename_bytes)['encoding'] or 'cp1252'\n",
+    "                        filename = filename_bytes.decode(guessed_encoding, 'replace')\n",
+    "                        yield filename, zf.open(info.filename, 'r')\n",
+    "\n",
+    "    @property\n",
+    "    def _columns(self):\n",
+    "        columns = []\n",
+    "        if self.global_index:\n",
+    "            columns.append('global_index')\n",
+    "        if self.wb_index:\n",
+    "            columns.append('ws_index')\n",
+    "        if self.filename_parser:\n",
+    "            columns += self.filename_parser(self.wb[0]).keys()\n",
+    "        if self.append_ws_title_column:\n",
+    "            columns.append('ws_title')\n",
+    "        if self.cells:\n",
+    "            columns += self.cells.keys()\n",
+    "        if self.headers:\n",
+    "            columns += self.headers\n",
+    "        return columns\n",
+    "\n",
+    "    def _iter_over_rows(self):\n",
+    "        'итерация по общей последовательности строк в итоговом наборе'\n",
+    "        \n",
+    "        row_counter = 0\n",
+    "\n",
+    "        for fn, excel_file in self._process_files:\n",
+    "            wb = openpyxl.load_workbook(excel_file, read_only=True, data_only=False, keep_links=False)\n",
+    "\n",
+    "            if isinstance(self.iterate_over_worksheet, int):\n",
+    "                iter_sheet = [self.iterate_over_worksheet]\n",
+    "            elif isinstance(self.iterate_over_worksheet, Iterable):\n",
+    "                iter_sheet = self.iterate_over_worksheet\n",
+    "            else:\n",
+    "                iter_sheet = [i for i, ws in enumerate(ws.worksheets)]\n",
+    "\n",
+    "            for ws_index in iter_sheet:\n",
+    "                ws = wb.worksheets[ws_index]\n",
+    "                result = ((cell.value for cell in row) for row in ws.rows)\n",
+    "\n",
+    "                if self.first_row_number:\n",
+    "                    result = islice(result, self.first_row_number - 1, None)\n",
+    "                if self.cells:\n",
+    "                    retry_cols_values = [ws[c].value for c in self.cells.values()]\n",
+    "                    result = ((*retry_cols_values, *row) for row in result)\n",
+    "                if self.append_ws_title_column:\n",
+    "                    result = ((ws.title, *row) for row in result)\n",
+    "                if self.filename_parser:\n",
+    "                    fncols = self.filename_parser(fn)\n",
+    "                    result = ((*fncols.values(), *row) for row in result)\n",
+    "                if self.wb_index:\n",
+    "                    result = ((i, *row) for i, row in enumerate(result))\n",
+    "                if self.global_index:\n",
+    "                    result = ((row_counter, *row) for i, row in enumerate(result))\n",
+    "                for row in result:\n",
+    "                    yield row\n",
+    "                    row_counter += 1\n",
+    "\n",
+    "    def get_dataframe(self):\n",
+    "        'возвращает набор данных в виде pandas DataFrame'\n",
+    "        return pd.DataFrame({'hello': []})\n",
+    "\n",
+    "    def write_csv(self, csv_filename):\n",
+    "        'записывает набор данных в файл csv'\n",
+    "        return None\n",
+    "\n",
+    "    def write_excel(excel_filename):\n",
+    "        'записывает набор данных в файл excel'\n",
+    "        return None\n",
+    "\n",
+    "    def get_iter_dict(self):\n",
+    "        'возвращает набор данных в виде итератора словарей'\n",
+    "        cols = self._columns\n",
+    "        for row in self._iter_over_rows():\n",
+    "            yield {k:v for k, v in zip(cols, row)}\n",
+    "\n",
+    "    def get_iter_nt(self):\n",
+    "        'возвращает набор данных в виде итерируемого набора NamedTyple'\n",
+    "        from collections import namedtuple\n",
+    "        cols = self._columns\n",
+    "        nt = namedtuple(\"Row\", [c.replace(' ', '_').replace('.', '_').replace('(', '_').replace(')', '_') for c in cols])\n",
+    "        for row in self._iter_over_rows():\n",
+    "            yield nt(*row)\n",
+    "\n",
+    "    def get_sample(self, start, stop):\n",
+    "        'возвращает сэмпл итогового набора (можно проверить правильность обработки данных)'\n",
+    "        return [list(row) for row in islice(self._iter_over_rows(), start, stop)]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "ExcelPreprocessor['data\\\\2009\\\\4nm010618.xlsx', 'data\\\\2008\\\\4nm011118.xlsx']:\n",
+       "          add global index: False\n",
+       "          add workbook index: False\n",
+       "          filename parser: None\n",
+       "          append worksheet title: False\n",
+       "          first row number in worksheet: 1\n",
+       "          worksheets in all wb to iterate: 0\n",
+       "          cells: None\n",
+       "          headers: None"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# создаем экземпляр класса и смотрим что получается\n",
+    "processor = ExcelPreprocessor('data\\\\2009\\\\4nm010618.xlsx', 'data\\\\2008\\\\4nm011118.xlsx')\n",
+    "processor"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[None, 'Код стро-ки', 'Всего ', 'из графы 1 по :', None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]\n",
+      "[None, None, None, 'федеральным налогам и сборам', None, None, None, None, None, None, None, 'региональным налогам и сборам', 'местным налогам и сборам', 'налогам со специальным налоговым режимом', 'Единому социальному налогу', 'Из графы 13 единый социальный налог в федеральный бюджет', 'Платежам в государственные внебюджетные фонды', 'ВСЕГО задолженность по страховым взносам', None, None, None, None, None, None]\n",
+      "[None, None, None, 'Всего ', 'из них', None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]\n",
+      "[None, None, None, None, 'налог на прибыль организаций', None, 'налог на добавленную стоимость ', 'из графы 5 налог на добавленную стоимость по товарам (работам, услугам), реализуемым на территории РФ', 'платежи за пользование природными ресурсами ', 'из графы 7\\n налог на добычу полезных ископаемых', 'остальные федеральные налоги и сборы', None, None, None, None, None, None, None, None, None, None, None, None, None]\n",
+      "[None, None, None, None, 'Всего ', 'в том числе в федеральный бюджет', None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]\n",
+      "['А', 'Б', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, None, None, None, None, None, None]\n"
+     ]
+    }
+   ],
+   "source": [
+    "# попробуем получить кусочек данных например с 5 по 8 строку и посмотреть что получается\n",
+    "for row in processor.get_sample(5, 11):\n",
+    "    print(row)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "['Уточненные данные по состоянию на 16.07.2018\\n', 'ЗАДОЛЖЕННОСТЬ - ВСЕГО (стр.1010+стр.1045+стр.1093)', 1005, 1235462116, 613079956, 137068882, 16509931, 378521695, 377407864, 7475610, 7001696, 90013769, 152239095, 76851905, 52246651, 4059156, 2911250, 892339, 336093014, None, None, None, None, None, None]\n",
+      "['Уточненные данные по состоянию на 16.07.2018\\n', 'ЗАДОЛЖЕННОСТЬ ПЕРЕД БЮДЖЕТОМ ПО НАЛОГАМ, СБОРАМ, ПЕНЯМ, НАЛОГОВЫМ САНКЦИЯМ ВСЕГО В ТОМ ЧИСЛЕ:', 1010, 966783423, 470685208, 102647180, 12435295, 293731518, 292643494, 6239798, 6015450, 68066712, 122048711, 66194027, 50606745, 2990596, 2027362, 838342, 253419794, None, None, None, None, None, None]\n",
+      "['Уточненные данные по состоянию на 16.07.2018\\n', 'из нее\\nзадолженность, невозможная к взысканию в связи с отложением подачи заявления в арбитражный суд о признании должника банкротом', 1011, 59789575, 45827009, 6993023, 772092, 33088224, 32865309, 70488, 41193, 5675274, 369196, 357281, 3524787, 92613, 75241, 41612, 9577077, None, None, None, None, None, None]\n",
+      "['Уточненные данные по состоянию на 16.07.2018\\n', 'НЕДОИМКА', 1020, 738863445, 350780985, 76405303, 9214666, 221615329, 220703752, 5920609, 5756088, 46839744, 98789604, 54482333, 37990418, 896167, 605705, 190163, 195733775, None, None, None, None, None, None]\n"
+     ]
+    }
+   ],
+   "source": [
+    "# Видим что данные начинаются только с 12 строки, к тому же нам надо добавить\n",
+    "# в каждую строку информацию из ячейки \"A1\", назовём её \"date_ot\"\n",
+    "processor.cells = {'date_ot': 'A1'}\n",
+    "processor.first_row_number = 12\n",
+    "for row in processor.get_sample(0, 4):\n",
+    "    print(row)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "['2009', '4nm010618', 'xlsx', 'Уточненные данные по состоянию на 16.07.2018\\n', 'ЗАДОЛЖЕННОСТЬ - ВСЕГО (стр.1010+стр.1045+стр.1093)', 1005, 1235462116, 613079956, 137068882, 16509931, 378521695, 377407864, 7475610, 7001696, 90013769, 152239095, 76851905, 52246651, 4059156, 2911250, 892339, 336093014, None, None, None, None, None, None]\n",
+      "['2009', '4nm010618', 'xlsx', 'Уточненные данные по состоянию на 16.07.2018\\n', 'ЗАДОЛЖЕННОСТЬ ПЕРЕД БЮДЖЕТОМ ПО НАЛОГАМ, СБОРАМ, ПЕНЯМ, НАЛОГОВЫМ САНКЦИЯМ ВСЕГО В ТОМ ЧИСЛЕ:', 1010, 966783423, 470685208, 102647180, 12435295, 293731518, 292643494, 6239798, 6015450, 68066712, 122048711, 66194027, 50606745, 2990596, 2027362, 838342, 253419794, None, None, None, None, None, None]\n",
+      "['2009', '4nm010618', 'xlsx', 'Уточненные данные по состоянию на 16.07.2018\\n', 'из нее\\nзадолженность, невозможная к взысканию в связи с отложением подачи заявления в арбитражный суд о признании должника банкротом', 1011, 59789575, 45827009, 6993023, 772092, 33088224, 32865309, 70488, 41193, 5675274, 369196, 357281, 3524787, 92613, 75241, 41612, 9577077, None, None, None, None, None, None]\n",
+      "['2009', '4nm010618', 'xlsx', 'Уточненные данные по состоянию на 16.07.2018\\n', 'НЕДОИМКА', 1020, 738863445, 350780985, 76405303, 9214666, 221615329, 220703752, 5920609, 5756088, 46839744, 98789604, 54482333, 37990418, 896167, 605705, 190163, 195733775, None, None, None, None, None, None]\n"
+     ]
+    }
+   ],
+   "source": [
+    "# добавим функцию для того чтобы извлечь из имён файлов полезную информацию и потом добавить её в наш набор данных\n",
+    "# один файл выглядит так: 'data\\\\2009\\\\4nm010618.xlsx'\n",
+    "# сделаем функцию, которая принимает название файла в таком формате и регулярным выражением возвращает год, название файла и его расширение\n",
+    "\n",
+    "def parse_filename(filename):\n",
+    "    rstring = r'data\\\\(?P<year>\\w+)\\\\(?P<filename>\\w+)\\.(?P<extension>\\w+)'\n",
+    "    r = re.match(rstring, filename)\n",
+    "    return r.groupdict()\n",
+    "\n",
+    "processor.filename_parser = parse_filename\n",
+    "for row in processor.get_sample(0, 4):\n",
+    "    print(row)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[0, 0, '2009', '4nm010618', 'xlsx', 'P1', 'Уточненные данные по состоянию на 16.07.2018\\n', 'ЗАДОЛЖЕННОСТЬ - ВСЕГО (стр.1010+стр.1045+стр.1093)', 1005, 1235462116, 613079956, 137068882, 16509931, 378521695, 377407864, 7475610, 7001696, 90013769, 152239095, 76851905, 52246651, 4059156, 2911250, 892339, 336093014, None, None, None, None, None, None]\n",
+      "[1, 1, '2009', '4nm010618', 'xlsx', 'P1', 'Уточненные данные по состоянию на 16.07.2018\\n', 'ЗАДОЛЖЕННОСТЬ ПЕРЕД БЮДЖЕТОМ ПО НАЛОГАМ, СБОРАМ, ПЕНЯМ, НАЛОГОВЫМ САНКЦИЯМ ВСЕГО В ТОМ ЧИСЛЕ:', 1010, 966783423, 470685208, 102647180, 12435295, 293731518, 292643494, 6239798, 6015450, 68066712, 122048711, 66194027, 50606745, 2990596, 2027362, 838342, 253419794, None, None, None, None, None, None]\n",
+      "[2, 2, '2009', '4nm010618', 'xlsx', 'P1', 'Уточненные данные по состоянию на 16.07.2018\\n', 'из нее\\nзадолженность, невозможная к взысканию в связи с отложением подачи заявления в арбитражный суд о признании должника банкротом', 1011, 59789575, 45827009, 6993023, 772092, 33088224, 32865309, 70488, 41193, 5675274, 369196, 357281, 3524787, 92613, 75241, 41612, 9577077, None, None, None, None, None, None]\n",
+      "[3, 3, '2009', '4nm010618', 'xlsx', 'P1', 'Уточненные данные по состоянию на 16.07.2018\\n', 'НЕДОИМКА', 1020, 738863445, 350780985, 76405303, 9214666, 221615329, 220703752, 5920609, 5756088, 46839744, 98789604, 54482333, 37990418, 896167, 605705, 190163, 195733775, None, None, None, None, None, None]\n"
+     ]
+    }
+   ],
+   "source": [
+    "# теперь добавим в наш результируюший набор поле сквозного индекса\n",
+    "# и отдельный индекс по каждому рабочему листу, что нам попадётся\n",
+    "processor.global_index = True\n",
+    "processor.wb_index = True\n",
+    "# также нелишним будет добавить и колонку с заголовком рабочего листа с которого получены данные\n",
+    "processor.append_ws_title_column = True\n",
+    "for row in processor.get_sample(0, 4):\n",
+    "    print(row)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{'global_index': 0, 'ws_index': 0, 'year': '2009', 'filename': '4nm010618', 'extension': 'xlsx', 'ws_title': 'P1', 'date_ot': 'Уточненные данные по состоянию на 16.07.2018\\n'}\n",
+      "{'global_index': 1, 'ws_index': 1, 'year': '2009', 'filename': '4nm010618', 'extension': 'xlsx', 'ws_title': 'P1', 'date_ot': 'Уточненные данные по состоянию на 16.07.2018\\n'}\n",
+      "{'global_index': 2, 'ws_index': 2, 'year': '2009', 'filename': '4nm010618', 'extension': 'xlsx', 'ws_title': 'P1', 'date_ot': 'Уточненные данные по состоянию на 16.07.2018\\n'}\n",
+      "{'global_index': 3, 'ws_index': 3, 'year': '2009', 'filename': '4nm010618', 'extension': 'xlsx', 'ws_title': 'P1', 'date_ot': 'Уточненные данные по состоянию на 16.07.2018\\n'}\n",
+      "{'global_index': 4, 'ws_index': 4, 'year': '2009', 'filename': '4nm010618', 'extension': 'xlsx', 'ws_title': 'P1', 'date_ot': 'Уточненные данные по состоянию на 16.07.2018\\n'}\n"
+     ]
+    }
+   ],
+   "source": [
+    "# посмотрим то же самое в формате набора словарей:\n",
+    "for row in islice(processor.get_iter_dict(), 0, 5):\n",
+    "    print(row)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{'global_index': 0, 'ws_index': 0, 'year': '2009', 'filename': '4nm010618', 'extension': 'xlsx', 'ws_title': 'P1', 'date_ot': 'Уточненные данные по состоянию на 16.07.2018\\n', 'поле': 'ЗАДОЛЖЕННОСТЬ - ВСЕГО (стр.1010+стр.1045+стр.1093)', 'код строки': 1005, 'кол. налогоплательщиков': 1235462116, 'всего': 613079956, 'по налогу (сбору)': 137068882, 'по пени': 16509931, 'по штрафам': 378521695, 'проценты': 377407864, 'по ЕСН': 7475610, 'по страховым взносам': 7001696}\n",
+      "{'global_index': 1, 'ws_index': 1, 'year': '2009', 'filename': '4nm010618', 'extension': 'xlsx', 'ws_title': 'P1', 'date_ot': 'Уточненные данные по состоянию на 16.07.2018\\n', 'поле': 'ЗАДОЛЖЕННОСТЬ ПЕРЕД БЮДЖЕТОМ ПО НАЛОГАМ, СБОРАМ, ПЕНЯМ, НАЛОГОВЫМ САНКЦИЯМ ВСЕГО В ТОМ ЧИСЛЕ:', 'код строки': 1010, 'кол. налогоплательщиков': 966783423, 'всего': 470685208, 'по налогу (сбору)': 102647180, 'по пени': 12435295, 'по штрафам': 293731518, 'проценты': 292643494, 'по ЕСН': 6239798, 'по страховым взносам': 6015450}\n",
+      "{'global_index': 2, 'ws_index': 2, 'year': '2009', 'filename': '4nm010618', 'extension': 'xlsx', 'ws_title': 'P1', 'date_ot': 'Уточненные данные по состоянию на 16.07.2018\\n', 'поле': 'из нее\\nзадолженность, невозможная к взысканию в связи с отложением подачи заявления в арбитражный суд о признании должника банкротом', 'код строки': 1011, 'кол. налогоплательщиков': 59789575, 'всего': 45827009, 'по налогу (сбору)': 6993023, 'по пени': 772092, 'по штрафам': 33088224, 'проценты': 32865309, 'по ЕСН': 70488, 'по страховым взносам': 41193}\n",
+      "{'global_index': 3, 'ws_index': 3, 'year': '2009', 'filename': '4nm010618', 'extension': 'xlsx', 'ws_title': 'P1', 'date_ot': 'Уточненные данные по состоянию на 16.07.2018\\n', 'поле': 'НЕДОИМКА', 'код строки': 1020, 'кол. налогоплательщиков': 738863445, 'всего': 350780985, 'по налогу (сбору)': 76405303, 'по пени': 9214666, 'по штрафам': 221615329, 'проценты': 220703752, 'по ЕСН': 5920609, 'по страховым взносам': 5756088}\n",
+      "{'global_index': 4, 'ws_index': 4, 'year': '2009', 'filename': '4nm010618', 'extension': 'xlsx', 'ws_title': 'P1', 'date_ot': 'Уточненные данные по состоянию на 16.07.2018\\n', 'поле': '\\nИз строки 1020\\nНЕДОИМКА ОРГАНИЗАЦИЙ И ИНДИВИДУАЛЬНЫХ ПРЕДПРИНИМАТЕЛЕЙ, НЕ ПРЕДСТАВЛЯЮЩИХ ОТЧЕТНОСТЬ', 'код строки': 1030, 'кол. налогоплательщиков': 105337216, 'всего': 68231581, 'по налогу (сбору)': 16344932, 'по пени': 1759494, 'по штрафам': 47161217, 'проценты': 47056987, 'по ЕСН': 36418, 'по страховым взносам': 27229}\n"
+     ]
+    }
+   ],
+   "source": [
+    "# видно что не хватает колонок, т.к. не задан параметр \"headers\". исправим это\n",
+    "processor.headers = [\n",
+    "    'поле', 'код строки', 'кол. налогоплательщиков', 'всего', 'по налогу (сбору)',\n",
+    "    'по пени', 'по штрафам', 'проценты', 'по ЕСН', 'по страховым взносам'\n",
+    "]\n",
+    "for row in islice(processor.get_iter_dict(), 0, 5):\n",
+    "    print(row)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>global_index</th>\n",
+       "      <th>ws_index</th>\n",
+       "      <th>year</th>\n",
+       "      <th>filename</th>\n",
+       "      <th>extension</th>\n",
+       "      <th>ws_title</th>\n",
+       "      <th>date_ot</th>\n",
+       "      <th>поле</th>\n",
+       "      <th>код строки</th>\n",
+       "      <th>кол. налогоплательщиков</th>\n",
+       "      <th>всего</th>\n",
+       "      <th>по налогу (сбору)</th>\n",
+       "      <th>по пени</th>\n",
+       "      <th>по штрафам</th>\n",
+       "      <th>проценты</th>\n",
+       "      <th>по ЕСН</th>\n",
+       "      <th>по страховым взносам</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>2009</td>\n",
+       "      <td>4nm010618</td>\n",
+       "      <td>xlsx</td>\n",
+       "      <td>P1</td>\n",
+       "      <td>Уточненные данные по состоянию на 16.07.2018\\n</td>\n",
+       "      <td>ЗАДОЛЖЕННОСТЬ - ВСЕГО (стр.1010+стр.1045+стр.1...</td>\n",
+       "      <td>1005.0</td>\n",
+       "      <td>1.235462e+09</td>\n",
+       "      <td>613079956.0</td>\n",
+       "      <td>137068882.0</td>\n",
+       "      <td>16509931.0</td>\n",
+       "      <td>378521695.0</td>\n",
+       "      <td>377407864.0</td>\n",
+       "      <td>7475610.0</td>\n",
+       "      <td>7001696.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>2009</td>\n",
+       "      <td>4nm010618</td>\n",
+       "      <td>xlsx</td>\n",
+       "      <td>P1</td>\n",
+       "      <td>Уточненные данные по состоянию на 16.07.2018\\n</td>\n",
+       "      <td>ЗАДОЛЖЕННОСТЬ ПЕРЕД БЮДЖЕТОМ ПО НАЛОГАМ, СБОРА...</td>\n",
+       "      <td>1010.0</td>\n",
+       "      <td>9.667834e+08</td>\n",
+       "      <td>470685208.0</td>\n",
+       "      <td>102647180.0</td>\n",
+       "      <td>12435295.0</td>\n",
+       "      <td>293731518.0</td>\n",
+       "      <td>292643494.0</td>\n",
+       "      <td>6239798.0</td>\n",
+       "      <td>6015450.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>2</td>\n",
+       "      <td>2</td>\n",
+       "      <td>2009</td>\n",
+       "      <td>4nm010618</td>\n",
+       "      <td>xlsx</td>\n",
+       "      <td>P1</td>\n",
+       "      <td>Уточненные данные по состоянию на 16.07.2018\\n</td>\n",
+       "      <td>из нее\\nзадолженность, невозможная к взысканию...</td>\n",
+       "      <td>1011.0</td>\n",
+       "      <td>5.978958e+07</td>\n",
+       "      <td>45827009.0</td>\n",
+       "      <td>6993023.0</td>\n",
+       "      <td>772092.0</td>\n",
+       "      <td>33088224.0</td>\n",
+       "      <td>32865309.0</td>\n",
+       "      <td>70488.0</td>\n",
+       "      <td>41193.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>3</td>\n",
+       "      <td>3</td>\n",
+       "      <td>2009</td>\n",
+       "      <td>4nm010618</td>\n",
+       "      <td>xlsx</td>\n",
+       "      <td>P1</td>\n",
+       "      <td>Уточненные данные по состоянию на 16.07.2018\\n</td>\n",
+       "      <td>НЕДОИМКА</td>\n",
+       "      <td>1020.0</td>\n",
+       "      <td>7.388634e+08</td>\n",
+       "      <td>350780985.0</td>\n",
+       "      <td>76405303.0</td>\n",
+       "      <td>9214666.0</td>\n",
+       "      <td>221615329.0</td>\n",
+       "      <td>220703752.0</td>\n",
+       "      <td>5920609.0</td>\n",
+       "      <td>5756088.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>4</th>\n",
+       "      <td>4</td>\n",
+       "      <td>4</td>\n",
+       "      <td>2009</td>\n",
+       "      <td>4nm010618</td>\n",
+       "      <td>xlsx</td>\n",
+       "      <td>P1</td>\n",
+       "      <td>Уточненные данные по состоянию на 16.07.2018\\n</td>\n",
+       "      <td>\\nИз строки 1020\\nНЕДОИМКА ОРГАНИЗАЦИЙ И ИНДИВ...</td>\n",
+       "      <td>1030.0</td>\n",
+       "      <td>1.053372e+08</td>\n",
+       "      <td>68231581.0</td>\n",
+       "      <td>16344932.0</td>\n",
+       "      <td>1759494.0</td>\n",
+       "      <td>47161217.0</td>\n",
+       "      <td>47056987.0</td>\n",
+       "      <td>36418.0</td>\n",
+       "      <td>27229.0</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "   global_index  ws_index  year   filename extension ws_title  \\\n",
+       "0             0         0  2009  4nm010618      xlsx       P1   \n",
+       "1             1         1  2009  4nm010618      xlsx       P1   \n",
+       "2             2         2  2009  4nm010618      xlsx       P1   \n",
+       "3             3         3  2009  4nm010618      xlsx       P1   \n",
+       "4             4         4  2009  4nm010618      xlsx       P1   \n",
+       "\n",
+       "                                          date_ot  \\\n",
+       "0  Уточненные данные по состоянию на 16.07.2018\\n   \n",
+       "1  Уточненные данные по состоянию на 16.07.2018\\n   \n",
+       "2  Уточненные данные по состоянию на 16.07.2018\\n   \n",
+       "3  Уточненные данные по состоянию на 16.07.2018\\n   \n",
+       "4  Уточненные данные по состоянию на 16.07.2018\\n   \n",
+       "\n",
+       "                                                поле  код строки  \\\n",
+       "0  ЗАДОЛЖЕННОСТЬ - ВСЕГО (стр.1010+стр.1045+стр.1...      1005.0   \n",
+       "1  ЗАДОЛЖЕННОСТЬ ПЕРЕД БЮДЖЕТОМ ПО НАЛОГАМ, СБОРА...      1010.0   \n",
+       "2  из нее\\nзадолженность, невозможная к взысканию...      1011.0   \n",
+       "3                                           НЕДОИМКА      1020.0   \n",
+       "4  \\nИз строки 1020\\nНЕДОИМКА ОРГАНИЗАЦИЙ И ИНДИВ...      1030.0   \n",
+       "\n",
+       "   кол. налогоплательщиков        всего  по налогу (сбору)     по пени  \\\n",
+       "0             1.235462e+09  613079956.0        137068882.0  16509931.0   \n",
+       "1             9.667834e+08  470685208.0        102647180.0  12435295.0   \n",
+       "2             5.978958e+07   45827009.0          6993023.0    772092.0   \n",
+       "3             7.388634e+08  350780985.0         76405303.0   9214666.0   \n",
+       "4             1.053372e+08   68231581.0         16344932.0   1759494.0   \n",
+       "\n",
+       "    по штрафам     проценты     по ЕСН  по страховым взносам  \n",
+       "0  378521695.0  377407864.0  7475610.0             7001696.0  \n",
+       "1  293731518.0  292643494.0  6239798.0             6015450.0  \n",
+       "2   33088224.0   32865309.0    70488.0               41193.0  \n",
+       "3  221615329.0  220703752.0  5920609.0             5756088.0  \n",
+       "4   47161217.0   47056987.0    36418.0               27229.0  "
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# попробуем то же самое в виде DataFrame\n",
+    "pd.DataFrame(processor.get_iter_dict())[:5]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>global_index</th>\n",
+       "      <th>ws_index</th>\n",
+       "      <th>year</th>\n",
+       "      <th>filename</th>\n",
+       "      <th>extension</th>\n",
+       "      <th>ws_title</th>\n",
+       "      <th>form_name</th>\n",
+       "      <th>description</th>\n",
+       "      <th>form_dt</th>\n",
+       "      <th>unit_name</th>\n",
+       "      <th>поле</th>\n",
+       "      <th>код строки</th>\n",
+       "      <th>кол. налогоплательщиков</th>\n",
+       "      <th>всего</th>\n",
+       "      <th>по налогу (сбору)</th>\n",
+       "      <th>по пени</th>\n",
+       "      <th>по штрафам</th>\n",
+       "      <th>проценты</th>\n",
+       "      <th>по ЕСН</th>\n",
+       "      <th>по страховым взносам</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>2009</td>\n",
+       "      <td>4nm010618</td>\n",
+       "      <td>xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.06.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма списанной задолженности организаций, лик...</td>\n",
+       "      <td>2400</td>\n",
+       "      <td>23632</td>\n",
+       "      <td>30705385</td>\n",
+       "      <td>18388429</td>\n",
+       "      <td>4699527</td>\n",
+       "      <td>1439452</td>\n",
+       "      <td>184237</td>\n",
+       "      <td>596724</td>\n",
+       "      <td>5397016</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>2009</td>\n",
+       "      <td>4nm010618</td>\n",
+       "      <td>xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.06.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма списанной задолженности индивидуальных п...</td>\n",
+       "      <td>2405</td>\n",
+       "      <td>9109</td>\n",
+       "      <td>3013574</td>\n",
+       "      <td>1661920</td>\n",
+       "      <td>881213</td>\n",
+       "      <td>242978</td>\n",
+       "      <td>628</td>\n",
+       "      <td>51928</td>\n",
+       "      <td>174907</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>2</td>\n",
+       "      <td>2</td>\n",
+       "      <td>2009</td>\n",
+       "      <td>4nm010618</td>\n",
+       "      <td>xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.06.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма списанной задолженности умерших или объя...</td>\n",
+       "      <td>2410</td>\n",
+       "      <td>39920</td>\n",
+       "      <td>677495</td>\n",
+       "      <td>115346</td>\n",
+       "      <td>44047</td>\n",
+       "      <td>11984</td>\n",
+       "      <td>0</td>\n",
+       "      <td>5203</td>\n",
+       "      <td>500915</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>3</td>\n",
+       "      <td>3</td>\n",
+       "      <td>2009</td>\n",
+       "      <td>4nm010618</td>\n",
+       "      <td>xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.06.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма списанной задолженности в случаях принят...</td>\n",
+       "      <td>2415</td>\n",
+       "      <td>58635</td>\n",
+       "      <td>2161183</td>\n",
+       "      <td>773472</td>\n",
+       "      <td>556271</td>\n",
+       "      <td>70216</td>\n",
+       "      <td>5769</td>\n",
+       "      <td>154600</td>\n",
+       "      <td>600855</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>4</th>\n",
+       "      <td>4</td>\n",
+       "      <td>4</td>\n",
+       "      <td>2009</td>\n",
+       "      <td>4nm010618</td>\n",
+       "      <td>xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.06.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма списанной задолженности по \"зависшим\" пл...</td>\n",
+       "      <td>2420</td>\n",
+       "      <td>93</td>\n",
+       "      <td>43115</td>\n",
+       "      <td>31946</td>\n",
+       "      <td>752</td>\n",
+       "      <td>76</td>\n",
+       "      <td>0</td>\n",
+       "      <td>5527</td>\n",
+       "      <td>4814</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>5</th>\n",
+       "      <td>5</td>\n",
+       "      <td>5</td>\n",
+       "      <td>2009</td>\n",
+       "      <td>4nm010618</td>\n",
+       "      <td>xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.06.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма списанной задолженности организаций, отв...</td>\n",
+       "      <td>2425</td>\n",
+       "      <td>25104</td>\n",
+       "      <td>4038755</td>\n",
+       "      <td>2487632</td>\n",
+       "      <td>1003525</td>\n",
+       "      <td>215253</td>\n",
+       "      <td>х</td>\n",
+       "      <td>29516</td>\n",
+       "      <td>302829</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>6</th>\n",
+       "      <td>6</td>\n",
+       "      <td>6</td>\n",
+       "      <td>2009</td>\n",
+       "      <td>4nm010618</td>\n",
+       "      <td>xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.06.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма списанной задолженности по решениям нало...</td>\n",
+       "      <td>2430</td>\n",
+       "      <td>16841363</td>\n",
+       "      <td>60557919</td>\n",
+       "      <td>41458668</td>\n",
+       "      <td>19050086</td>\n",
+       "      <td>325</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>48839</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>7</th>\n",
+       "      <td>7</td>\n",
+       "      <td>7</td>\n",
+       "      <td>2009</td>\n",
+       "      <td>4nm010618</td>\n",
+       "      <td>xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.06.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма задолженности, списанной на  основании з...</td>\n",
+       "      <td>2435</td>\n",
+       "      <td>1799585</td>\n",
+       "      <td>133435115</td>\n",
+       "      <td>36498879</td>\n",
+       "      <td>19197715</td>\n",
+       "      <td>5102099</td>\n",
+       "      <td>12731</td>\n",
+       "      <td>2055653</td>\n",
+       "      <td>70568038</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>8</th>\n",
+       "      <td>8</td>\n",
+       "      <td>0</td>\n",
+       "      <td>2008</td>\n",
+       "      <td>4nm011118</td>\n",
+       "      <td>xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.11.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма списанной задолженности организаций, лик...</td>\n",
+       "      <td>2400</td>\n",
+       "      <td>40157</td>\n",
+       "      <td>71402906</td>\n",
+       "      <td>40477282</td>\n",
+       "      <td>12510111</td>\n",
+       "      <td>3381043</td>\n",
+       "      <td>838205</td>\n",
+       "      <td>1228143</td>\n",
+       "      <td>12968122</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>9</th>\n",
+       "      <td>9</td>\n",
+       "      <td>1</td>\n",
+       "      <td>2008</td>\n",
+       "      <td>4nm011118</td>\n",
+       "      <td>xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.11.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма списанной задолженности индивидуальных п...</td>\n",
+       "      <td>2405</td>\n",
+       "      <td>19496</td>\n",
+       "      <td>4481612</td>\n",
+       "      <td>2347431</td>\n",
+       "      <td>1261980</td>\n",
+       "      <td>345253</td>\n",
+       "      <td>628</td>\n",
+       "      <td>72728</td>\n",
+       "      <td>453592</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "   global_index  ws_index  year   filename extension                ws_title  \\\n",
+       "0             0         0  2009  4nm010618      xlsx  Р. Справочно1_Списание   \n",
+       "1             1         1  2009  4nm010618      xlsx  Р. Справочно1_Списание   \n",
+       "2             2         2  2009  4nm010618      xlsx  Р. Справочно1_Списание   \n",
+       "3             3         3  2009  4nm010618      xlsx  Р. Справочно1_Списание   \n",
+       "4             4         4  2009  4nm010618      xlsx  Р. Справочно1_Списание   \n",
+       "5             5         5  2009  4nm010618      xlsx  Р. Справочно1_Списание   \n",
+       "6             6         6  2009  4nm010618      xlsx  Р. Справочно1_Списание   \n",
+       "7             7         7  2009  4nm010618      xlsx  Р. Справочно1_Списание   \n",
+       "8             8         0  2008  4nm011118      xlsx  Р. Справочно1_Списание   \n",
+       "9             9         1  2008  4nm011118      xlsx  Р. Справочно1_Списание   \n",
+       "\n",
+       "      form_name                                        description  \\\n",
+       "0  Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "1  Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "2  Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "3  Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "4  Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "5  Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "6  Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "7  Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "8  Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "9  Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "\n",
+       "                         form_dt    unit_name  \\\n",
+       "0  по состоянию на 01.06.2018 г.  тыс. рублей   \n",
+       "1  по состоянию на 01.06.2018 г.  тыс. рублей   \n",
+       "2  по состоянию на 01.06.2018 г.  тыс. рублей   \n",
+       "3  по состоянию на 01.06.2018 г.  тыс. рублей   \n",
+       "4  по состоянию на 01.06.2018 г.  тыс. рублей   \n",
+       "5  по состоянию на 01.06.2018 г.  тыс. рублей   \n",
+       "6  по состоянию на 01.06.2018 г.  тыс. рублей   \n",
+       "7  по состоянию на 01.06.2018 г.  тыс. рублей   \n",
+       "8  по состоянию на 01.11.2018 г.  тыс. рублей   \n",
+       "9  по состоянию на 01.11.2018 г.  тыс. рублей   \n",
+       "\n",
+       "                                                поле  код строки  \\\n",
+       "0  Сумма списанной задолженности организаций, лик...        2400   \n",
+       "1  Сумма списанной задолженности индивидуальных п...        2405   \n",
+       "2  Сумма списанной задолженности умерших или объя...        2410   \n",
+       "3  Сумма списанной задолженности в случаях принят...        2415   \n",
+       "4  Сумма списанной задолженности по \"зависшим\" пл...        2420   \n",
+       "5  Сумма списанной задолженности организаций, отв...        2425   \n",
+       "6  Сумма списанной задолженности по решениям нало...        2430   \n",
+       "7  Сумма задолженности, списанной на  основании з...        2435   \n",
+       "8  Сумма списанной задолженности организаций, лик...        2400   \n",
+       "9  Сумма списанной задолженности индивидуальных п...        2405   \n",
+       "\n",
+       "   кол. налогоплательщиков      всего  по налогу (сбору)   по пени  \\\n",
+       "0                    23632   30705385           18388429   4699527   \n",
+       "1                     9109    3013574            1661920    881213   \n",
+       "2                    39920     677495             115346     44047   \n",
+       "3                    58635    2161183             773472    556271   \n",
+       "4                       93      43115              31946       752   \n",
+       "5                    25104    4038755            2487632   1003525   \n",
+       "6                 16841363   60557919           41458668  19050086   \n",
+       "7                  1799585  133435115           36498879  19197715   \n",
+       "8                    40157   71402906           40477282  12510111   \n",
+       "9                    19496    4481612            2347431   1261980   \n",
+       "\n",
+       "   по штрафам проценты   по ЕСН  по страховым взносам  \n",
+       "0     1439452   184237   596724               5397016  \n",
+       "1      242978      628    51928                174907  \n",
+       "2       11984        0     5203                500915  \n",
+       "3       70216     5769   154600                600855  \n",
+       "4          76        0     5527                  4814  \n",
+       "5      215253        х    29516                302829  \n",
+       "6         325        1        0                 48839  \n",
+       "7     5102099    12731  2055653              70568038  \n",
+       "8     3381043   838205  1228143              12968122  \n",
+       "9      345253      628    72728                453592  "
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# пример как полностью настроить класс сразу при создании\n",
+    "proc = ExcelPreprocessor('data\\\\2009\\\\4nm010618.xlsx', 'data\\\\2008\\\\4nm011118.xlsx',\n",
+    "    filename_parser=lambda filename: re.match(r'data\\\\(?P<year>\\w+)\\\\(?P<filename>\\w+)\\.(?P<extension>\\w+)', filename).groupdict(),\n",
+    "    append_global_index=True, append_wb_index=True,\n",
+    "    cells = {'form_name': 'J1', 'description': 'A2', 'form_dt': 'A3', 'unit_name': 'J4'},\n",
+    "    headers = ['поле', 'код строки', 'кол. налогоплательщиков', 'всего', 'по налогу (сбору)', 'по пени', 'по штрафам', 'проценты', 'по ЕСН', 'по страховым взносам'],\n",
+    "    first_row_number=7, append_ws_title_column=True, iterate_over_worksheet=2\n",
+    ")\n",
+    "pd.DataFrame(proc.get_iter_dict())[:10]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "135.86149168014526\n"
+     ]
+    }
+   ],
+   "source": [
+    "fn = r'C:\\dev\\.jupyter\\water\\water_report.zip'\n",
+    "proc = ExcelPreprocessor(fn,\n",
+    "    filename_parser=lambda filename: {'filename': filename.split('.')[0]},\n",
+    "    append_global_index=True, append_wb_index=True,\n",
+    "    cells = {'obj': 'A1', 'form_dt': 'A2', 'report_dt': 'A3', 'np': 'B7'},\n",
+    "    headers = ['col_%s' % i for i in range(1, 39)],\n",
+    "    first_row_number=7, append_ws_title_column=True, iterate_over_worksheet=0\n",
+    ")\n",
+    "import time\n",
+    "ct = time.time()\n",
+    "d = pd.DataFrame(proc.get_iter_dict())\n",
+    "print(time.time() - ct)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>global_index</th>\n",
+       "      <th>ws_index</th>\n",
+       "      <th>filename</th>\n",
+       "      <th>ws_title</th>\n",
+       "      <th>form_name</th>\n",
+       "      <th>description</th>\n",
+       "      <th>form_dt</th>\n",
+       "      <th>unit_name</th>\n",
+       "      <th>поле</th>\n",
+       "      <th>код строки</th>\n",
+       "      <th>кол. налогоплательщиков</th>\n",
+       "      <th>всего</th>\n",
+       "      <th>по налогу (сбору)</th>\n",
+       "      <th>по пени</th>\n",
+       "      <th>по штрафам</th>\n",
+       "      <th>проценты</th>\n",
+       "      <th>по ЕСН</th>\n",
+       "      <th>по страховым взносам</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>4nm010318.xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.03.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма списанной задолженности организаций, лик...</td>\n",
+       "      <td>2400</td>\n",
+       "      <td>6302</td>\n",
+       "      <td>8850836</td>\n",
+       "      <td>4813849</td>\n",
+       "      <td>1428282</td>\n",
+       "      <td>385722</td>\n",
+       "      <td>122790</td>\n",
+       "      <td>249262</td>\n",
+       "      <td>1850931</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>1</td>\n",
+       "      <td>1</td>\n",
+       "      <td>4nm010318.xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.03.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма списанной задолженности индивидуальных п...</td>\n",
+       "      <td>2405</td>\n",
+       "      <td>3901</td>\n",
+       "      <td>891751</td>\n",
+       "      <td>515082</td>\n",
+       "      <td>267015</td>\n",
+       "      <td>59948</td>\n",
+       "      <td>0</td>\n",
+       "      <td>18923</td>\n",
+       "      <td>30783</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>2</td>\n",
+       "      <td>2</td>\n",
+       "      <td>4nm010318.xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.03.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма списанной задолженности умерших или объя...</td>\n",
+       "      <td>2410</td>\n",
+       "      <td>12387</td>\n",
+       "      <td>285449</td>\n",
+       "      <td>45580</td>\n",
+       "      <td>23315</td>\n",
+       "      <td>9378</td>\n",
+       "      <td>0</td>\n",
+       "      <td>2264</td>\n",
+       "      <td>204912</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>3</td>\n",
+       "      <td>3</td>\n",
+       "      <td>4nm010318.xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.03.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма списанной задолженности в случаях принят...</td>\n",
+       "      <td>2415</td>\n",
+       "      <td>19761</td>\n",
+       "      <td>883355</td>\n",
+       "      <td>327372</td>\n",
+       "      <td>193665</td>\n",
+       "      <td>35799</td>\n",
+       "      <td>5646</td>\n",
+       "      <td>79245</td>\n",
+       "      <td>241628</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>4</th>\n",
+       "      <td>4</td>\n",
+       "      <td>4</td>\n",
+       "      <td>4nm010318.xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.03.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма списанной задолженности по \"зависшим\" пл...</td>\n",
+       "      <td>2420</td>\n",
+       "      <td>46</td>\n",
+       "      <td>17476</td>\n",
+       "      <td>16940</td>\n",
+       "      <td>9</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>527</td>\n",
+       "      <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>5</th>\n",
+       "      <td>5</td>\n",
+       "      <td>5</td>\n",
+       "      <td>4nm010318.xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.03.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма списанной задолженности организаций, отв...</td>\n",
+       "      <td>2425</td>\n",
+       "      <td>11847</td>\n",
+       "      <td>1198159</td>\n",
+       "      <td>675557</td>\n",
+       "      <td>308155</td>\n",
+       "      <td>82420</td>\n",
+       "      <td>х</td>\n",
+       "      <td>14139</td>\n",
+       "      <td>117888</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>6</th>\n",
+       "      <td>6</td>\n",
+       "      <td>6</td>\n",
+       "      <td>4nm010318.xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.03.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма списанной задолженности по решениям нало...</td>\n",
+       "      <td>2430</td>\n",
+       "      <td>61</td>\n",
+       "      <td>37</td>\n",
+       "      <td>1</td>\n",
+       "      <td>31</td>\n",
+       "      <td>5</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>7</th>\n",
+       "      <td>7</td>\n",
+       "      <td>7</td>\n",
+       "      <td>4nm010318.xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.03.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма задолженности, списанной на  основании з...</td>\n",
+       "      <td>2435</td>\n",
+       "      <td>1148327</td>\n",
+       "      <td>40739221</td>\n",
+       "      <td>21970735</td>\n",
+       "      <td>12925353</td>\n",
+       "      <td>3832251</td>\n",
+       "      <td>4354</td>\n",
+       "      <td>107461</td>\n",
+       "      <td>1899067</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>8</th>\n",
+       "      <td>8</td>\n",
+       "      <td>0</td>\n",
+       "      <td>4nm010218.xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.02.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма списанной задолженности организаций, лик...</td>\n",
+       "      <td>2400</td>\n",
+       "      <td>2768</td>\n",
+       "      <td>4066983</td>\n",
+       "      <td>2314354</td>\n",
+       "      <td>735408</td>\n",
+       "      <td>187148</td>\n",
+       "      <td>39881</td>\n",
+       "      <td>86601</td>\n",
+       "      <td>703591</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>9</th>\n",
+       "      <td>9</td>\n",
+       "      <td>1</td>\n",
+       "      <td>4nm010218.xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.02.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма списанной задолженности индивидуальных п...</td>\n",
+       "      <td>2405</td>\n",
+       "      <td>3067</td>\n",
+       "      <td>39999</td>\n",
+       "      <td>21675</td>\n",
+       "      <td>12298</td>\n",
+       "      <td>3944</td>\n",
+       "      <td>0</td>\n",
+       "      <td>681</td>\n",
+       "      <td>1401</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>10</th>\n",
+       "      <td>10</td>\n",
+       "      <td>2</td>\n",
+       "      <td>4nm010218.xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.02.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма списанной задолженности умерших или объя...</td>\n",
+       "      <td>2410</td>\n",
+       "      <td>5411</td>\n",
+       "      <td>145804</td>\n",
+       "      <td>25389</td>\n",
+       "      <td>15249</td>\n",
+       "      <td>6433</td>\n",
+       "      <td>0</td>\n",
+       "      <td>1198</td>\n",
+       "      <td>97535</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>11</th>\n",
+       "      <td>11</td>\n",
+       "      <td>3</td>\n",
+       "      <td>4nm010218.xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.02.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма списанной задолженности в случаях принят...</td>\n",
+       "      <td>2415</td>\n",
+       "      <td>14035</td>\n",
+       "      <td>330592</td>\n",
+       "      <td>101728</td>\n",
+       "      <td>66280</td>\n",
+       "      <td>8424</td>\n",
+       "      <td>8</td>\n",
+       "      <td>13190</td>\n",
+       "      <td>140962</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>12</th>\n",
+       "      <td>12</td>\n",
+       "      <td>4</td>\n",
+       "      <td>4nm010218.xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.02.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма списанной задолженности по \"зависшим\" пл...</td>\n",
+       "      <td>2420</td>\n",
+       "      <td>27</td>\n",
+       "      <td>7852</td>\n",
+       "      <td>7744</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>108</td>\n",
+       "      <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>13</th>\n",
+       "      <td>13</td>\n",
+       "      <td>5</td>\n",
+       "      <td>4nm010218.xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.02.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма списанной задолженности организаций, отв...</td>\n",
+       "      <td>2425</td>\n",
+       "      <td>4917</td>\n",
+       "      <td>714015</td>\n",
+       "      <td>394956</td>\n",
+       "      <td>184775</td>\n",
+       "      <td>43302</td>\n",
+       "      <td>х</td>\n",
+       "      <td>7748</td>\n",
+       "      <td>83234</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>14</th>\n",
+       "      <td>14</td>\n",
+       "      <td>6</td>\n",
+       "      <td>4nm010218.xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.02.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма списанной задолженности по решениям нало...</td>\n",
+       "      <td>2430</td>\n",
+       "      <td>14</td>\n",
+       "      <td>2</td>\n",
+       "      <td>0</td>\n",
+       "      <td>2</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>15</th>\n",
+       "      <td>15</td>\n",
+       "      <td>7</td>\n",
+       "      <td>4nm010218.xlsx</td>\n",
+       "      <td>Р. Справочно1_Списание</td>\n",
+       "      <td>Форма № 4-НМ</td>\n",
+       "      <td>Справочно к Разделам I, II:      1_Списано зад...</td>\n",
+       "      <td>по состоянию на 01.02.2018 г.</td>\n",
+       "      <td>тыс. рублей</td>\n",
+       "      <td>Сумма задолженности, списанной на  основании з...</td>\n",
+       "      <td>2435</td>\n",
+       "      <td>41695</td>\n",
+       "      <td>5152573</td>\n",
+       "      <td>2928511</td>\n",
+       "      <td>1090182</td>\n",
+       "      <td>258133</td>\n",
+       "      <td>3456</td>\n",
+       "      <td>36947</td>\n",
+       "      <td>835344</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "    global_index  ws_index        filename                ws_title  \\\n",
+       "0              0         0  4nm010318.xlsx  Р. Справочно1_Списание   \n",
+       "1              1         1  4nm010318.xlsx  Р. Справочно1_Списание   \n",
+       "2              2         2  4nm010318.xlsx  Р. Справочно1_Списание   \n",
+       "3              3         3  4nm010318.xlsx  Р. Справочно1_Списание   \n",
+       "4              4         4  4nm010318.xlsx  Р. Справочно1_Списание   \n",
+       "5              5         5  4nm010318.xlsx  Р. Справочно1_Списание   \n",
+       "6              6         6  4nm010318.xlsx  Р. Справочно1_Списание   \n",
+       "7              7         7  4nm010318.xlsx  Р. Справочно1_Списание   \n",
+       "8              8         0  4nm010218.xlsx  Р. Справочно1_Списание   \n",
+       "9              9         1  4nm010218.xlsx  Р. Справочно1_Списание   \n",
+       "10            10         2  4nm010218.xlsx  Р. Справочно1_Списание   \n",
+       "11            11         3  4nm010218.xlsx  Р. Справочно1_Списание   \n",
+       "12            12         4  4nm010218.xlsx  Р. Справочно1_Списание   \n",
+       "13            13         5  4nm010218.xlsx  Р. Справочно1_Списание   \n",
+       "14            14         6  4nm010218.xlsx  Р. Справочно1_Списание   \n",
+       "15            15         7  4nm010218.xlsx  Р. Справочно1_Списание   \n",
+       "\n",
+       "       form_name                                        description  \\\n",
+       "0   Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "1   Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "2   Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "3   Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "4   Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "5   Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "6   Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "7   Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "8   Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "9   Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "10  Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "11  Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "12  Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "13  Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "14  Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "15  Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
+       "\n",
+       "                          form_dt    unit_name  \\\n",
+       "0   по состоянию на 01.03.2018 г.  тыс. рублей   \n",
+       "1   по состоянию на 01.03.2018 г.  тыс. рублей   \n",
+       "2   по состоянию на 01.03.2018 г.  тыс. рублей   \n",
+       "3   по состоянию на 01.03.2018 г.  тыс. рублей   \n",
+       "4   по состоянию на 01.03.2018 г.  тыс. рублей   \n",
+       "5   по состоянию на 01.03.2018 г.  тыс. рублей   \n",
+       "6   по состоянию на 01.03.2018 г.  тыс. рублей   \n",
+       "7   по состоянию на 01.03.2018 г.  тыс. рублей   \n",
+       "8   по состоянию на 01.02.2018 г.  тыс. рублей   \n",
+       "9   по состоянию на 01.02.2018 г.  тыс. рублей   \n",
+       "10  по состоянию на 01.02.2018 г.  тыс. рублей   \n",
+       "11  по состоянию на 01.02.2018 г.  тыс. рублей   \n",
+       "12  по состоянию на 01.02.2018 г.  тыс. рублей   \n",
+       "13  по состоянию на 01.02.2018 г.  тыс. рублей   \n",
+       "14  по состоянию на 01.02.2018 г.  тыс. рублей   \n",
+       "15  по состоянию на 01.02.2018 г.  тыс. рублей   \n",
+       "\n",
+       "                                                 поле  код строки  \\\n",
+       "0   Сумма списанной задолженности организаций, лик...        2400   \n",
+       "1   Сумма списанной задолженности индивидуальных п...        2405   \n",
+       "2   Сумма списанной задолженности умерших или объя...        2410   \n",
+       "3   Сумма списанной задолженности в случаях принят...        2415   \n",
+       "4   Сумма списанной задолженности по \"зависшим\" пл...        2420   \n",
+       "5   Сумма списанной задолженности организаций, отв...        2425   \n",
+       "6   Сумма списанной задолженности по решениям нало...        2430   \n",
+       "7   Сумма задолженности, списанной на  основании з...        2435   \n",
+       "8   Сумма списанной задолженности организаций, лик...        2400   \n",
+       "9   Сумма списанной задолженности индивидуальных п...        2405   \n",
+       "10  Сумма списанной задолженности умерших или объя...        2410   \n",
+       "11  Сумма списанной задолженности в случаях принят...        2415   \n",
+       "12  Сумма списанной задолженности по \"зависшим\" пл...        2420   \n",
+       "13  Сумма списанной задолженности организаций, отв...        2425   \n",
+       "14  Сумма списанной задолженности по решениям нало...        2430   \n",
+       "15  Сумма задолженности, списанной на  основании з...        2435   \n",
+       "\n",
+       "    кол. налогоплательщиков     всего  по налогу (сбору)   по пени  \\\n",
+       "0                      6302   8850836            4813849   1428282   \n",
+       "1                      3901    891751             515082    267015   \n",
+       "2                     12387    285449              45580     23315   \n",
+       "3                     19761    883355             327372    193665   \n",
+       "4                        46     17476              16940         9   \n",
+       "5                     11847   1198159             675557    308155   \n",
+       "6                        61        37                  1        31   \n",
+       "7                   1148327  40739221           21970735  12925353   \n",
+       "8                      2768   4066983            2314354    735408   \n",
+       "9                      3067     39999              21675     12298   \n",
+       "10                     5411    145804              25389     15249   \n",
+       "11                    14035    330592             101728     66280   \n",
+       "12                       27      7852               7744         0   \n",
+       "13                     4917    714015             394956    184775   \n",
+       "14                       14         2                  0         2   \n",
+       "15                    41695   5152573            2928511   1090182   \n",
+       "\n",
+       "    по штрафам проценты  по ЕСН  по страховым взносам  \n",
+       "0       385722   122790  249262               1850931  \n",
+       "1        59948        0   18923                 30783  \n",
+       "2         9378        0    2264                204912  \n",
+       "3        35799     5646   79245                241628  \n",
+       "4            0        0     527                     0  \n",
+       "5        82420        х   14139                117888  \n",
+       "6            5        0       0                     0  \n",
+       "7      3832251     4354  107461               1899067  \n",
+       "8       187148    39881   86601                703591  \n",
+       "9         3944        0     681                  1401  \n",
+       "10        6433        0    1198                 97535  \n",
+       "11        8424        8   13190                140962  \n",
+       "12           0        0     108                     0  \n",
+       "13       43302        х    7748                 83234  \n",
+       "14           0        0       0                     0  \n",
+       "15      258133     3456   36947                835344  "
+      ]
+     },
+     "execution_count": 16,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# пример как полностью настроить класс сразу при создании\n",
+    "proc = ExcelPreprocessor(\n",
+    "    'https://www.nalog.ru/html/sites/www.new.nalog.ru/docs/otchet/4nm010318.xlsx',\n",
+    "    'https://www.nalog.ru/html/sites/www.new.nalog.ru/docs/otchet/4NM/4nm010218.xlsx',\n",
+    "    filename_parser=lambda filename: {'filename': filename.split('/')[-1]},\n",
+    "    append_global_index=True, append_wb_index=True,\n",
+    "    cells = {'form_name': 'J1', 'description': 'A2', 'form_dt': 'A3', 'unit_name': 'J4'},\n",
+    "    headers = ['поле', 'код строки', 'кол. налогоплательщиков', 'всего', 'по налогу (сбору)', 'по пени', 'по штрафам', 'проценты', 'по ЕСН', 'по страховым взносам'],\n",
+    "    first_row_number=7, append_ws_title_column=True, iterate_over_worksheet=2\n",
+    ")\n",
+    "pd.DataFrame(proc.get_iter_dict())"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "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.8.2"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}