Уведомления

Группа в Telegram: @pythonsu

#1 Июль 14, 2020 17:03:13

DenisDenis
Зарегистрирован: 2020-07-14
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Консолидация данных в Excel посредством Python

Всем добрый день!

После обработки данных получаю сводную таблицу, представленную ниже (1)

Подскажите, пожалуйста, каким образом/методом мне привести её с помощью Python (без типовых средств Excel “консолидация данных”) к следующему виду (2)

Спасибо!

Отредактировано DenisDenis (Июль 14, 2020 17:04:39)

Прикреплённый файлы:
attachment Сводная таблица.png (13,5 KБ)

Офлайн

#2 Июль 14, 2020 23:07:46

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9958
Репутация: +  856  -
Профиль   Отправить e-mail  

Консолидация данных в Excel посредством Python

DenisDenis
Подскажите, пожалуйста, каким образом/методом мне привести её с помощью Python
1. Сначала нужно прочитать из Excel-файла данные с помощью модуля xlrd и перевести их во внутренние данные питона.
2. Затем нужно преобразовать внутренние данные питона, сократив количество колонок в данных.
3. Затем нужно вывести преобразованные данные в новый Excel-файл с помощью модуля xlwt.

Чтобы преобразовывать внутренние данные питона из пункта 2, их частью должны быть и названия рядов, и названия колонок. Тогда можно будет таблицу любой размерности сжимать, а не только какой-то фиксированной размерности (4x4, как в данном случае).

Сделаешь ли ты сам всё это, не зная питона вообще? Думаю, нет.



Офлайн

#3 Июль 15, 2020 14:26:54

DenisDenis
Зарегистрирован: 2020-07-14
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Консолидация данных в Excel посредством Python

py.user.next, спасибо Вам за ответ!

Видимо я не совсем правильно сформулировал своё первое сообщение, попробую по-другому:

  • Есть несколько, схожих по структуре, документов Excel
  • С помощью python я проиндексировал основные части документов.
  • Вытянул данные в python и структурировал/провёл ряд преобразований по смыслу в виде списков, кортежей, словарей
Далее создаю сводную таблицу, результатом которой должна быть таблица (2) (во вложении).
Таблица 1 - это то промежуточное решение на котором мне пришлось остановится.
Чтобы достигнуть своего результата в виде таблицы (2) можно:
1. Забыть про python, и вручную, воспользовавшись встроенным механизмом Excel, “консолидировать данные” и в пару кликов мышкой привести к желаемому виду;
2. Воспользоваться уже разработанным на python, аналогичным “консолидация данных” Excel, методом, который я хотел бы уточнить у вас или участников форума, если таковой существует;
3. Доработать код, основываясь на других возможностях языка python. Возможно Вы подскажете фраймворк, как инструмент подходящий для решения подобных задач.

В п.2 и п.3 выделенное жирным цветом два вопроса к Вам



Офлайн

#4 Июль 15, 2020 14:31:06

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Консолидация данных в Excel посредством Python

4. Использовать средства автоматизации встроенные в Excel



Офлайн

#5 Июль 15, 2020 14:53:07

DenisDenis
Зарегистрирован: 2020-07-14
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Консолидация данных в Excel посредством Python

FishHook
т.е пункт 1 по сути, верно?
и это обусловлено тем, что в python нет удобных и оперативных, в частности, решений для таких задач?

Распространите свой ответ, немного, пожалуйста

Отредактировано DenisDenis (Июль 15, 2020 14:55:17)

Офлайн

#6 Июль 15, 2020 14:57:33

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Консолидация данных в Excel посредством Python

DenisDenis
т.е пункт 1 по сути, верно?
Не верно. Вы используете питон для автоматизации рутины в Excel-документах. Но в экселе есть свой механизм автоматизации - встроенный язык VBA, редактор и отладчик. У меня возникает стандартный вопрос, нахрена использовать питон вместо родного инструмента. Это и есть "инструмент подходящий для решения подобных задач" из вашего вопроса.



Офлайн

#7 Июль 15, 2020 15:10:36

DenisDenis
Зарегистрирован: 2020-07-14
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Консолидация данных в Excel посредством Python

Я вас понял. Так получилось, что подрядчик, внедряющий ПО, не смог закрыть весь необходимый функционал. Я начинающий в python, VBA не владею. Вот и получилась ситуация.

Последний и не закрытый вопрос: так можно ли выкрутиться без механизмов Excel и разобраться при помощи сугубо возможностей Python ? Скажите, пожалуйста.

Если есть, то я рад буду это изучить самостоятельно и нетривиально решить задачу) Это будет для меня лучшая помощь и поддержка!

Офлайн

