Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 03.03.2022
Сообщений: 4

Как минимизировать алгоритмическую сложность запроса к данным?

03.03.2022, 21:21. Показов 1029. Ответов 7

Студворк — интернет-сервис помощи студентам
Изучаю питон и не могу разобраться.

Вот примерный датасет
Python
1
2
3
4
5
import pandas as pd 
 
df = pd.DataFrame({'Name':['tom', 'bob', 'bob', 'jack', 'jack', 'jack'], 'Date':["01.02.2022", "02.02.2022", "03.02.2022", "01.02.2022", "03.02.2022", "05.02.2022"]})
# На самом деле, данные считываются из CSV файла
# Для упрощения, только даты, без времени
В нем список "транзакций".

Задачи следующие:
1. Вывести количество клиентов

Я решаю это так
Code
1
2
customers = df.Name.unique()
num_clients = len(customers)
2. Для каждого из клиента вывести длительность между первой и последней транзакцией

Тут вообще не могу представить, как это сделать правильно. В голову лезут циклы, но работа с циклами и pandas ощущается совсем неправильным.

Возникают вопросы:
  1. Как сделать запрос к данным, если их может быть тысячи или даже миллионы?
  2. Как можно оптимизировать запросы по памяти или времени выполнения?
  3. Можно такое сделать в SQL?
Будет ещё один вопрос касательно выбора по условию, но для начала хочется с этим разобраться.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.03.2022, 21:21
Ответы с готовыми решениями:

