Логики сортировки и выбора строк c в Python на Sqlite db - PullRequest
1 голос
/ 07 мая 2020

привет Спасибо, что уделили время go моему вопросу. Я работаю с бюджетным пространством для небольшого города, и в это непростое время я изучаю некоторые python, которые, возможно, в будущем помогут мне с моделированием финансовых данных. В настоящее время мы используем SAP, но я также хотел выучить новый язык.

Мне нужны подсказки о том, где искать определенные ответы. например, я создал базу данных с несколькими миллионами записей, отсортированных по дате и времени. Я смог удалить данные, которые мне не нужны, и теперь у меня есть чистая база данных для работы

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

Date|time|dept|Value1
01/01/2019|11:00|BUD|51.00
01/01/2019|11:30|CSD|101.00
01/01/2019|11:50|BUD|102.00
01/02/2019|10:00|BUD|200.00
01/02/2019|10:31|BUD|201.00
01/02/2019|11:51|POL|400.00
01/03/2019|11:00|BUD|100.00
01/03/2019|11:30|PWD|101.00
01/03/2019|11:50|BUD|110.00

на основе приведенных выше данных и требований, я хочу получить результат

Date|time|dept|Value| Start Value
01/01/2019|11:50|BUD|102.00|51.00
01/02/2019|11:51|POL|400.00|200.00
01/03/2019|NONE|NONE|NONE|100.00

в день 3, там не было значений, которые были бы как минимум удвоены, поэтому у нас нет ни одного или нуля.

То, что я сделал до сих пор

Мне удалось подключиться к базе данных [python] 2. Я смог удалить ненужную информацию и данные из базы данных [sqlite] 3. Мне удалось создать новые таблицы для результата [Python]

Вопросы / лучшие практики

  1. Как получить первую строку в день. Могу ли я начать с переменной перед l oop, которая назначена 1 января 2019 года, а затем выбрать номер строки и сохранить его в другой таблице или какие еще варианты у нас есть здесь.
  2. После того, как первая строка за день будет сохранена / захвачена в другой таблице или массиве, как мне получить первое вхождение значения как минимум в два раза больше первой строки.

пример? метакод начала ***********

Start from Line 1 to end
table2.date[] Should be equal to 01/01/2019
table2.value[] Should be equal to 51.00
look through each line if date = table2.date and value >= 2* (table2.value[])
*if successful, get record line number and department and value and store in new table
else
goto next line

Then increase table2.date and table2.value by 1 and do the loop again. 

конец метакода *****************

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

Я, вероятно, смогу добавить условие выхода, если дата не равна table2.date [1], но я все еще не уверен, что это правильный способ решения этой проблемы. Это будет проводиться только один или два раза в год, поэтому производительность системы не так важна, но я все еще думаю о том, чтобы подойти к этому правильным путем.

Следует ли мне экспортировать окончательные данные в Excel для анализа или это хорошие инструменты моделирования анализа в Python. Что порекомендуют профессионалы?

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Вы можете использовать exists, чтобы проверить, существует ли другая запись в тот же день и со значением, которое в два раза больше, и оконные функции для фильтрации по верхней записи за день:

select *
from (
    select 
        t.*,
        row_number() over(partition by date order by time) rn
    from mytable t
    where exists (
        select 1 from mytable t1 where t1.date = t.date and t1.value = 2 * t.value
    )
) t
where rn = 1

In версии SQLite, где row_number() недоступен, другой вариант - фильтровать с помощью коррелированного подзапроса:

select t.*
from mytable t
where 
    exists(select 1 from mytable t1 where t1.date = t.date and t1.value = 2 * t.value)
    and t.time = (select min(t1.time) from mytable t1 where t1.date = t.date)
0 голосов
/ 08 мая 2020

Вы могли бы сделать это так, но вы правы, это займет много времени. Я не знаю, есть ли у SQLite возможности эффективно делать то, что вы хотите, но я знаю, что Python может. Похоже, вы могли бы захотеть использовать Python Библиотеку анализа данных, Pandas. Вы можете узнать, как поместить свой SQLite в Pandas здесь:

Как открыть и преобразовать базу данных sqlite в pandas фрейм данных

После того, как вы установили его в a Pandas Dataframe, существует множество функций для получения первого вхождения чего-либо, поиска дубликатов, поиска уникальных значений и даже создания других фреймов данных только с уникальными значениями.

...