目录
1. 前言
开始入坑NILM。
在浩如烟海的文献、博客中遨游(懵逼)了几圈后,发现概念装了一脑袋然而有如浮在云端雾里看花水中望月并没有什么卵用,还是得敲敲代码、看看数据、做做分析才能得到直观认识。所以决定开始整点脚踏实地的东西,自然就是从nilmtk的安装开始了。
开源的东西好是好,就是要把环境整齐活了门槛太高了,对小白太不友好了。
包括官方指示在内,介绍nilmtk安装的博文在网上一搜也是一大把(从今天以后又增加一篇了),但是你永远不要太期待照着别人博文中说的去做就能一帆风顺—那是可遇而不可求的事情。今天折腾了大半天在几乎绝望的情况下通过无头苍蝇式的尝试最终居然碰到了一个可行的方案,感觉像是一个奇迹。就此做一个总结,给自己留个纪念,也期望能给其他未来将要入坑的伙伴们一点点帮助。但是。。。需要记住的是,以下所描述的并不保证是一个正确的方案,甚至不能保证是一个无害的方案,它只是恰好符合本渣当前运行环境等条件的一个“可行”方案而已。也许相比最后的解决方案的细节本身,搜索和解决问题的那种折磨而又必须死磕到底直到最后达成坚持就是胜利的过程本身对后来者更有参考意义。
作业环境:Windows10,Anaconda。以下未注明的话所有操作均在Windows Anaconda Prompt上执行。
本次奋斗(折腾,煎熬)过程中参考了以下博文,在此表示感谢。
[1] NILM(非侵入式电力负荷监测)学习笔记 —— 准备工作(一)配置环境NILMTK Toolkit_wwb1990的博客-CSDN博客
[2] https://blog.csdn.net/wwb1990/article/details/103911372
如果只想看最后怎么安装成功的话,直接翻到最后一章就可以了(但是并不建议这样做,过程可能比结果更有参考价值)。
以下操作中用到的一些conda命令的简要使用说明参见:conda常用命令的使用说明
[2021-11-04]追加了一种新的安装方式,意外地顺利(虽然仍然遗留了nosetests执行的问题)。建议新看到本贴的小伙伴可以跳过前面“血泪史^-^”直接看第7章。
2. 尝试1--遵照官方指示--失败
Ref: nilmtk/install_user.md at master · nilmtk/nilmtk · GitHub
首先参考GitHub上以上官方链接的提示进行尝试。不多废话,以下就按照文中所示的步骤进行一步一步的操作。
出师未捷身先死。。。这个不意外,一上来就搞成了那是做梦。
But。。。在后面的尝试中发现下载的最新的git文件中的版本号是0.4.0,所以。。。是因为版本号指定不正确?可以这是官方的install guide告诉我用0.4.2的啊?!那0.4.1和0.4.2在哪儿呢?当然以上安装命令中将0.4.2改为0.4.1或者0.4.0依然是报告同样的错误。此路不通!可是这不通的理由让人不爽。
3. 尝试2--失败
接下来参照(NILM(非侵入式电力负荷监测)学习笔记 —— 准备工作(一)配置环境NILMTK Toolkit_wwb1990的博客-CSDN博客)的说明进行尝试。仍然在上一节建立的nilmtk-env中进行安装。
因为是在新建的virtual-env中,所以很多工具都需要重新安装,首先需要安装的就是git。
3.1 下载代码包
安装完git了后执行以下两个命令:
git clone https://github.com/nilmtk/nilm_metadata/
git clone GitHub - nilmtk/nilmtk: Non-Intrusive Load Monitoring Toolkit (nilmtk)
网络不稳定,不容易连接成功(报告下图所示错误,尝试了好几次终于clone成功)。还是直接从github上直接下载zip文件来得顺畅。不知道什么原因,不管了,反正下载的zip文件是一样的。
3.2 安装
进入nilm_metadata目录底下运行:python setup.py develop
进入nilmtk目录底下运行:python setup.py develop
看起来平安无事,毕竟没有报错。
3.3 测试
运行noestests告诉命令找不到。好吧,也不知道nose到底是个什么鬼,反正安装就对了。。。
conda install nose
安装完再次命令行执行nosetests,出错报告中看到说没有找到pandas…参考wwb1990-blog的说明一锅端了:
conda install --yes pip numpy scipy six scikit-learn pandas numexpr
安装完再次命令行执行nosetests。
这次报告没有找到networkx:ModuleNotFoundError: No module named 'networkx'
从此开启了无穷无尽的各种包的安装(关键吧,每次只报告一个找不到的包。。。),甚至还出现过有些包需要在fanqiang软件开启条件下才能安装,有些则需要关闭才能安装。不知道有什么必然性,是因为我前面已经搞乱了才会出现这些幺蛾子吗?
。。。
最蛋疼的是下面这个:
安装:conda install tables
Conda不行那就改用pip安装:pip install tables
报出一堆不明所以的错误。。。
病急乱投医。。。参考medium.com上某洋博文的建议更新pip:
python -m pip install --upgrade pip
无效,运行输出显示pip是最新版本
仔细看了看有‘check_hostname’的错误,难道是?切断fanqiang软件试了试,果然开始Downloading(不禁为自己的机智而叹服)。燃鹅,又出新的幺蛾子了。
查了查,了解到hdf5.lib是h5py模块的库文件,管他niang的,安装。。。
conda install h5py
安装完毕后再次尝试tables的安装,依然出错。。。网上兜兜转转发现一个叫pytables,这是不是tables的替代品呢,好吧,试试看:
conda install pytables
安装成功(如果pytables是tables的替代品的,那前面为什么要提示安装tables而不是直接说安装pytables呢?)后再次运行nosetests: Ran 0 tests云云,就是说没有运行任何测试,不明所以。是不是nilmtk没有正确安装呢?跑到nilmtk目录底下重新运行一下python setup.py install(发现这次又要把fanqiang软件打开才行。。。蛋疼啊)。重新安装后,再次运行nosetests,这次报告无法找到”png.lib”,内心是崩溃的,有完没完啊。。。放弃,回头找另外的路。
4. 尝试3--失败
4.1 安装
既然在virtual-env中安装整出这么多幺蛾子,心想还是回到base environment下试试吧。重来一遍以下操作:
cd nilm_metadata
python setup.py develop
cd ..
cd nilmtk
python setup.py develop
没有报告什么问题,执行nosetests进行测试,还是报告“Ran 0 tests”云云。
虽然执行nosetests没有实现有效的单体测试,但是毕竟也没有像上一章那样报一堆错误,所以决定先放过,直接前进到尝试性的数据转换。如果能正确地进行数据转换,总可以证明安装是正确的吧。
4.2 REDDToH5测试
参考[2],下载REDD数据,并复制修改脚本REDDToH5.py如下:
from nilmtk.dataset_converters import convert_redd
convert_redd(r'D:\NILMD\REDD\low_freq',r'D:\NILMD\REDD\low_freq\redd_low.h5')
运行后发现报告以下错误:
TypeError: put() got an unexpected keyword argument 'expectedrows'
一查原来在github(convert_read fail: TypeError: put() got an unexpected keyword argument 'expectedrows' · Issue #858 · nilmtk/nilmtk · GitHub)上已经有人报告了这个错误,并且有人给出了解决方案,心想这下总稳了。。。然而并没有,好事多磨。
5. 尝试4--成功?
从以上链接可以看到这个事情的讨论(原文参见以上链接)经过如下:
首先,solegalli报告了这个错误
然后,orestislampridis附和了这个问题
第三,solegalli声称找到了一个solution
第四,simplyoptimisticonly 说他按照solegalli的方法做依然不行
第五,作为Collaborator的PMeira站出来说不建议solegalli所提出的“歪门邪道”,并且声称已经更新了版本到0.4.1(然而,如前所述,how can get version 0.4.1和0.4.2?),并且给出了另外的建议。
第六,simplyoptimisticonly声称找到了正确的解决方案,并贴出了成功转换REDD数据的运行结果
经过尝试后,我发现首先PMeira(按道理应该是代表“官方”)建议不成立,其一是找不到ver0.4.1和ver0.4.2,其二是我的Anaconda中的pandas当前版本就是0.25.3,可是就是不行。
其次,simplyoptimisticonly的解决方案我没有看懂(也许这个才是正解?),对我没有意义。没有心情再去摸索什么yml啊什么的—也许等我歇歇后缓过劲来了会再试一试。
抱着死马当做活马医的态度,我决定试一试solegalli的方案。在conda base environment下:
Step1 进到nilmtk目录,执行(这条具体什么含义后面再回头学习)“pip install -e .”
……
Step2 执行“pip install 'git+https://github.com/nilmtk/nilm_metadata.git#egg=nilm_metadata'”
然而,执行step2报告错误如下:
这意味着solegalli建议的原始方案也行不通(?2021-08-29 参见下面6.1)。算了算了,到nilm_metadata目录下也执行“pip install -e .”一下如何(解决实际的问题往往就是这样的,有时候需要适当的random exploration)?
这次安装成功了,当然只是没报错而已,是否正确还要看后面的测试运行情况。
执行nosetests依然不对,已经麻木了,爱咋咋地吧。。。
最后尝试一次执行REDD数据转换。。。哇奥,成了!不枉这大半天的折腾,热泪盈眶啊。。。看到了simplyoptimisticonly所贴出的标志转换成功的输出结果。
6.总结
虚脱,暂时无力吐槽。。。
文中用到的一些conda命令的简要使用说明参见:conda常用命令的使用说明
6.1 补充【2021-08-29】
今天查了查pip的使用方法(https://pip.pypa.io/en/stable/getting-started/),看到以下例子:
py -m pip install git+https://github.com/pypa/sampleproject.git@main
对比上面尝试solegalli的方案的step2的执行命令,发现最后一串东西并没有用单引号‘’圈住,难道是因为这个导致命令执行失败?--没文化真的太可怕了,深刻反省ing。。。
另外,“pip install -e .”中的选项“-e”似乎是指editable,即意味着这个package被安装以后还可以被修改(修改部分不用重新安装?),最后的选项应该是指定待安装包的存放目录,因此‘.’就表示当前目录啰(?)
7. 2021-11-04追加
今天(主要看到关于environment.yml的使用)尝试了另外一种安装方式,很意外地非常顺利。
从github上下载nilmtk-master.zip和nilm_metadata-master.zip并展开。将nilmtk-master更名为nilmtk(非必须,个人喜好)。以下"$..."表示在Anaconda Prompt运行命令(一路运行过去似乎并没有爆出什么幺蛾子):
$ cd nilmtk
$ conda env create -f environment.yml
$ conda activate nilmtk-env
$ python setup.py develop
$ conda list
。。。。。。
可以看到在nilm-tk环境下安装了所有必须的东西。
但是执行nosetests,依然是NG:
执行REDD低频数据转换(前提当然是已经下载了REDD数据并将low_freq数据展开了)。以下运行的REDDToH5.py内容如下:
from nilmtk.dataset_converters import convert_redd
convert_redd(r'D:\NILMD\REDD\low_freq',r'D:\NILMD\REDD\low_freq\redd_low.h5')
[2021-11-22]评论区有人说11-04的方法实测可行,有人说好像不行。。。我也有点慌^-^. “王后驾到”发布了一个执行“11-04的方法”运行成功的博客,有较详细的贴图。碰到问题的小伙伴可以看一看:NILMTK安装https://blog.csdn.net/wangwy_hoveringeagle/article/details/121143285https://blog.csdn.net/wangwy_hoveringeagle/article/details/121143285