Я не смог найти ветку, которая соответствовала бы моему вопросу... Если это неправда, не стесняйтесь опубликовать ссылку на ветку.
У меня есть следующий фрейм данных, который я должен проанализировать. Это глава:
EMBieding AeolisBieding ... Diff_EM Diff_Aeolis
StartTime ...
2019-09-01 00:00:00 3058.24 3494.0 ... -3126.24 -3562.0
2019-09-01 01:00:00 2906.01 3480.0 ... -2974.01 -3548.0
2019-09-01 02:00:00 2836.22 3470.0 ... -2903.22 -3537.0
2019-09-01 03:00:00 2805.66 3448.0 ... -2848.66 -3491.0
2019-09-01 04:00:00 2541.54 3413.0 ... -2606.54 -3478.0
Наряду с общими показателями ошибок я также хочу узнать ошибку в час. Это означает, что часы с 0 до 23 должны быть объединены. Используя следующий код, легко найти среднее значение:
data= importdata('871687110001543570.csv')
data_perhour = data.groupby(data.index.hour).mean()
data_perhour.drop
print(data_perhour)
Я могу легко найти среднее значение для каждого столбца.
EMBieding AeolisBieding ... Diff_EM Diff_Aeolis
StartTime ...
0 1175.862033 1279.577236 ... -253.707561 -357.422764
1 1153.947724 1264.723577 ... -309.435528 -420.211382
2 1146.239016 1259.459016 ... -336.763607 -449.983607
3 1133.350976 1251.268293 ... -390.928211 -508.845528
4 1127.061789 1251.300813 ... -405.411382 -529.650407
Меры ошибок, которые я использую, — это NBIAS, NMAE и NRMSE. Я вычисляю это с помощью следующего
# statistic calculates the different errormeasurements: NBIAS,NMAE,NRMSE. Input arguments are: data; this is the output from the
# importdata function. parksize; which is just the installed power of the respective farm, for normalization. filename
# is needed to produce a unique new filename.
def statistic(data,park_size,filename):
def NBIAS(Diff_forecaster,park_size):
return data[Diff_forecaster].mean()/park_size
def NMAE(Bied_forecaster,park_size):
return mean_absolute_error(data['Production'], data[Bied_forecaster]) /park_size
def NRMSE(Bied_forecaster,park_size):
return (sqrt(mean_squared_error(data['Production'], data[Bied_forecaster])) /np.square(park_size))
# Calculate the overall errormeasure and save it directly in a external .csv
ErrorMeasure = {'EM':[NBIAS('Diff_EM',park_size),NMAE('EMBieding',park_size),NRMSE('EMBieding',park_size)],
'Aeolis':[NBIAS('Diff_Aeolis',park_size),NMAE('Bied',park_size ),NRMSE('Bied',park_size)]}
df_ErrorMeasure = pd.DataFrame(ErrorMeasure,index=['NBIAS','NMAE','NRMSE'])
df_ErrorMeasure.to_csv('errormeasure'+filename)
data_perhour=data.groupby(data.index.hour).apply(NBIAS('EMBieding',park_size))
print(data_perhour)
Последние две строки — это попытка получить NBIAS за каждый час. Однако я получаю эту ошибку:
TypeError: 'numpy.float64' object is not callable
Как я могу получить показатели ошибок за каждый час? Это означает, могу ли я использовать собственную функцию (например, .NBIAS
), чтобы заменить .mean
после data.groupby(data.index.hour)
.
Есть предложения?`
NBIAS
возвращает среднее значение (число с плавающей запятой), деленное на park_size
. Это число, numpy.float64
, как говорится в сообщении об ошибке. apply
принимает вызываемый объект, такой как функция или лямбда.
Вместо этого попробуйте:
data_perhour=data.groupby(data.index.hour).apply(lambda p: NBIAS('EMBieding',p))
Pandas groupby
apply
принимает вызываемый объект, который получает в качестве параметра подмножество фрейма данных, соответствующего группе. Ваша проблема в том, что функция NBIAS
не имеет для этого параметра и действует на исходный фрейм данных.
Чтобы использовать его в своем groupby
, вам нужно будет его адаптировать:
def statistic(data,park_size,filename):
def NBIAS(Diff_forecaster,park_size, df=data):
return df[Diff_forecaster].mean()/park_size
Затем вы можете использовать его таким образом:
data_perhour=data.groupby(data.index.hour).apply(lambda subdf: NBIAS('EMBieding',park_size, subdf))
print(data_perhour)
Ах да, это похоже на то, что я искал. Спасибо! Просто из любопытства, желателен ли мой подход (с вашей адаптацией) в python, или есть лучший способ решить эту проблему?
Таким образом, группа как-то теряется. Но все равно спасибо!