Вопрос или проблема
Я пытаюсь написать код для теста на силу, который выведет максимальное значение силы до того, как произойдет структурный сбой. Я немного новичок в Python, поэтому проблема может быть простой, и я что-то упускаю. По сути, когда я запускаю код, он выполняется бесконечно, не выводя никакого значения (пока что я давал ему работать около 10 минут). Я использовал фальшивый датафрейм с длиной вектора около 80, так что, думаю, проблема в коде, а не в том, что мой вектор слишком длинный или требует длительной обработки.
Вот код:
def find_new_max(data):
n=5
a=1
groups=np.array_split(data['Force'], len(data['Force'])//n)
slope=[group.max() - group.min() for group in groups[0:a]]
while np.all(np.array(slope)) > 0:
a=a+1
return(max(data['Force'][0:a*n]))
find_new_max(df)
По сути, цель заключается в том, чтобы код проанализировал наклон, рассматривая группы, состоящие из пяти точек данных каждая, начиная только с первой группы, а затем переходя к последовательной группе, если отрицательный наклон не выявлен. Как только он находит отрицательный наклон, цикл должен остановиться, и он должен использовать новое значение “a”, чтобы искать максимальное значение в векторе до группы с отрицательным наклоном.
Мне не совсем понятно, что здесь не так, так как ошибок не возникает. Я также пытался заставить его искать только одну группу за раз так:
def find_new_max(data):
n=5
b=0
a=1
groups=np.array_split(data['Force'], len(data['Force'])//n)
slope=[group.max() - group.min() for group in groups[b:a]]
while np.all(np.array(slope)) > 0:
b=b+1
a=a+1
return(max(data['Force'][0:a*n]))
find_new_max(df)
Но возникает та же проблема.
Любая помощь будет оценена, спасибо!
Несколько замечаний:
-
Ваш массив не разбивается на группы по 5. Ваш массив разбивается на 5 групп длиной = (len(data[‘force’])/n). Посмотрите документацию по array_split: https://numpy.org/doc/stable/reference/generated/numpy.array_split.html#numpy-array-split
-
Ваша переменная slope не обновляется внутри цикла while, из-за чего он выполняется бесконечно.
-
Метод np.all возвращает логическое значение, а не целое число. Почему вы решили использовать метод .all()? Установите цикл while так, чтобы он продолжался, пока наклон не станет отрицательным, а не логическим.
Ответ или решение
Конечно, давайте исправим ваш код на Python для обнаружения максимального значения силы перед снижением в градиенте, основываясь на ваших наблюдениях и предоставленных комментариях.
Проблемы в вашем коде
-
Разбиение массива на группы: Действительно,
np.array_split(data['Force'], len(data['Force']) // n)
разбивает ваш массив наlen(data['Force']) // n
групп, а не на группы по 5 элементов. В результате в вашем случае массив может содержать меньше чем 5 элементов в каждой группе. -
Обновление переменной
slope
: В текущей реализации переменнаяslope
не обновляется в цикле, что приводит к бесконечному выполнению цикла. -
Условие выхода из цикла: Вместо использования
np.all()
, проверяем каждую группу на наличие отрицательного градиента непосредственно в цикле.
Исправленный код
Вот исправленный вариант вашей функции, который учитывает все указанные проблемы:
import numpy as np
import pandas as pd
def find_new_max(data):
n = 5
a = 1
# Разделяем 'Force' на группы по 5 элементов
groups = [data['Force'][i:i+n] for i in range(0, len(data['Force']), n)][:len(data['Force']) // n]
# Ищем максимальное значение перед снижением градиента
while a <= len(groups) - 1:
slope = groups[a].max() - groups[a].min()
if slope < 0:
break
a += 1
# Если мы нашли хотя бы одну группу, возвращаем максимальное значение в пределах ее
if a > 0:
return max(data['Force'][:a*n])
else:
return None # Если максимальное значение не найдено
# Пример использования
# df = pd.DataFrame({'Force': [10, 12, 15, 20, 18, 14, 10, 6, 2]})
# print(find_new_max(df))
Объяснение исправленного кода
-
Разбивка на группы: Мы используем списковое включение для разделения данных на группы по 5 элементов. Это позволяет нам уверенно работать с каждой группой по отдельности.
-
Цикл аннулирования: В цикле теперь мы проверяем градиент каждой группы. Если он отрицательный, мы выходим из цикла. Если
slope
остается положительным, переменнаяa
увеличивается. -
Возврат результата: После того как мы нашли необходимую группу, мы возвращаем максимальное значение в пределах проанализированных данных. Если негативного градиента не обнаружено, возвращается
None
.
Заключение
Код теперь должен выполнять вашу задачу, анализируя переданный DataFrame и определяя максимальное значение силы перед структурным падением. Не забывайте проверять и тестировать код на реальных данных, чтобы убедиться в его корректности. Если у вас есть дополнительные вопросы, не стесняйтесь обращаться!