Как применить собственную функцию сборки на groupby

Я не смог найти ветку, которая соответствовала бы моему вопросу... Если это неправда, не стесняйтесь опубликовать ссылку на ветку.

У меня есть следующий фрейм данных, который я должен проанализировать. Это глава:



                     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).

Есть предложения?`

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

NBIAS возвращает среднее значение (число с плавающей запятой), деленное на park_size. Это число, numpy.float64, как говорится в сообщении об ошибке. apply принимает вызываемый объект, такой как функция или лямбда.

Вместо этого попробуйте:


data_perhour=data.groupby(data.index.hour).apply(lambda p: NBIAS('EMBieding',p))

Таким образом, группа как-то теряется. Но все равно спасибо!

jonasa 03.06.2019 08:36
Ответ принят как подходящий

Pandas groupbyapply принимает вызываемый объект, который получает в качестве параметра подмножество фрейма данных, соответствующего группе. Ваша проблема в том, что функция 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, или есть лучший способ решить эту проблему?

jonasa 03.06.2019 08:39

Другие вопросы по теме