Попытка написать код, который определяет максимальное значение перед снижением наклона.

Вопрос или проблема

Я пытаюсь написать код для теста на силу, который выведет максимальное значение силы до того, как произойдет структурный сбой. Я немного новичок в 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)

Но возникает та же проблема.

Любая помощь будет оценена, спасибо!

Несколько замечаний:

  1. Ваш массив не разбивается на группы по 5. Ваш массив разбивается на 5 групп длиной = (len(data[‘force’])/n). Посмотрите документацию по array_split: https://numpy.org/doc/stable/reference/generated/numpy.array_split.html#numpy-array-split

  2. Ваша переменная slope не обновляется внутри цикла while, из-за чего он выполняется бесконечно.

  3. Метод np.all возвращает логическое значение, а не целое число. Почему вы решили использовать метод .all()? Установите цикл while так, чтобы он продолжался, пока наклон не станет отрицательным, а не логическим.

Ответ или решение

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

Проблемы в вашем коде

  1. Разбиение массива на группы: Действительно, np.array_split(data['Force'], len(data['Force']) // n) разбивает ваш массив на len(data['Force']) // n групп, а не на группы по 5 элементов. В результате в вашем случае массив может содержать меньше чем 5 элементов в каждой группе.

  2. Обновление переменной slope: В текущей реализации переменная slope не обновляется в цикле, что приводит к бесконечному выполнению цикла.

  3. Условие выхода из цикла: Вместо использования 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))

Объяснение исправленного кода

  1. Разбивка на группы: Мы используем списковое включение для разделения данных на группы по 5 элементов. Это позволяет нам уверенно работать с каждой группой по отдельности.

  2. Цикл аннулирования: В цикле теперь мы проверяем градиент каждой группы. Если он отрицательный, мы выходим из цикла. Если slope остается положительным, переменная a увеличивается.

  3. Возврат результата: После того как мы нашли необходимую группу, мы возвращаем максимальное значение в пределах проанализированных данных. Если негативного градиента не обнаружено, возвращается None.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...