Как сравнить ячейки из разных строк в одном проекте в OpenRefine

У меня есть набор данных со столбцом с именем START, содержащим значения даты.

Есть ли способ сравнить START значение строки со всеми другими START значениями внутри проекта?

Я хочу создать новый столбец с таким сообщением "Rows n° x,y,...,z contains greater START values".

Я пробовал следующее, используя функцию "cell.cross" для сравнения двух проектов (фактически один и тот же проект), но, похоже, это слишком ресурсоемко и требует много времени:

1. create a new column COMPARE with a fixed value
2. use "cell.cross" function against column COMPARE to import in every row all the START values of the project, collapsed in a new column named ALL_START_VALUES
3. compare START value against the array in ALL_START_VALUES and generate log

Жаль, мой проект на 200 тыс. Строк зависает на шаге 2.

Вот что я хотел бы получить:

СТРОКА | СТАРТ | БРЕВНО

0 | 2019-01- 01 T00: 00: 00Z | Строки №1,2 содержат большие значения START.

1 | 2019-01- 02 T00: 00: 00Z | Строки № 2 содержат большие значения START.

2 | 2019-01- 03 T00: 00: 00Z |


person Matteo Zuani    schedule 24.09.2019    source источник


Ответы (3)


Если я правильно понял, ваш шаг 2 включает создание проекта, содержащего 200 000 ячеек, содержащих по 200 000 элементов каждая, т.е. 200 000 ^ 2 = 40 миллиардов элементов ‹- это слишком много для OpenRefine.

Затем вам нужно будет провести еще 40 миллиардов вычислений, чтобы сравнить каждую из ваших 200 000 свиданий с другими 200 000. Из расчета 1 миллисекунда на расчет это составит 1111 часов расчетов, или 462 дня ...

Вам определенно понадобится другой инструмент, кроме OpenRefine (пример на Python). И в любом случае вам нужно будет разработать методику уменьшения количества сравнений. Наиболее распространенным в этом случае является блокировка. Он заключается в сравнении только значений, которые уже достаточно близки (например, только даты с одним и тем же годом). Но сложно предложить стратегию, не зная своих данных.

person Ettore Rizza    schedule 24.09.2019

OpenRefine - это мощный инструмент для очистки данных, который может импортировать и экспортировать табличные данные из баз данных, но сам по себе не является базой данных.

Если вы хотите проверить значения в столбце, который содержит даты, текст или что-то еще, вы можете применить различные аспекты, используя меню столбца. Как говорит Этторе, у вас могут возникнуть проблемы, если набор данных, с которым вы работаете, состоит из миллионов или миллиардов строк (это может занять много оперативной памяти, выделенной для OpenRefine).

Ваш вариант использования может быть ближе к тому, чтобы база данных поддерживала функции. В мире СУБД я бы предложил PostgreSQL. https://www.postgresql.org/docs/9.6/plpgsql.html

person Thad Guidry    schedule 24.09.2019

OpenRefine нелегко поддерживает операции, которые работают между несколькими строками. Вы можете использовать режим «Записи», чтобы добиться этого в определенной степени, но у вас возникнут проблемы с производительностью, если вы попытаетесь создать запись, содержащую 200 тыс. Строк.

Поэтому я подозреваю, что OpenRefine - не лучший инструмент для решения этой проблемы.

С точки зрения того, как вы на самом деле подходите к проблеме в целом - кажется, что это действительно проблема «сортировки» - если вы сортируете строки на основе даты в столбце START, тогда каждая строка ниже, содержащая больше или равную дату начала. Оттуда было бы достаточно легко сгенерировать нужные вам операторы в столбце LOG - работая по столбцу START, вам просто нужно найти первую строку, которая содержит более позднюю дату, а затем вы знаете, что все строки под ней также содержат более позднюю дату. Дата. (Я вижу способ сделать это в OpenRefine, но это довольно сложно - я не думаю, что это лучшее решение)

Надеюсь, это поможет

person Owen Stephens    schedule 25.09.2019