python - 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)
解决方案
推荐阅读
- excel - 如何在 Excel VBA 中粘贴所有形状和列宽
- python - 为什么函数的内存位置每次在 python 中都会改变?
- python - 如何显示 mplfinance 下载数据的时间(索引类型 datetime)
- c++ - 用回溯法解决 N-Queens 但以不同的方式
- firebase - 云功能中的意外令牌数据库
- java - 这个流利的构建器有什么问题?
- flutter - 如何向 TextField 添加检查器和警告
- java - 带有 Java/Springboot 的 GraphQL 无法从传递的查询中选择模式中定义为 onField 的自定义指令
- c - 读取重定向输出并将其输出重定向到下一个子进程的进程,依此类推
- angular - 无法在角度 10 中绑定到“FormGroup”