找回密码
 立即注册
查看: 194|回复: 0

如何利用你自己的数据生成NILMTK格式数据集

[复制链接]
发表于 2022-6-28 18:39 | 显示全部楼层 |阅读模式
文章目录

    前言一、NILMTK Dataset介绍
      1. Time Series Data2. Meta Data
    二、创建步骤
      1.创建metadata.hdf5
        1.1 创建yaml文件1.2 运行转化脚本
      2.创建序列数据的DataFrame3.添加DataFrame到hdf5中
    总结



前言

??做项目需要用到负荷分解,第一反应去github找开源项目hh。大概查了查,发现大多数项目所使用的数据集结构都是NILMTK格式的。也就是说如果想基于他们的算法做开发,相对简便的一种方式就是提供NILMTK格式的数据集。
??官方仅为一些常见的负荷分解数据集(如ukdale、redd)提供了转化的脚本,但如果是个人自己的数据集则需要自己编写。在网上找了找,好像没有发现很多相关资料,于是在这里记录此次的转化过程。


一、NILMTK Dataset介绍

??NILMTK是一个专门用于负荷分解研究的工具包,其建立了一个较为流行的标准数据集格式(NILMTK Dataset)。该数据集以HDF5格式存在,而HDF5是由数据部分以及元数据部分构成,因此该数据集也是由这两部分构成。
1. Time Series Data


?这部分本质上就是一个table,以时间戳为index,hierarchical label为column name。一级column name表示测量的物理量(physical_quanitity)、二级column name表示类型(type)。他们的取值范围均在一个受控词表内。



2. Meta Data


?如图所示,metadata这部分内容又包含相对较为稳定的Central metadata部分与随数据集变化的Shipped metadata部分,各方块的具体含义就不详细展开了,有兴趣的可以到这里了解。总的来说metadata的作用有两方面:
?1)为series data建立索引,令程序能够根据索引拿到想要的数据;
?2)描述一些数据制作的客观信息,如地点、作者、采集设备说明等。

二、创建步骤

1.创建metadata.hdf5

1.1 创建yaml文件

(注意,这里的hdf5并不是最终完整数据集的hdf5,而是一个胚子,后面还需要将序列数据加入到这个胚子中)
?官方指出可以将metadata先写入多个yaml文件中,然后再转化为hdf5文件,并为此提供了一个脚本convert_yaml_to_hdf5.py。
?yaml文件有三个:dataset.yaml、meter_devices.yaml、building.yaml。
?1)dataset.yaml的一个示例如下所示,主要记录了数据集名称、作者、制作时间、制作目的等信息

dataset.yaml(示例):
  1. name: REDD
  2. long_name: The Reference Energy Disaggregation Data set
  3. creators:- Kolter, Zico
  4. - Johnson, Matthew
  5. publication_date:2011
  6. institution: Massachusetts Institute of Technology(MIT)
  7. contact: zkolter@cs.cmu.edu   # Zico moved from MIT to CMU
  8. description: Several weeks of power data for6 different homes.
  9. subject: Disaggregated power demand from domestic buildings.
  10. number_of_buildings:6
  11. timezone: US/Eastern   # MIT is on the east coast
  12. geo_location:
  13.   locality: Massachusetts   # village, town, city or state
  14.   country: US   # standard two-letter country code defined by ISO 3166-1 alpha-2
  15.   latitude:42.360091 # MIT's coorindates
  16.   longitude:-71.09416
  17. related_documents:- http://redd.csail.mit.edu->
  18.   J. Zico Kolter and Matthew J. Johnson.
  19.   REDD: A public data set for energy disaggregation research.
  20.   In proceedings of the SustKDD workshop on
  21.   Data Mining Applications in Sustainability,2011.
  22.   http://redd.csail.mit.edu/kolter-kddsust11.pdf
  23. schema: https://github.com/nilmtk/nilm_metadata/tree/v0.2
复制代码
?2)meter_devices.yaml则记录了采集数据所用设备的信息
meter_devices.yaml(示例):
  1. eMonitor:
  2.   model: eMonitor
  3.   manufacturer: Powerhouse Dynamics
  4.   manufacturer_url: http://powerhousedynamics.com
  5.   description:>
  6.     Measures circuit-level power demand.  Comes with 24 CTs.
  7.     This FAQ page suggests the eMonitor measures real(active)
  8.     power: http://www.energycircle.com/node/14103  although the REDD
  9.     readme.txt says all channels record apparent power.
  10.   sample_period:3   # the interval between samples. In seconds.
  11.   max_sample_period:50   # Max allowable interval between samples. Seconds.
  12.   measurements:- physical_quantity: power   # power, voltage, energy, current?
  13.     type: active   # active(real power), reactive or apparent?
  14.     upper_limit:5000
  15.     lower_limit:0
  16.   wireless: false
  17. REDD_whole_house:
  18.   description:>
  19.     REDD's DIY power meter used to measure whole-home AC waveforms
  20.     at high frequency.  To quote from their paper: "CTs from TED(http://www.theenergydetective.com) to measure current in the
  21.     power mains, a Pico TA041 oscilloscope probe(http://www.picotechnologies.com) to measure voltage for one of
  22.     the two phases in the home, and a National Instruments NI-9239
  23.     analog to digital converter to transform both these analog
  24.     signals to digital readings. This A/D converter has 24 bit
  25.     resolution with noise of approximately 70 ?V, which determines
  26.     the noise level of our current and voltage readings: the TED CTs
  27.     are rated for200 amp circuits and a maximum of 3 volts, so we
  28.     are able to differentiate between currents of approximately((200))(70 × 10?6)/(3)=4.66mA, corresponding to power changes
  29.     of about 0.5 watts. Similarly, since we use a 1:100 voltage
  30.     stepdown in the oscilloscope probe, we can detect voltage
  31.     differences of about 7mV."
  32.   sample_period:1
  33.   max_sample_period:30
  34.   measurements:- physical_quantity: power
  35.     type: apparent
  36.     upper_limit:50000
  37.     lower_limit:0
  38.   wireless: false
复制代码
?3)building{i}.yaml包含了三部分内容:建筑实例信息、电表实例信息、电器实例信息。电表实例信息较为核心,包含了电表之间的层级关系以及对应数据在hdf5文件中存放的索引
building1.yaml(示例):
  1. instance:1   # this is the first building in the dataset
  2. original_name: house_1   # original name from REDD dataset
  3. elec_meters:1:
  4.     site_meter: true
  5.     device_model: REDD_whole_house  # keys into meter_devices dictionary
  6.     data_location: house_1/channel_1.dat
  7.   2:
  8.     site_meter: true
  9.     device_model: REDD_whole_house
  10.     data_location: house_1/channel_2.dat
  11.   3:
  12.     submeter_of:0 # '0' means 'one of the site_meters'. We don't know
  13.                    #whichsite meter feeds which appliance in REDD.
  14.     device_model: eMonitor
  15.     data_location: house_1/channel_3.dat
  16.   4:
  17.     submeter_of:0
  18.     device_model: eMonitor
  19.     data_location: house_4/channel_4.dat
  20. appliances:- original_name: kitchen_outlets
  21.   room: kitchen
  22.   type: sockets   # sockets is treated as an appliance
  23.   instance:1
  24.   multiple: true   # likely to be more than 1 socket
  25.   meters:[7]- original_name: kitchen_outlets
  26.   room: kitchen
  27.   type: sockets
  28.   instance:2   # 2nd instance of 'sockets' in this building
  29.   multiple: true   # likely to be more than 1 socket
  30.   meters:[8]- original_name: lighting
  31.   type: light
  32.   instance:1
  33.   multiple: true   # likely to be more than 1 light
  34.   meters:[9]- original_name: lighting
  35.   type: light
  36.   instance:2   # 2nd instance of 'light' in this building
  37.   multiple: true
  38.   meters:[17]- original_name: lighting
  39.   type: light
  40.   instance:3   # 3rd instance of 'light' in this building
  41.   multiple: true
  42.   meters:[18]- original_name: bathroom_gfi   # ground fault interrupter
  43.   room: bathroom
  44.   type: unknown
  45.   instance:1
  46.   multiple: true
  47.   meters:[12]
复制代码
1.2 运行转化脚本

?注意,如果要使用上面的脚本,yaml文件的命名、内部格式,以及字段取值范围,必须遵从一定的规则,简单示例可以在这个文档中找到,否则该脚本在运行检查时会报错,除非你去修改它的central_meta。
  1. convert_yaml_to_hdf5(yaml_dir, hdf_filename)
复制代码
2.创建序列数据的DataFrame

?假设已有各分项用电的数据,则下面需要为各分项分别创建符合上述格式要求的DataFrame:
1)时间戳转换
  1. a =str(testdf.index[0])  # a数据类型为字符串
  2. timeArray = time.strptime(a,"%Y-%m-%d %H:%M:%S")  # 数据类型为time.struct_time
  3. timeStamp =int(time.mktime(timeArray))  # 数据类型为10位数字时间戳
复制代码
2)设置多层标签
  1. test.columns =[['power'],['apparent']]
复制代码
3.添加DataFrame到hdf5中
  1. store = pd.HDFStore(r'test.hdf5')for i,subset in enumerate(subsets,start=1):
  2.     test = Energys[subset][['时间', f'{subset}']].set_index('时间')
  3.     test.columns =[['power'],['apparent']]
  4.     test.index.name ='time'
  5.     store.append(f'building1/elec/meter{i}', test)  # 该地址需要与building<i>.yaml下的elec_meters相一致
  6.     store.close()
复制代码
至此,NILMKT格式的数据集制作完毕。


总结

第一次做总结分享,希望能够对大家有所帮助。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-26 03:50 , Processed in 0.071371 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表