signed

QiShunwang

“诚信为本、客户至上”

WNTR数据分析

2021/5/14 23:17:37   来源:

在使用WNTR包的时候,进行完模拟,需要将模拟的结果results输出进行保存,以便后续的机器学习或者统计分析,也可以进行一系列时间序列数据的预处理,现将大致步骤归纳如下。

>>> import wntr 

>>> wn = wntr.network.WaterNetworkModel('networks/Net3.inp') 
>>> sim = wntr.sim.EpanetSimulator(wn)
>>> results = sim.run_sim()

这时候我们所模拟的结果results是一个不可迭代对象

<class 'wntr.sim.results.SimulationResults'>

使用results.node 和results.link方法可以调用节点和管段的模拟结果,results.node和results.link是一个字典dict对象,字典的键key是结果的各种属性,字典的值是一个DataFrame,该DataFrame的index是以秒为单位的时间索引,colum是节点的名称
在这里插入图片描述
如图所示,这就是字典的值value

我们看看字典的键(结果属性)有哪些:

1.node的各类属性

>>> node_keys = results.node.keys()
>>> print(node_keys) 
dict_keys(['demand', 'head', 'pressure', 'quality'])

2.link的各类属性:

>>> link_keys = results.link.keys()
>>> print(link_keys) 
dict_keys(['flowrate', 'frictionfact', 'headloss', 'linkquality', 'rxnrate', 'setting', 'status', 'velocity'])

我们现在想把node的压力属性保存为csv文件:

# Simulate hydraulics
sim = wntr.sim.EpanetSimulator(wn)
results = sim.run_sim()

results.node['pressure'].to_csv(r'../mystudy1/test.csv',encoding = 'utf-8')

结果查看:
在这里插入图片描述
已经保存成功。

假如我们想一次性输出所有results.node和results.link的所有属性,代码如下:

# Simulate hydraulics
sim = wntr.sim.EpanetSimulator(wn)
results = sim.run_sim()
os.mkdir(r'../2021-5-12 results')#创建一个目录用于保存数据
link_keys = results.link.keys()#把results.link字典当中的键拿出来,等会儿遍历
for i in link_keys:
    results.link[i].to_csv(r'../2021-5-12 results/'+i+'.csv')

同理results.node的DataFrame输出过程不再赘述。

现在我们想对数据进行处理,比如我们想把每天固定时段的压力数据给列成一个DataFrame应该怎么做,如我们想把每一天的早上六点的管网压力数据拿出来比较:
从第一天开始,每天早上的六点意味着取index = 6* 6 * 3600的每一行组成一个新的csv文件,以下就是传感器1小时取一次数据时的操作。
我们想把每天的不同小时集合到一起,一共输出24个csv文件

import pandas as pd
import csv

#定义一个取index的函数方便我们知道取哪几个dataframe中的index
def Index_List(hours,days):
    index_list = []
    for i in range(1,days+1):
        index =(i-1)*24*3600+hours*3600
        index_list.append(index)
    return index_list

#打开文件
with open(r'flowrate.csv') as a:
    pd_ = pd.read_csv(a)
    #调整一下index,可以print一下看看对不对
    pd_.set_index('Unnamed: 0',inplace=True)
    #循环取值
    for i in range(24):
        print(Index_List(i,7))
        pd_final = pd_.loc[Index_List(i,7),:]
        pd_final.to_csv('every'+str(i)+'clock.csv')

之后传感器的取值时间缩短到10min,15min时也进行相应的调整