#8 Июль 15, 2020 19:18:09

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Консолидация данных в Excel посредством Python

DenisDenis
После обработки данных получаю сводную таблицу
Извините я начну свою обычную песню. Если вы работаете в питоне то удобные и естественные методы и выглядят по питонячьи.

Например
У вас несколько слабо заполненных таблиц. Но таблица не есть естественная сущность в питоне. В нем родная" сущность словарь.
 tbl1 = {(1,1):1,(2,1):2}
tbl2 = {(1,2):3,(2,2):4,(3,2):4}
tbl3 = {(1,3):7,(2,4):8}
# тогда объединение в питоне одна строчка  но, обратите внимание результат не таблица а питоновский объект
tbl = tbl1 | tbl2 | tbl3

Те все делается также удобно как в экселе, но понятия совершенно другие.



Отредактировано doza_and (Июль 15, 2020 19:20:28)

Офлайн

#9 Июль 15, 2020 19:52:04

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

Консолидация данных в Excel посредством Python

DenisDenis
так можно ли выкрутиться без механизмов Excel и разобраться при помощи сугубо возможностей Python ?
Если сильно постараться, то можно.
py.user.next дал правильную последовательность действий и подсказал какие библиотеки можно применить. doza_and предложил один из вариантов объединения данных.
Пусть у тебя будет функция чтения строки из таблицы xls. Она пусть возвращает одну, указанную строку. Пусть будет ещё одна функция, которая из полученной строки умеет создавать словарь похожий на предложенный doza_and и возвращать этот словарь. Эта функция будет вызывать получение одной строки. Ещё одна функция будет вызывать функцию создания словаря из строки и сливать уже имеющийся (в начале работы пустой словарь) у него с полученным. Пусть в этой функции будет бесконечный цикл, который прервётся при получении пустого словаря. После завершения цикла вернёт сводный словарь. Таким макаром ты получишь словарь из которго можно будет создать таблицу xls. Данные в словаре уже будут готовы для сжатого вида таблицы, если грамотно подойти к созданию словаря из строки.

Офлайн

#10 Июль 16, 2020 02:11:40

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9958
Репутация: +  856  -
Профиль   Отправить e-mail  

Консолидация данных в Excel посредством Python

DenisDenis
Есть несколько, схожих по структуре, документов Excel
Это понятно. Даже если их не было бы, нужно было бы всё равно писать код для автоматизации этих действий так, как будто они появятся и будут любых размерностей, даже если они не появятся и размерность всегда будет одна.

Чем более общую программу ты пишешь, тем в большем числе задач ты можешь взять готовый код программы и применить его, лишь слегка переделав - то есть не писать код с нуля неделю, а поменять код за полчаса и получить готовый результат. Высшее мастерство - писать код программ настолько общим, что в любых будущих вероятных задачах его можно будет использовать сразу без доработки - то есть неписать код с нуля неделю, а поменять код за ноль минут и получить готовый результат. Это напоминает конструктор Lego: когда тебе нужно написать программу, ты из уже готовых программ, ранее написанных тобой (а при большем опыте (в плане лицензирования) и написанных другими), выбираешь подходящие большие куски кода, как кирпичи, и строишь из них совсем другое сооружение, на что уходит всего один день, а не один месяц.

Если же ты пишешь не общую программу, а конкретную, то это выглядит удобно на первый взгляд и кажется правильным. Только вот весь облом наступает тогда, когда вдруг тебе приходят таблицы новых размерностей, а ты написал код только для размерности 4x4. И тогда тебе нужно с нуля писать код для новой размерности. И потом у тебя два кода работают для разных размерностей. А вскоре появляется третья размерность и ты начинаешь проклинать себя за лень Потому что ты когда-то давно поленился написать общую программу, которая была бы одна и справлялась бы с любыми таблицами, какие бы они ни возникли в перспективе, а теперь ты мало того что время потерял на написание повторных программ, так ещё и это нужный результат не дало, так как риск появления новых размерностей всё так же остаётся, сколько бы ты конкретных программ ни написал.

DenisDenis
Таблица 1 - это то промежуточное решение на котором мне пришлось остановится.
Открою тебе секрет. Какие бы ты таблицы ни брал - начальная, промежуточная, конечная - в программировании они все считаются промежуточными. Всё это связано с тем, что любую из таблиц можно получить откуда угодно (хоть генерировать на лету) и любую из таблиц можно в любой момент преобразовать во что угодно (хоть в словесные фразы, хоть в изображения, хоть в звуки). Поэтому совершенно не важно, на каком этапе получена таблица. Любая таблица рассматривается как возникшая из ниоткуда и идущая дальше на вход куда угодно и зачем угодно.