Оценить алгоритмическую сложность функции
Здравствуйте помогите оценить алгоритмическую сложность функции: double root2 (double quadrat) { double x = 0; ...

Минимизировать функции по картам Карно и найти сложность по Квайну, а также найти минимальную сумму
Помогите пожалуйста решить задачу. Нужно минимизировать функции по картам Карно и найти сложность по Квайну, а также найти минимальную...

Как обратиться к данным, полученным из запроса к БД
Здравствуйте. такая проблема, я делаю запрос на поиск записи в БД Access. Как обратиться к результату запроса, т.е. если *найдена строка* -...

7
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
03.03.2022, 22:53
tupsupuste,
2. Для каждого из клиента вывести длительность между первой и последней транзакцией
Как вариант:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import pandas as pd
import numpy as np
 
df = pd.DataFrame({'Name':['tom', 'bob', 'bob', 'jack', 'jack', 'jack'], 'Date':["01.02.2022", "02.02.2022", "03.02.2022", "01.02.2022", "03.02.2022", "05.02.2022"]})
 
df.Date = pd.to_datetime(df.Date, format='%d.%m.%Y')
df['id'] = df.groupby('Name').cumcount() + 1
print(df)
 
df1 = df.set_index(['Name', 'id'])
df1 = df1.unstack(level=-1)
df1.fillna(method = 'ffill', axis=0, inplace=True)
df1.fillna(method = 'ffill', axis=1, inplace=True)
print(df1)
 
df1['time'] = (df1.iloc[:,-1] - df1.iloc[:,0]).dt.days
df1 = df1.time
print(df1)
3
1 / 1 / 0
Регистрация: 03.03.2022
Сообщений: 4
04.03.2022, 11:21  [ТС]
Gdez, Спасибо большое, что откликнулись. Наверное я неточно объяснил суть. Сейчас постараюсь расписать подробнее.

В данном примере есть 3 клиента: tom, bob, jack.
tom был клиентом только один день - 01.02.2022
bob - два дня 02.02.2022 и 03.02.2022
jack - три дня, но не сподряд 01.02.2022, 03.02.2022, 05.02.2022

Что я ожидаю получить в этом случае:
tom 1
bob 2
jack 5

У jack 4 потому что самая ранняя транзакция у него первого числа, а последняя - пятого. По сути, алгоритм
Python
1
customer.date.max()-customer.date.min() + 1 # Можно и без +1, это не так важно
для каждого клиента тут будет работать. Но вопрос и заключается в том, как сделать это правильно. Если я буду получать всех customer через цикл и добавлять к результирующему dataframe, я чувствую, что это совсем неправильно.
0
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
04.03.2022, 11:22
tupsupuste, в принципе без проблем - "перепиши" 16-ю строчку через np.where, где "обрисуй все условия либо явно, либо через функцию...
0
1 / 1 / 0
Регистрация: 03.03.2022
Сообщений: 4
04.03.2022, 12:12  [ТС]
Gdez, ещё большее спасибо, что не написали просто ответ кодом

У меня цель не получить результат, а научиться решать такого рода задачи. Вдохновленный вашим кодом, я получил вот что

Python
1
2
3
4
5
6
7
8
9
10
import pandas as pd
import numpy as np
 
df = pd.DataFrame({'Name':['tom', 'bob', 'bob', 'jack', 'jack', 'jack'], 'Date':["01.02.2022", "02.02.2022", "03.02.2022", "01.02.2022", "03.02.2022", "05.02.2022"]})
 
df.Date = pd.to_datetime(df.Date, format='%d.%m.%Y')
 
mins = df.groupby("Name").min()
maxes = df.groupby("Name").max()
diff = maxes.Date - mins.Date
Возникает вопрос. Как можно объединить 8, 9 и 10 строки в один groupby?
0
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
04.03.2022, 12:57
tupsupuste,
Python
1
2
3
4
5
6
7
8
9
10
11
12
import pandas as pd
import numpy as np
 
df = pd.DataFrame({'Name':['tom', 'bob', 'bob', 'jack', 'jack', 'jack'], 'Date':["01.02.2022", "02.02.2022", "03.02.2022", "01.02.2022", "03.02.2022", "05.02.2022"]})
 
df.Date = pd.to_datetime(df.Date, format='%d.%m.%Y')
 
#mins = df.groupby("Name").min().Date
#maxes = df.groupby("Name").max().Date
#maxes.Date - mins.Date
diff = df.groupby("Name").max().Date - df.groupby("Name").min().Date
print(diff)
Добавлено через 1 минуту
tupsupuste, тоже посмотри

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import pandas as pd
import numpy as np
 
df = pd.DataFrame({'Name':['tom', 'bob', 'bob', 'jack', 'jack', 'jack'], 'Date':["01.02.2022", "02.02.2022", "03.02.2022", "01.02.2022", "03.02.2022", "05.02.2022"]})
 
df.Date = pd.to_datetime(df.Date, format='%d.%m.%Y')
df['id'] = df.groupby('Name').cumcount() + 1
print(df)
 
df1 = df.set_index(['Name', 'id'])
df1 = df1.unstack(level=-1)
 
df1['time1'] = (df1.max(axis=1) - df1.min(axis=1)).dt.days
df1['time2'] = df1.Date.count(axis=1)
df1['res'] = np.where(df1.time1 < df1.time2, df1.time2, df1.time1)
print(df1)
 
df1 = df1.res
print(df1)
1
1 / 1 / 0
Регистрация: 03.03.2022
Сообщений: 4
04.03.2022, 13:17  [ТС]
Цитата Сообщение от Gdez Посмотреть сообщение
diff = df.groupby("Name").max().Date - df.groupby("Name").min().Date
print(diff)
но тут два groupby остается




По вашему ответу задумку понял, и я опять ввел в заблуждение, когда объяснял:
tom 1
bob 2
jack 4
Тут у jack должно быть не 4, а 5.

Поправив немного, получилось следующее:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pandas as pd
import numpy as np
 
df = pd.DataFrame({'Name':['tom', 'bob', 'bob', 'jack', 'jack', 'jack'], 'Date':["01.02.2022", "02.02.2022", "03.02.2022", "01.02.2022", "03.02.2022", "05.02.2022"]})
 
df.Date = pd.to_datetime(df.Date, format='%d.%m.%Y')
df['id'] = df.groupby('Name').cumcount() + 1
print(df)
 
df1 = df.set_index(['Name', 'id'])
df1 = df1.unstack(level=-1)
 
result = (df1.max(axis=1) - df1.min(axis=1)).dt.days + 1
print(result)
1
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
04.03.2022, 13:37
tupsupuste, почитай
Вложения
Тип файла: pdf ama2015_pandas.pdf (955.9 Кб, 12 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.03.2022, 13:37
Помогаю со студенческими работами здесь

Временная сложность в С#. Как выразить временную сложность Θ метода A через n?
static void Do(int n) { B(A(n)); } static List&lt;int&gt; A(int n) { var values = new List&lt;int&gt;(); for (var i = 0; i &lt; n;...

Как вычислять сложность алгоритма, или найти асимптотическую сложность любой программки?
Например Вычислить x^n по алгоритму быстрого возведения в степень Добавлено через 43 секунды var x, n, r: word; ...

Сложность в составлении запроса
Доброго времени суток,всем с прошедшими и наступающими праздниками.;) Вопрос,изучаю запросы и отрыл в интернете задания для...

Сложность SQL запроса и Java
Один и тот же код - меняю только вставляемый запрос. в первом случаи 13 тысяч строк выводятся за 20 секунд, а запрос, формирующий 8 строк...

Как можно написать Алгоритмическую часть курсовой по задаче
Проанализировать файл с текстом. Определить частоту повторяемости каждой буквы алфавита и каждой цифры в тексте. Написать алгоритмическую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru