Сверните функцию, где переменная-это номер строки моего фрейма данных

#arrays #python-3.x #optimization #minimize

Вопрос:

Постановка проблемы

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

Мы хотим свести к минимуму расстояние между этими областями и емкостью аккумулятора Cbatt. Таким образом, Cbat используется как можно чаще. Эта ошибка называется f(x) и должна быть сведена к минимуму.

Для моей проблемы у меня нет функции над t, но фрейм данных с 70 000 строк, где каждая строка (t) представляет собой новый временной шаг.

Для уровня x мы должны выполнить итерацию через фиксированное окно уровней нагрузки.

Мой код таков:

 hist = np.array(df.iloc[:,0])  #i created an array to make it more efficient

Big_M = 1000000000

def L(j):
    return hist[j] 

def Integral(t, x):
    sum = 0
      for i in range(t 1):
        sum = sum   (L(i) - x)/4                           # quater hours --> kW * 1/4 h = kWh * 1/4
    return sum

def calc_integral(time_window, x):
    min_t, max_t = 0,0
    max_integral, min_integral = -Big_M, Big_M
    for t in range(time_window):
        if Integral(t, x) < min_integral:
        min_integral = Integral(t, x)
        min_t = t
    if Integral(t, x) > max_integral:
        max_integral = Integral(t, x)
        max_t = t 
    return max_integral, min_integral

def error(Cbatt, time_window, x):
    max_integral, min_integral = calc_integral(time_window, x)
    return abs(Cbatt - max_integral - min_integral)

def threshold(Cbatt, time_window):
    L_max = int(round(hist[0:time_window].max(), 0))-1 
    L_min = int(round(hist[0:time_window].min(), 0))
    smallest_error = Big_M
    best_shave_level = 0
    for x in range(L_min,L_max):
        if error(Cbatt, time_window, x) < smallest_error:
        smallest_error = error(Cbatt, time_window, x)
        best_shave_level = x
    return best_shave_level, smallest_error

def BES(time_window, Cbatt_min, Cbatt_max):
    smallest_error = Big_M
    best_Cbatt = 0
    for Cbatt in range(Cbatt_min,Cbatt_max):
        if threshold(Cbatt, time_window)[1] < smallest_error:
            smallest_error = threshold(Cbatt, time_window)[1]
            best_shave_level = threshold(Cbatt, time_window)[0]
            best_Cbatt = Cbatt
    return best_shave_level, smallest_error, best_Cbatt 

 

В основном этот код перебирает все данные, и это занимает много времени. Есть ли какой-нибудь способ сделать это намного более эффективным? Существует ли пакет оптимизации, который принимает в качестве переменной что-то вроде номера строки (или расположения массива)?
Большое спасибо!