driveman
Июль 17, 2018 08:37:19
Доброго времени суток всем.
Есть список массивов одинаковой длины
Элемент каждого массива может принимать значения от 0 до 500
Необходимо обработать эти данные следующим образом:
1) Определить количество элементов этих массивов в разрезе интервалов длиной например, 50 единиц. То есть, вычислить, сколько элементов из всего списка массивов попадает в интервалы:
- от 0 до 50;
- от 51 до 100;
- от 101 до 150
…
и так далее, по последнего интервала от 451 до 500 включительно.
2) Немного усложненный вариант - то же, что и в п.1, но вычислить по группам интервалов. Например, общее количество элементов, попадающих в интервалы, отстоящие друг от друга на 100:
- 0-50, 101-150, 201-250 и т.д. до 401-450
- 51-100, 151-200, 251-300 и т.д. до 451-500
В принципе, задачу можно решить выборочным суммированием данных из результатов вычислений п.1
3) Определить, есть ли закономерности распределения элементов массивов по интервалам. То есть, встречаются ли элементы с определенным индексом чаще в определенных интервалах или же элементы по интервалам распределяются случайным образом.
На первый взгляд все это можно выяснить с помощью SQL запросов. Например, с помощью sqlite, возможность работы с которым есть в стандартной поставке python. Хотелось бы обойтись пакетами из стандартной поставки, не добавляя какие-то еще библиотеки.
Всвязи с этим вопросы:
1) Насколько DataFrame из pandas может облегчить/ускорить выполнение этих задач или проще поместить эти данные в реляционную БД и обойтись SQL запросами.
2) Каковы вообще преимущества DataFrame перед реляционными БД кроме того, что из DataFrame можно легко строить диаграммы в matplotlib?
doza_and
Июль 17, 2018 16:52:39
driveman
- от 0 до 50;
- от 51 до 100;
А элементы от 50 до 51 выкидывать? :)
driveman
Насколько DataFrame из pandas может облегчить/ускорить выполнение этих задач или проще поместить эти данные в реляционную БД и обойтись SQL запросами.
Вы не привели данных которые позволят это оценить. Сколько этих массивов? Насколько критично по времени быстрое выполнение операции. Насколько вы хорошо знаете sql, pandas? Надо было привести ваши решения для этих двух вариантов.
На мой взгляд для решения этой задачи ни pandas ни mysql не нужны вообще.
from collections import Counter
a=[3, 430.2, 55, ...]
print(Counter([int(i/50) for i in a]))
Если нужна производительность то тоже самое можно сделать с numpy
driveman
2) Каковы вообще преимущества DataFrame перед реляционными БД
https://habr.com/post/279213/pandas включает в себя sql и следовательно возможностей с pandas у вас гарантировано больше чем с sql :)
Многие будут утверждать что синтаксис pandas более лаконичен. Но предпочтительный синтаксис это дело вкуса.
На мой взгляд принципиальное ограничение sql - работа с двумерными таблицами. В питоне без проблем можно работать с произвольными многомерными таблицами.
driveman
Июль 17, 2018 19:24:05
doza_and
А элементы от 50 до 51 выкидывать?
Ну хорошо, не подумал, действительно, от 50 до 100, от 100 до 150 и так далее
doza_and
Вы не привели данных которые позволят это оценить. Сколько этих массивов? Насколько критично по времени быстрое выполнение операции. Насколько вы хорошо знаете sql, pandas?
Массивов в списке может быть от нескольких десятков до нескольких сотен. Элементов в каждом массиве - 10.
Время не сильно критично, но хотелось бы, чтобы все три задачи вычислялись бы за нескольких секунд.
SQL знаю настолько, что за полчаса нужные запросы напишу. Pandas практически не знаю.
В общем, по-видимому, без pandas пока можно обойтись.
doza_and
Июль 17, 2018 22:54:51
driveman
В общем, по-видимому, без pandas пока можно обойтись.
Вы похоже правы можно обойтись без pandas.
И без SQL тоже.
На мой взгляд решение на чистом питоне проще чем на SQL. Тут не пол часа писать а полагаю пару минут. Покажите ваш SQL + python который будет решать эти задачи. Тогда можно будет сравнить.
driveman
Июль 18, 2018 12:15:14
Подумал-подумал, и признаю, что решение на sql будет гораздо более громоздким, чем на чистом python.
Для SQL ведь надо:
1) Создать БД, и таблицу, прописав все ее поля (наименование, тип)
2) Запросами на вставку записать в таблицу данные.
И только тогда можно будет делать запросы на извлечение данных
А в конце еще надо не забыть закрыть соединение с БД и курсор
Полезного кода, который занимается собственно анализом (сами запросы типа “SELECT … FROM… GROUP BY…”) тогда будет процентов 30 от всего кода, необходимого для работы с БД.