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

commit 7053684046a211d43aa6c50118997d9dfa58e3be

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

date 2020-04-02 14:33:12 +0300

parents 8cf6323b

browse tree at this commit

message

новый функционал для excel препроцессора, пока не работает rar и *.xls

files

fileadddel
ExcelPreporcessor.ipynb => ExcelPreprocessor.ipynb+261-595

patch

diff --git a/ExcelPreporcessor.ipynb b/ExcelPreprocessor.ipynb
rename from ExcelPreporcessor.ipynb
rename to ExcelPreprocessor.ipynb
index 9c56945158686c16b8a2cc8f7155010741618261..fa3fe7e564758f134ab02415dc2617b951626194 100644
--- a/ExcelPreporcessor.ipynb
+++ b/ExcelPreprocessor.ipynb
@@ -46,9 +46,10 @@       "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: rarfile in c:\\dev\\.jupyter\\.venv\\lib\\site-packages (3.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: numpy>=1.13.3 in c:\\dev\\.jupyter\\.venv\\lib\\site-packages (from pandas) (1.18.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"
@@ -56,12 +57,12 @@      ]
     }
    ],
    "source": [
-    "!pip install pandas openpyxl xlrd chardet"
+    "!pip install pandas openpyxl xlrd chardet rarfile"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -73,6 +74,7 @@     "from itertools import islice\n",
     "from collections.abc import Iterable\n",
     "from urllib.parse import urlparse\n",
     "from urllib.request import urlopen\n",
+    "from pathlib import Path\n",
     "\n",
     "import pandas as pd\n",
     "import openpyxl"
@@ -87,14 +89,14 @@    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 13,
+   "execution_count": 3,
    "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",
+    "                 iterate_over_worksheet=0, cells=None, headers=None, in_archive_re_mask=None):\n",
     "        '''\n",
     "        параметр iterate_over_worksheet отвечает за то, какой именно рабочий лист в каждой прочитанной\n",
     "        книге будет разобран по умолчанию это лист с индексом 0, т.е. 1 в списке.\n",
@@ -119,6 +121,7 @@     "        self.first_row_number = first_row_number\n",
     "        self.iterate_over_worksheet = iterate_over_worksheet\n",
     "        self.cells = cells\n",
     "        self.headers = headers\n",
+    "        self.in_archive_re_mask = in_archive_re_mask\n",
     "\n",
     "    def __repr__(self):\n",
     "        return f'''{ExcelPreprocessor.__name__}{self.wb}:\n",
@@ -153,13 +156,27 @@     "                from zipfile import ZipFile\n",
     "                import chardet\n",
     "                ZIP_FILENAME_UTF8_FLAG = 0x800\n",
     "                zf = ZipFile(rf , 'r')\n",
+    "                print(filename)\n",
     "                for info in zf.filelist:\n",
-    "                    filename = info.filename\n",
+    "                    zfilename = info.filename\n",
+    "                    if not zfilename.endswith('.xlsx'):\n",
+    "                        continue\n",
     "                    if info.flag_bits & ZIP_FILENAME_UTF8_FLAG == 0:\n",
-    "                        filename_bytes = filename.encode('437')\n",
+    "                        filename_bytes = zfilename.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",
+    "                        zfilename = filename_bytes.decode(guessed_encoding, 'replace')\n",
+    "                        if self.in_archive_re_mask:\n",
+    "                            if not re.match(self.in_archive_re_mask, zfilename):\n",
+    "                                continue\n",
+    "                        yield str(Path(filename) / Path(zfilename)), zf.open(info.filename, 'r')\n",
+    "\n",
+    "            if filename.endswith('.rar'):\n",
+    "                from rarfile import RarFile\n",
+    "                rf = rarfile.RarFile(rar_fn, 'r')\n",
+    "                for f in rf.infolist():\n",
+    "                    print(f.filename, f.file_size)\n",
+    "                    if f.filename == 'README':\n",
+    "                        print(rf.read(f))\n",
     "\n",
     "    @property\n",
     "    def _columns(self):\n",
@@ -180,7 +197,7 @@     "        return columns\n",
     "\n",
     "    def _iter_over_rows(self):\n",
     "        'итерация по общей последовательности строк в итоговом наборе'\n",
-    "        \n",
+    "\n",
     "        row_counter = 0\n",
     "\n",
     "        for fn, excel_file in self._process_files:\n",
@@ -188,10 +205,10 @@     "            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",
+    "            elif isinstance(self.iterate_over_worksheet, list) or isinstance(self.iterate_over_worksheet, tuple):\n",
     "                iter_sheet = self.iterate_over_worksheet\n",
     "            else:\n",
-    "                iter_sheet = [i for i, ws in enumerate(ws.worksheets)]\n",
+    "                iter_sheet = [i for i, ws in enumerate(wb.worksheets) if not ws.title.startswith('hidden')]\n",
     "\n",
     "            for ws_index in iter_sheet:\n",
     "                ws = wb.worksheets[ws_index]\n",
@@ -217,15 +234,29 @@     "                    row_counter += 1\n",
     "\n",
     "    def get_dataframe(self):\n",
     "        'возвращает набор данных в виде pandas DataFrame'\n",
-    "        return pd.DataFrame({'hello': []})\n",
+    "        data = ([val for col, val in zip(self._columns, row)] for row in self._iter_over_rows())\n",
+    "        return pd.DataFrame(data, columns=self._columns)\n",
     "\n",
-    "    def write_csv(self, csv_filename):\n",
-    "        'записывает набор данных в файл csv'\n",
-    "        return None\n",
+    "    def write_csv(self, csv_filename, write_header=True, dialect='excel', **fmtparams):\n",
+    "        '''\n",
+    "        записывает набор данных в файл csv, входные параметры такие же как у метода csv.writer\n",
+    "        https://docs.python.org/3/library/csv.html\n",
+    "        '''\n",
+    "        import csv\n",
+    "        with open(csv_filename, 'w', encoding='utf8') as wf:\n",
+    "            writer = csv.writer(wf, dialect, **fmtparams)\n",
+    "            writer.writerow(self._columns)\n",
+    "            writer.writerows(self._iter_over_rows())\n",
     "\n",
-    "    def write_excel(excel_filename):\n",
+    "    def write_excel(self, excel_filename):\n",
     "        'записывает набор данных в файл excel'\n",
-    "        return None\n",
+    "        from openpyxl import Workbook\n",
+    "        wb = Workbook(write_only=True)\n",
+    "        ws = wb.create_sheet()\n",
+    "        ws.append(self._columns)\n",
+    "        for row in self._iter_over_rows():\n",
+    "            ws.append(row)\n",
+    "        wb.save(excel_filename)\n",
     "\n",
     "    def get_iter_dict(self):\n",
     "        'возвращает набор данных в виде итератора словарей'\n",
@@ -237,13 +268,18 @@     "    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",
+    "        nt = namedtuple(\"Row\", [re.sub(r\"[\\. \\(\\)]\", \"_\", c).lower() 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)]"
+    "        return [list(row) for row in islice(self._iter_over_rows(), start, stop)]\n",
+    "    \n",
+    "    def get_sample_dataframe(self, start, stop) -> pd.DataFrame:\n",
+    "        'возвращает сэмпл итогового набора в виде DataFrame'\n",
+    "        data = ([val for col, val in zip(self._columns, row)] for row in islice(self._iter_over_rows(), start, stop))\n",
+    "        return pd.DataFrame(data, columns=self._columns)"
    ]
   },
   {
@@ -435,7 +471,7 @@    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": 13,
    "metadata": {},
    "outputs": [
     {
@@ -489,15 +525,15 @@        "      <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",
+       "      <td>1005</td>\n",
+       "      <td>1235462116</td>\n",
+       "      <td>613079956</td>\n",
+       "      <td>137068882</td>\n",
+       "      <td>16509931</td>\n",
+       "      <td>378521695</td>\n",
+       "      <td>377407864</td>\n",
+       "      <td>7475610</td>\n",
+       "      <td>7001696</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>1</th>\n",
@@ -509,15 +545,15 @@        "      <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",
+       "      <td>1010</td>\n",
+       "      <td>966783423</td>\n",
+       "      <td>470685208</td>\n",
+       "      <td>102647180</td>\n",
+       "      <td>12435295</td>\n",
+       "      <td>293731518</td>\n",
+       "      <td>292643494</td>\n",
+       "      <td>6239798</td>\n",
+       "      <td>6015450</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>2</th>\n",
@@ -529,15 +565,15 @@        "      <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",
+       "      <td>1011</td>\n",
+       "      <td>59789575</td>\n",
+       "      <td>45827009</td>\n",
+       "      <td>6993023</td>\n",
+       "      <td>772092</td>\n",
+       "      <td>33088224</td>\n",
+       "      <td>32865309</td>\n",
+       "      <td>70488</td>\n",
+       "      <td>41193</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>3</th>\n",
@@ -549,15 +585,15 @@        "      <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",
+       "      <td>1020</td>\n",
+       "      <td>738863445</td>\n",
+       "      <td>350780985</td>\n",
+       "      <td>76405303</td>\n",
+       "      <td>9214666</td>\n",
+       "      <td>221615329</td>\n",
+       "      <td>220703752</td>\n",
+       "      <td>5920609</td>\n",
+       "      <td>5756088</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>4</th>\n",
@@ -569,15 +605,15 @@        "      <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",
+       "      <td>1030</td>\n",
+       "      <td>105337216</td>\n",
+       "      <td>68231581</td>\n",
+       "      <td>16344932</td>\n",
+       "      <td>1759494</td>\n",
+       "      <td>47161217</td>\n",
+       "      <td>47056987</td>\n",
+       "      <td>36418</td>\n",
+       "      <td>27229</td>\n",
        "    </tr>\n",
        "  </tbody>\n",
        "</table>\n",
@@ -599,40 +635,40 @@        "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",
+       "0  ЗАДОЛЖЕННОСТЬ - ВСЕГО (стр.1010+стр.1045+стр.1...        1005   \n",
+       "1  ЗАДОЛЖЕННОСТЬ ПЕРЕД БЮДЖЕТОМ ПО НАЛОГАМ, СБОРА...        1010   \n",
+       "2  из нее\\nзадолженность, невозможная к взысканию...        1011   \n",
+       "3                                           НЕДОИМКА        1020   \n",
+       "4  \\nИз строки 1020\\nНЕДОИМКА ОРГАНИЗАЦИЙ И ИНДИВ...        1030   \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",
+       "0               1235462116  613079956          137068882  16509931   \n",
+       "1                966783423  470685208          102647180  12435295   \n",
+       "2                 59789575   45827009            6993023    772092   \n",
+       "3                738863445  350780985           76405303   9214666   \n",
+       "4                105337216   68231581           16344932   1759494   \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  "
+       "   по штрафам   проценты   по ЕСН  по страховым взносам  \n",
+       "0   378521695  377407864  7475610               7001696  \n",
+       "1   293731518  292643494  6239798               6015450  \n",
+       "2    33088224   32865309    70488                 41193  \n",
+       "3   221615329  220703752  5920609               5756088  \n",
+       "4    47161217   47056987    36418                 27229  "
       ]
      },
-     "execution_count": 11,
+     "execution_count": 13,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
     "# попробуем то же самое в виде DataFrame\n",
-    "pd.DataFrame(processor.get_iter_dict())[:5]"
+    "processor.get_sample_dataframe(0, 5)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": 14,
    "metadata": {},
    "outputs": [
     {
@@ -909,534 +945,166 @@        "      <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>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.02.2018 г.</td>\n",
+       "      <td>по состоянию на 01.11.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>107516</td>\n",
+       "      <td>1397855</td>\n",
+       "      <td>318751</td>\n",
+       "      <td>93790</td>\n",
+       "      <td>17866</td>\n",
        "      <td>0</td>\n",
-       "      <td>1198</td>\n",
-       "      <td>97535</td>\n",
+       "      <td>8821</td>\n",
+       "      <td>958627</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>11</th>\n",
        "      <td>11</td>\n",
        "      <td>3</td>\n",
-       "      <td>4nm010218.xlsx</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.02.2018 г.</td>\n",
+       "      <td>по состоянию на 01.11.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",
+       "      <td>152898</td>\n",
+       "      <td>5175662</td>\n",
+       "      <td>1879757</td>\n",
+       "      <td>1448942</td>\n",
+       "      <td>185201</td>\n",
+       "      <td>6911</td>\n",
+       "      <td>255959</td>\n",
+       "      <td>1398892</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>12</th>\n",
        "      <td>12</td>\n",
        "      <td>4</td>\n",
-       "      <td>4nm010218.xlsx</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.02.2018 г.</td>\n",
+       "      <td>по состоянию на 01.11.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>165</td>\n",
+       "      <td>79701</td>\n",
+       "      <td>64933</td>\n",
+       "      <td>1515</td>\n",
+       "      <td>70</td>\n",
        "      <td>0</td>\n",
+       "      <td>5565</td>\n",
+       "      <td>7618</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>13</th>\n",
        "      <td>13</td>\n",
        "      <td>5</td>\n",
-       "      <td>4nm010218.xlsx</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.02.2018 г.</td>\n",
+       "      <td>по состоянию на 01.11.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>40759</td>\n",
+       "      <td>7379705</td>\n",
+       "      <td>4476555</td>\n",
+       "      <td>1843784</td>\n",
+       "      <td>437216</td>\n",
        "      <td>х</td>\n",
-       "      <td>7748</td>\n",
-       "      <td>83234</td>\n",
+       "      <td>73047</td>\n",
+       "      <td>549103</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>14</th>\n",
        "      <td>14</td>\n",
        "      <td>6</td>\n",
-       "      <td>4nm010218.xlsx</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.02.2018 г.</td>\n",
+       "      <td>по состоянию на 01.11.2018 г.</td>\n",
        "      <td>тыс. рублей</td>\n",
        "      <td>Сумма списанной задолженности по решениям нало...</td>\n",
        "      <td>2430</td>\n",
-       "      <td>14</td>\n",
-       "      <td>2</td>\n",
+       "      <td>16980357</td>\n",
+       "      <td>61711637</td>\n",
+       "      <td>42232603</td>\n",
+       "      <td>19477495</td>\n",
+       "      <td>676</td>\n",
+       "      <td>725</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",
+       "      <td>138</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>15</th>\n",
        "      <td>15</td>\n",
        "      <td>7</td>\n",
-       "      <td>4nm010218.xlsx</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.02.2018 г.</td>\n",
+       "      <td>по состоянию на 01.11.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",
+       "      <td>3737334</td>\n",
+       "      <td>340440384</td>\n",
+       "      <td>62488024</td>\n",
+       "      <td>31036806</td>\n",
+       "      <td>7336091</td>\n",
+       "      <td>34915</td>\n",
+       "      <td>2494914</td>\n",
+       "      <td>237049634</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",
+       "    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",
+       "10            10         2  2008  4nm011118      xlsx  Р. Справочно1_Списание   \n",
+       "11            11         3  2008  4nm011118      xlsx  Р. Справочно1_Списание   \n",
+       "12            12         4  2008  4nm011118      xlsx  Р. Справочно1_Списание   \n",
+       "13            13         5  2008  4nm011118      xlsx  Р. Справочно1_Списание   \n",
+       "14            14         6  2008  4nm011118      xlsx  Р. Справочно1_Списание   \n",
+       "15            15         7  2008  4nm011118      xlsx  Р. Справочно1_Списание   \n",
        "\n",
        "       form_name                                        description  \\\n",
        "0   Форма № 4-НМ  Справочно к Разделам I, II:      1_Списано зад...   \n",
@@ -1457,22 +1125,22 @@        "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",
+       "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",
+       "10  по состоянию на 01.11.2018 г.  тыс. рублей   \n",
+       "11  по состоянию на 01.11.2018 г.  тыс. рублей   \n",
+       "12  по состоянию на 01.11.2018 г.  тыс. рублей   \n",
+       "13  по состоянию на 01.11.2018 г.  тыс. рублей   \n",
+       "14  по состоянию на 01.11.2018 г.  тыс. рублей   \n",
+       "15  по состоянию на 01.11.2018 г.  тыс. рублей   \n",
        "\n",
        "                                                 поле  код строки  \\\n",
        "0   Сумма списанной задолженности организаций, лик...        2400   \n",
@@ -1492,60 +1160,58 @@        "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",
+       "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",
+       "10                   107516    1397855             318751     93790   \n",
+       "11                   152898    5175662            1879757   1448942   \n",
+       "12                      165      79701              64933      1515   \n",
+       "13                    40759    7379705            4476555   1843784   \n",
+       "14                 16980357   61711637           42232603  19477495   \n",
+       "15                  3737334  340440384           62488024  31036806   \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  "
+       "    по штрафам проценты   по ЕСН  по страховым взносам  \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  \n",
+       "10       17866        0     8821                958627  \n",
+       "11      185201     6911   255959               1398892  \n",
+       "12          70        0     5565                  7618  \n",
+       "13      437216        х    73047                549103  \n",
+       "14         676      725        0                   138  \n",
+       "15     7336091    34915  2494914             237049634  "
       ]
      },
-     "execution_count": 16,
+     "execution_count": 14,
      "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",
+    "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())"
+    "proc.get_dataframe()"
    ]
   }
  ],