DenisDenis
Чтобы достигнуть своего результата в виде таблицы (2) можно:
1. Забыть про python, и вручную, воспользовавшись встроенным механизмом Excel, “консолидировать данные” и в пару кликов мышкой привести к желаемому виду;
2. Воспользоваться уже разработанным на python, аналогичным “консолидация данных” Excel, методом, который я хотел бы уточнить у вас или участников форума, если таковой существует;
3. Доработать код, основываясь на других возможностях языка python. Возможно Вы подскажете фраймворк, как инструмент подходящий для решения подобных задач.
Если забыть про питон и использовать встроенный механизм Excel, а потом кликать мышкой, что будет. 1) Когда-то возникнет задача, которую Excel не сможет решить из-за отсутствия встроенных средств. 2) Когда-то поток в один-два-десять файлов в неделю превратится в поток в одну тысячу/пять тысяч/десять тысяч файлов в день. Как думаешь, что произойдёт с мышконажимателем, будь он даже настоящим коммунистом? Он просто физически по времени не сможет их обработать.
А что может питон? Питон может и любые задачи решать, и может решать их сам, не требуя наличия человека во всём этом процессе. К тому же, если ты всё-таки разместишь это всё на каком-нибудь компьютере в Интернете (как это всё обычно делается в распределённых архитектурах), то вряд ли там будет Excel, потому что Excel сделан для человеков, сидящих за одним компьютером, а питон сделан для компьютеров, которые могут распределять работу между собой.

Так что я против VBA в Excel в данном случае и вообще, хотя вроде на первый взгляд твоя задача очень близко к VBA расположена. Почему не VBA? Потому что VBA - это максимум разгрузка человека, который там на кнопки нажимает, и нахождение в пределах сисадминских правил, которые у тебя в организации определены (запрещено ставить питон там и тому подобное; бывают также изолированные сети, которые вообще не подключены к Интернету, а для питона он нужен, потому что часто ты хочешь что-то использовать в питоне, пытаешься это сделать, а этого нет, потому что оно не установлено).

По поводу того, есть ли в питоне великий метод консолидации из Excel'я. Все эти умнейшие методы Excel'я - это такая мелочь по сравнению с возможностями питона, что об этом говорить даже не стоит. Питон может в сто раз больше, чем Excel в плане всего (математика, анализ, преобразования и прочее). Поэтому ты можешь написать эту консолидацию (и даже лучше, чем эта консолидация) на питоне и менять её как угодно, тогда как в Excel'е ты должен изучать, что там Excel тебе предложить из своего ассортимента.

В плане того, как это написать и есть ли фреймворк. Ты можешь написать это без фреймворка (чтобы не создавать зависимость твоей программы от наличия или отсутствия фреймворка правильной версии и тому подобного). Также ты можешь использовать фреймворк типа pandas, но будь готов его изучать. Далеко не всегда фреймворки пишут такие же классные ребята, как те, которые пишут питон, где всё легко, просто и понятно (документация есть подробная и только по делу, стиль хороший типа PEP8 и тому подобное). Во фреймворке может быть и херовая документация, потому что человек два слова связать не может в жизни, зато он код программы хорошо пишет; и интерфейсы у фреймворка могут быть дебильные, когда функции называют бредово и не поймёшь где какая функция, вызываются нелогично, какие-то вещи не параметризованы и из-за этого тебе функция навязывает свою хрень, которую ты поменять не можешь через параметр, как это обычно принято закладывать при проектировании функции; и сдохнуть этот фреймворк может или куда-то пойти не в ту сторону во времени, что придётся от него потом отказываться, хотя ты там его изучал хрен знает сколько времени со всеми его выпендрёжами. Вот так привязываешься к какому-нибудь Django, а он тебе потом говорит “а я третий питон не хочу, буду на втором и, может быть, когда-нибудь буду на третьем”, а тебе-то третий питон нужен прямо сейчас, потому что он почищен хорошо от разных косяков, в то время как на втором питоне надой фигнёй всякой страдать вечно. И из-за фреймворка ты не можешь слезть со второго питона, например. Вот это связь, зависимость. Ты привязал программу к фреймворку, а потом не можешь программу двигать дальше, делать её современной, потому что фреймворк её тянет в прошлое. И отвязать ты её не можешь от фреймворка, потому что много кода написано, завязанного на фреймворк.

Так что думай, отвязывайся от Excel'я при первой же возможности. Он тебя тянет в прошлое - клики какие-то там мышкой, консолидации немногочисленные и ограничение у него ещё в таблицах на количество строк в размере около 30000 в наше-то время, когда уже миллиарды строк пришли (большие данные).



Отредактировано py.user.next (Июль 16, 2020 02:21:10)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version