首页 > 解决方案 > Dask Dataframe:选择每小时使用值大于每日平均值的行

问题描述

我有一个表格中的数据数据框:

index     time          cooling_kwh   total_energy_kwh      building_id
0,    1/1/2020 1:00,    0.0,          10.303025148,         14
1,    1/1/2020 2:00,    0.0,          10.501065738,         14
2,    1/1/2020 3:00,    0.0,          10.580369134999998,   14
3,    1/1/2020 4:00,    0.0,          10.622952277,         14
4,    1/1/2020 5:00,    0.0,          10.784153656,         14
5,    1/1/2020 6:00,    0.0,          11.384857169,         14
6,    1/1/2020 7:00,    0.002205914,  15.601318334,         14
7,    1/1/2020 8:00,    0.000451000,  19.410880241999998,   14
...

这些行持续一整年,然后继续使用其他建筑物 ID 的一年数据。我只需要选择total_energy_usage_kwh值大于全天平均值的行。仅供参考,这只是一个更大的数据集的测试数据集,已经是一个 dask 数据帧。我已经创建了一个包含每日平均值的表格:

raw_data = pd.read_csv('file_name', usecols=[list of cols to use])
dask_raw_data = dd.from_pandas(raw_data, npartitions=n)

d1 = {'time': 'last', 'electricity_cooling_kwh': 'sum', 'total_site_electricity_kwh': 'sum', 'building_id': 'last'}
grouped_by_hour = dask_raw_data.groupby(dask_raw_data.index // 4).agg(d1) #original data is grouped in 15 minute intervals

d2 = {'time': 'first', 'electricity_cooling_kwh': 'sum', 'total_site_electricity_kwh': 'mean', 'building_id': 'last'}\
grouped_by_day = grouped_by_hour.groupby(grouped_by_hour.index // 24).agg(d2)

看起来像这样:

index      time         cooling_kwh             average_ttl_energy_kwh, building_id
0,     1/1/2020 1:00,   0.031805705999999996,   21.467724711749998,     14
1,     1/2/2020 1:00,   0.048682367,            11.29718203445833,      14
2,     1/3/2020 1:00,   0.006180415,            7.5111043845,           14
3,     1/4/2020 1:00,   0.061217776,            21.422023511583333,     14
4,     1/5/2020 1:00,   0.10863825899999999,    21.234984764874998,     14
5,     1/6/2020 1:00,   0.07775508199999999,    21.259932711666664,     14
...

而且我还发现要选择每小时使用量大于我可以使用的数字 n 的行:

above_average_usage = grouped_by_hour[grouped_by_hour.total_site_electricity_kwh > n]

我不确定如何将这两部分结合起来,我试过:

above_average_usage = grouped_by_hour[grouped_by_hour.total_site_electricity_kwh > grouped_by_hour.groupby(grouped_by_hour['time'].dt.date).time.mean().compute()]

但是无法对日期时间对象求和(TypeError:DatetimeIndex 无法执行操作求和),我觉得这不会返回我想要的任何一种方式。最后,我需要在 total_energy_usage_kwh 大于当天平均值的时候对cooling_kwh 列中的值求和,并且数据需要保持按building_id 分组,我在尝试dask 之前使用pandas 数据框时解决了这个问题:

d4 = {'electricity_cooling_kwh': 'sum'}
summed_above_average_hours = above_average_hours.groupby([above_average_hours.building_id, above_average_hours['time'].dt.date]).agg(d4)

标签: pythondataframedask

解决方案


推荐阅读