Dask dataframe groupby и применение пользовательских функций - PullRequest
0 голосов
/ 03 августа 2020

У меня есть эта функция, которую я пытаюсь применить к фреймворку данных dask, который вычисляет охлаждение с учетом определенной емкости хранилища и ограничений скорости. Требуется 15-минутный временной шаг для охлаждения здания и возвращается объем, который может вместить определенная скорость хранения.

   def cooling_kwh_by_case(row, storage_capacity, storage_rate):
    if ((row['daily_cooling_kwh'] <= storage_capacity/row['cop']) & (row['max_cooling_kw'] <= storage_rate/row['cop'])):
        return row['daily_cooling_kwh']
    elif ((row['daily_cooling_kwh'] <= storage_capacity/row['cop']) & (row['max_cooling_kw'] > storage_rate/row['cop'])):
        daily_groupby = net_load_w_times.groupby('index')['electricity_cooling_kwh'].apply(lambda x: sum(min(x,storage_rate/(4*row['cop']))))
        return daily_groupby.loc[(row.building_date)]
    else:
        n_largest = 1
        daily_groupby = net_load_w_times.groupby('index')['electricity_cooling_kwh'].apply(lambda x: x.nlargest(n_largest).sum())
        while ((daily_groupby.loc[(row.building_date)]) <= (storage_capacity/row['cop'])) & (n_largest < net_load_w_times.groupby('index')['electricity_cooling_kwh'].count()):   
            n_largest += 1
            daily_groupby = net_load_w_times.groupby('index')['electricity_cooling_kwh'].apply(lambda x: x.nlargest(n_largest).sum())
        return min(storage_capacity/row['cop'],net_load_w_times.groupby('index')['electricity_cooling_kwh'].apply(lambda x: x.nlargest(n_largest-1).sum()).loc[(row.building_date)])

Когда я его применяю, это мое сообщение об ошибке.

        <ipython-input-22-88e243d194c6> in cooling_kwh_by_case()
         16         n_largest = 1
         17         daily_groupby = net_load_w_times.groupby('index')['electricity_cooling_kwh'].apply(lambda x: x.nlargest(n_largest).sum())
    ---> 18         while ((daily_groupby.loc[(row.building_date)]) <= (storage_capacity/row['cop'])) & (n_largest < net_load_w_times.groupby('index')['electricity_cooling_kwh'].count()):
         19             n_largest += 1
         20             daily_groupby = net_load_w_times.groupby('index')['electricity_cooling_kwh'].apply(lambda x: x.nlargest(n_largest).sum())

ValueError: Not all divisions are known, can't align partitions. Please use `set_index` to set the index.

Я думаю, что проблема, с которой я сталкиваюсь, заключается в том, как я пытаюсь вычислить значение, которое я хочу для оператора else, в тех случаях, когда kwh охлаждения больше, чем параметр storage_capacity. Чтобы вычислить это значение, я применяю функцию, чтобы найти, когда сумма самых больших 15-минутных значений кВт / ч охлаждения за день превышает storage_capacity. Затем я возвращаю сумму наибольших значений.

Фрейм данных, который я пытаюсь сгруппировать в функции для возврата значения, называется net_load_w_times:

                          time  electricity_cooling_kwh  \
building_id                                                
2           2016-07-05 19:00:00                 0.050000   
2           2016-07-05 22:00:00                 3.200000   
2           2016-07-05 16:00:00                 5.779318   
2           2016-07-05 20:00:00                 1.888300   
2           2016-07-05 18:00:00                 7.490000  

             electricity_heating_kwh  total_site_electricity_kwh iso_zone  \
building_id                                                                 
2                           0.000000                   19.529506   MISO-E   
2                           0.045235                    6.310719   MISO-E   
2                           0.000000                   22.514705   MISO-E   
2                           0.018624                   13.474863   MISO-E   
2                           0.005464                   18.192927   MISO-E   

                    index        date  
building_id                            
2            2|2016-10-24  2016-10-24  
2            2|2016-03-05  2016-03-05  
2            2|2016-08-14  2016-08-14  
2            2|2016-03-05  2016-03-05  
2            2|2016-03-05  2016-03-05  

 

Желаемый результат:

Учитывая cooling_kwh_by_case(row, 8, 5), он выводит:

7,717618, потому что это максимальная мощность охлаждения, которую он может добавить до 8.

1 Ответ

0 голосов
/ 08 августа 2020

Фреймы данных Dask ленивы и не работают в потоке управления, как операторы if-else или циклы for. Я рекомендую попробовать найти решения в API pandas, например, в методе where.

...