См. следующее уравнение:
Я сделал для него следующий код:
def i_t(t, t_s, t_max, i_min, i_max):
if t >= t_max:
return i_max
elif t_s <= t < t_max:
s = (i_max - i_min) / (t_max - t_s)
return s*(t-t_s)
else:
return 0
x_real = pd.DataFrame([[0.322,0.062,0.045,0.05,0.094,0.067,0.045,0.042,0.009,0.047,0.109,0.077,0.051,0.046,0.019,
0.033,0.122,0.085,0.028,0.344,0.208,0.166,0.247,0.231,0.149,0.157,0.137,0.061,0.118,0.135,
0.152,0.155,0.243,0.27,0.321,0.386,0.444,0.464,0.382,0.397,0.41,0.397,0.42,0.368,0.356,0.322,
0.295,0.309,3],
[1.01,0.661,0.627,0.662,0.626,0.647,0.638,0.633,0.653,1.07,0.664,0.628,0.661,1.138,1.403,
0.998,0.634,0.639,0.618,0.654,0.619,0.655,0.621,0.652,0.624,0.634,0.644,0.623,0.654,0.616,
0.653,0.62,0.643,0.635,0.624,0.65,0.621,1.044,1.335,1.371,1.341,1.376,1.386,1.378,1.404,1.366,
1.413,1.388,2],
[0.484,0.429,0.3,0.146,0.146,0.264,0.242,0.147,0.146,0.16,0.265,0.252,0.144,0.13,0.088,0.194,
0.199,0.115,0.088,0.088,0.136,0.572,0.365,0.222,0.369,0.242,0.732,0.457,0.339,0.285,0.645,
0.461,0.813,2.317,1.745,0.89,0.193,1.419,1.586,1.068,0.844,0.35,0.355,0.338,0.323,0.331,0.336,
0.322,1],
[0.467,0.561,0.272,0.265,0.235,0.246,0.258,0.249,0.247,0.265,0.259,0.259,0.405,0.24,0.222,
0.134,0.114,0.219,0.573,0.268,0.522,0.233,0.852,1.78,0.397,0.27,2.229,2.738,0.404,0.415,0.527,
1.174,2.506,2.333,1.367,1.871,3.831,3.043,1.347,1.026,1.17,1.021,0.837,0.97,0.84,0.861,0.853,
1.783,1]], columns=['00:29:59','00:59:59','01:29:59','01:59:59','02:29:59','02:59:59',
'03:29:59','03:59:59','04:29:59','04:59:59','05:29:59','05:59:59',
'06:29:59','06:59:59','07:29:59','07:59:59','08:29:59','08:59:59',
'09:29:59','09:59:59','10:29:59','10:59:59','11:29:59','11:59:59',
'12:29:59','12:59:59','13:29:59','13:59:59','14:29:59','14:59:59',
'15:29:59','15:59:59','16:29:59','16:59:59','17:29:59','17:59:59',
'18:29:59','18:59:59','19:29:59','19:59:59','20:29:59','20:59:59',
'21:29:59','21:59:59','22:29:59','22:59:59','23:29:59','23:59:59','Code'])
x_labels = x_real.columns[0:48]
imin = 0
imax = 0.9
time_arr = np.arange(48)
x_8 = pd.DataFrame(columns=x_labels)
for i, row in x_real.iterrows():
x_aux = pd.DataFrame(columns=x_labels)
if row['Code'] == 1:
it = []
ts = random.choice(x_labels[36:39])
tmax = random.choice([t for t in x_labels if t > ts])
ts = x_real.columns.get_loc(ts)
tmax = x_real.columns.get_loc(tmax)
for t in time_arr:
it.append(i_t(t, ts, tmax, imin, imax))
x_aux.loc[i] = it
x_aux.loc[i] = np.asarray([1 - x for x in it])*x_real.iloc[i, 0:48]
x_aux = x_aux.squeeze(axis=0)
x_aux = pd.concat([x_aux, x_real.iloc[i, 48:]])
x_aux = x_aux.to_frame()
x_8 = pd.concat([x_8, x_aux.T])
elif row['Code'] == 2:
it = []
ts = random.choice(x_labels[15:33])
tmax = random.choice([t for t in x_labels if t > ts])
ts = x_real.columns.get_loc(ts)
tmax = x_real.columns.get_loc(tmax)
for t in time_arr:
it.append(i_t(t, ts, tmax, imin, imax))
x_aux.loc[i] = it
x_aux.loc[i] = np.asarray([1 - x for x in it])*x_real.iloc[i, 0:48]
x_aux = x_aux.squeeze(axis=0)
x_aux = pd.concat([x_aux, x_real.iloc[i, 48:]])
x_aux = x_aux.to_frame()
x_8 = pd.concat([x_8, x_aux.T])
else:
it = []
ts = random.choice(x_labels[12:35])
tmax = random.choice([t for t in x_labels if t > ts])
ts = x_real.columns.get_loc(ts)
tmax = x_real.columns.get_loc(tmax)
for t in time_arr:
it.append(i_t(t, ts, tmax, imin, imax))
x_aux.loc[i] = it
x_aux.loc[i] = np.asarray([1 - x for x in it])*x_real.iloc[i, 0:48]
x_aux = x_aux.squeeze(axis=0)
x_aux = pd.concat([x_aux, x_real.iloc[i, 48:]])
x_aux = x_aux.to_frame()
x_8 = pd.concat([x_8, x_aux.T])
Я получаю ожидаемые результаты, но поскольку данные, над которыми я работаю, имеют около 350
тысячи строк, для запуска требуется вечность.
Мой фрейм данных pandas имеет 49
столбцы. Каждая строка — это данные потребителя. Первый 48
столбцы содержат получасовые измерения переменной (следовательно, у нас есть данные за 1 день в каждой строке) для одного потребителя. Последний столбец x_real['Code']
содержит код, который представляет тип потребителей (это может быть 1
, 2
или 3
). Ниже несколько изображений, чтобы получить представление о данных, над которыми я работаю:
Итак, мне нужно применить это уравнение для каждой строки (потребителя) моего набора данных. И это зависит от значения 'Code'
потому что есть разные диапазоны запуска, ts
и максимальное время, tmax
. На основе этих случайных ts
и tmax
мне нужно вычислить наклон, s
чтобы определить значения it
так что я могу, наконец, определить мой x_8
кадр данных.
Как мне оптимизировать этот код, чтобы он работал быстрее? В резюме мне нужно определить s
значение для каждой строки, чтобы иметь возможность вычислить it
и, наконец, создайте мой x_8
кадр данных со значениями it
.
Мурило
1 ответ
Несколько улучшений, которые я мог видеть, которые вы могли бы реализовать для обработки таких больших наборов данных и ускорения программы, представляют собой векторизованные операции, поэтому они должны выполняться сразу для всего фрейма данных.
Вы также можете реализовать параллельную обработку, которая должна значительно ускорить код, однако ваше оборудование будет определять, насколько эффективно это будет для вас.
Пара других вариантов — реализовать массивы с отображением памяти или методы потоковой обработки данных для загрузки и обработки данных небольшими фрагментами, и, поскольку этот код действует как парсер для вашего набора данных, я всегда рекомендую включать функцию кэширования в любой парсер. основанный код.
Sᴀᴍ Heᴇᴌᴀ