赞
踩
首先设置模型参数
- import numpy as np
- import pandas as pd
- import math
- df = pd.read_excel(r"C:\Users\Admin\Desktop\pet.xlsx")
- df = df.fillna(0)
- print(df)
- WM,WUM,WLM,WDM,b,K,C,FC,F,T,CG,L,CR = 120,15,85,20,0.3,0.95,0.14,15,2856,24,0.9,5,0.5 # F单位为km^2 T单位为h
- Sm,KI,KG,EX,FR1,CI,Q = 20,0.2,0.5,1.5,0.4175,0.9,5.6
- WMM = (1+b)*WM
- U = F / (3.6 * T)
- SMM = Sm * (1+EX)
我的数据是excel数据其中有流域面平均雨量和蒸发资料
首先是设置一个for循坏我一共5000多行降雨数据,设置一个for循坏
- for i in range(0,5479):
- # 计算土湿
- if i == 0:
- df.loc[i, "WU"] = 0
- df.loc[i,"WL"] = 2.2
- df.loc[i, "WD"] = 20
- df.loc[i, "EP"] = K * df.loc[i, "E0"]
- if df.loc[i, "WU"] + df.loc[i, "P"] >= df.loc[i, "EP"]:
- df.loc[i, "EU"] = df.loc[i, "EP"]
- df.loc[i, "EL"] = 0
- df.loc[i, "ED"] = 0
- if df.loc[i, "WU"] + df.loc[i, "P"] < df.loc[i, "EP"] and df.loc[i, "WL"] >= C * WLM:
- df.loc[i, "EU"] = df.loc[i, "WU"] + df.loc[i, "P"]
- df.loc[i, "EL"] = (df.loc[i, "EP"] - df.loc[i, "EU"]) * df.loc[i, "WL"] / WLM
- df.loc[i, "ED"] = 0
- if df.loc[i, "WU"] + df.loc[i, "P"] < df.loc[i, "EP"] and df.loc[i, "WL"] < C * WLM and df.loc[i, "WL"] >= C * (df.loc[i, "EP"] - df.loc[i, "EU"]):
- df.loc[i, "EU"] = df.loc[i, "WU"] + df.loc[i, "P"]
- df.loc[i, "EL"] = C * (df.loc[i, "EP"] - df.loc[i, "EU"])
- df.loc[i, "ED"] = 0
- if df.loc[i, "WU"] + df.loc[i, "P"] < df.loc[i, "EP"] and df.loc[i, "WL"] < C * (
- df.loc[i, "EP"] - df.loc[i, "EU"]):
- df.loc[i, "EU"] = df.loc[i, "WU"] + df.loc[i, "P"]
- df.loc[i, "EL"] = df.loc[i, "WL"]
- df.loc[i, "ED"] = C * (df.loc[i, "EP"] - df.loc[i, "EU"]) - df.loc[i, "EL"]
- df.loc[i, "E"] = df.loc[i, "EU"] + df.loc[i, "EL"] + df.loc[i, "ED"]
- df.loc[i, "PE"] = df.loc[i, "P"] - df.loc[i, "E"]
- df.loc[i, "W"] = df.loc[i, "WU"] + df.loc[i, "WL"] + df.loc[i, "WD"]
- else:
- dw = df.loc[i-1,"PE"] - df.loc[i-1,"R"] #这边需要连接下面R,否则会报错
- df.loc[i,"WU"] = df.loc[i-1,"WU"] + dw
- df.loc[i,"WL"] = df.loc[i-1,"WL"]
- df.loc[i,"WD"] = df.loc[i-1,"WD"]
- if df.loc[i,"WU"] < 0 :
- df.loc[i,"WL"] = df.loc[i-1,"WL"] + dw + df.loc[i-1,"WU"]
- df.loc[i,"WD"] = df.loc[i-1,"WD"]
- df.loc[i,"WU"] = 0
- if df.loc[i,"WL"] < 0:
- df.loc[i,"WD"] = df.loc[i-1,"WD"] + dw + df.loc[i-1,"WU"] + df.loc[i-1,"WL"]
- df.loc[i,"WU"] = 0
- df.loc[i,"WL"] = 0
- if df.loc[i,"WD"] < 0:
- df.loc[i,"WU"] = 0
- df.loc[i,"WD"] = 0
- df.loc[i,"WL"] = 0
- if df.loc[i,"WU"] > WUM:
- df.loc[i,"WU"] = WUM
- df.loc[i,"WL"] = df.loc[i-1,"WL"] + dw - WUM + df.loc[i-1,"WU"]
- df.loc[i,"WD"] = df.loc[i-1,"WD"]
- if df.loc[i,"WL"] > WLM:
- df.loc[i,"WU"] = WUM
- df.loc[i,"WL"] = WLM
- df.loc[i,"WD"] = df.loc[i-1,"WD"] + dw - WLM - WUM + df.loc[i-1,"WU"] + df.loc[i-1,"WL"]
- df.loc[i,"EP"] = K * df.loc[i,"E0"]
- if df.loc[i,"WU"] + df.loc[i,"P"] >= df.loc[i,"EP"]:
- df.loc[i,"EU"] = df.loc[i,"EP"]
- df.loc[i,"EL"] = 0
- df.loc[i,"ED"] = 0
- if df.loc[i,"WU"] + df.loc[i,"P"] < df.loc[i,"EP"] and df.loc[i,"WL"] >= C * WLM:
- df.loc[i,"EU"] = df.loc[i,"WU"] + df.loc[i,"P"]
- df.loc[i,"EL"] = (df.loc[i,"EP"] - df.loc[i,"EU"]) * df.loc[i,"WL"] / WLM
- df.loc[i,"ED"] = 0
- if df.loc[i,"WU"] + df.loc[i,"P"] < df.loc[i,"EP"] and df.loc[i,"WL"] < C * WLM and df.loc[i,"WL"] >= C * (df.loc[i,"EP"]-df.loc[i,"EU"]):
- df.loc[i,"EU"] = df.loc[i,"WU"] + df.loc[i,"P"]
- df.loc[i,"EL"] = C * (df.loc[i,"EP"] - df.loc[i,"EU"])
- df.loc[i,"ED"] = 0
- if df.loc[i,"WU"] + df.loc[i,"P"] < df.loc[i,"EP"] and df.loc[i,"WL"] < C * (df.loc[i,"EP"]-df.loc[i,"EU"]):
- df.loc[i,"EU"] = df.loc[i,"WU"] + df.loc[i,"P"]
- df.loc[i,"EL"] = df.loc[i,"WL"]
- df.loc[i,"ED"] = C * (df.loc[i,"EP"] - df.loc[i,"EU"]) - df.loc[i,"EL"]
- df.loc[i,"E"] = df.loc[i,"EU"] + df.loc[i,"EL"] + df.loc[i,"ED"]
- df.loc[i,"PE"] = df.loc[i,"P"] - df.loc[i,"E"]
- df.loc[i,"W"] = df.loc[i,"WU"] + df.loc[i,"WL"] + df.loc[i,"WD"]
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreBlack.png)
再根据自己的要求计算R
- # 计算R
- a = WMM * (1- math.pow((1-df.loc[i,"W"]/WM),1/(1+b)))
- if i ==0:
- if df.loc[i,"PE"] > 0:
- if a + df.loc[i,"PE"] <= WMM:
- df.loc[i,"R"] = df.loc[i,"PE"] + df.loc[i,"W"] - WM + WM * math.pow(1-((df.loc[i,"PE"]+a)/WMM),b+1) # df["R"][i] = df["PE"][i] + df["W"][i] - WM + WM * math.pow(1 - ((df["PE"][i] + a) / WMM), b + 1)
- if a + df.loc[i,"PE"] > WMM:
- df.loc[i,"R"] = df.loc[i,"PE"] - (WM - df.loc[i,"W"])
- if df.loc[i,"R"] < 0:
- df.loc[i,"R"] = 0
- else:
- if df.loc[i,"PE"] > 0:
- if a + df.loc[i, "PE"] <= WMM:
- df.loc[i, "R"] = df.loc[i, "PE"] + df.loc[i, "W"] - WM + WM * math.pow(1 - ((df.loc[i, "PE"] + a) / WMM),b + 1) # df["R"][i] = df["PE"][i] + df["W"][i] - WM + WM * math.pow(1 - ((df["PE"][i] + a) / WMM), b + 1)
- if a + df.loc[i, "PE"] > WMM:
- df.loc[i, "R"] = df.loc[i, "PE"] - (WM - df.loc[i, "W"])
- if df.loc[i, "R"] < 0:
- df.loc[i, "R"] = 0
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreBlack.png)
在计算产流面积
- # 计算流域产流面积
- if i == 0:
- if df.loc[i,"R"] > 0 :
- df.loc[i,"FR"] = df.loc[i,"R"] / df.loc[i,"PE"]
- if df.loc[i,"FR"] >1:
- df.loc[i,"FR"] =1
-
- else:
- df.loc[i,"FR"] = FR1
- else:
- if df.loc[i, "R"] > 0:
- df.loc[i, "FR"] = df.loc[i, "R"] / df.loc[i, "PE"]
- if df.loc[i, "FR"] > 1:
- df.loc[i, "FR"] = 1
- else:
- df.loc[i, "FR"] = df.loc[i-1,"FR"]
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreBlack.png)
这边是二水源代码
- # 划分二水源
- # if i == 0:
- # if df.loc[i, "R"] > 0:
- # df.loc[i, "FR"] = df.loc[i, "R"] / df.loc[i, "PE"]
- # if df.loc[i,"FR"] > 1:
- # df.loc[i,"FR"] = 1
- # if df.loc[i, "FR"] > 0:
- # if df.loc[i, "PE"] > FC:
- # df.loc[i, "RS"] = (df.loc[i, "PE"] - FC) * df.loc[i, "FR"]
- # df.loc[i, "RG"] = df.loc[i, "R"] - df.loc[i, "RS"]
- # if df.loc[i, "PE"] <= FC:
- # df.loc[i, "RS"] = 0
- # df.loc[i, "RG"] = df.loc[i, "R"]
- # if df.loc[i, "FR"] < 0:
- # df.loc[i, "FR"] = 0
- # df.loc[i, "RS"] = 0
- # df.loc[i, "RG"] = 0
- # if df.loc[i, "R"] == 0:
- # df.loc[i, "RS"] = 0
- # df.loc[i, "RG"] = 0
- # else:
- # if df.loc[i,"R"] > 0 :
- # df.loc[i,"FR"] = df.loc[i,"R"] / df.loc[i,"PE"]
- # if df.loc[i,"FR"] > 0:
- # if df.loc[i,"PE"] > FC:
- # df.loc[i,"RS"] = (df.loc[i,"PE"] - FC) * df.loc[i,"FR"]
- # df.loc[i,"RG"] = df.loc[i,"R"] - df.loc[i,"RS"]
- # if df.loc[i,"PE"] <= FC:
- # df.loc[i,"RS"] = 0
- # df.loc[i,"RG"] = df.loc[i,"R"]
- # if df.loc[i,"FR"] < 0:
- # df.loc[i,"FR"] = 0
- # df.loc[i,"RS"] = 0
- # df.loc[i,"RG"] = 0
- # if df.loc[i,"R"] == 0:
- # df.loc[i,"RS"] = 0
- # df.loc[i,"RG"] = 0
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreBlack.png)
三水源
- # 划分三水源
- if i == 0: # 第一时段计算
- df.loc[i, "S1"] = 3.4525
- if df.loc[i,"PE"] > 0:
- AU = SMM * (1 - math.pow((1-(((df.loc[i,"S1"]*FR1)/df.loc[i,"FR"])/Sm)),1/(1+EX)))
- if df.loc[i,"PE"] + AU < SMM:
- df.loc[i,"RS"] = df.loc[i,"FR"] * (df.loc[i,"PE"] +(df.loc[i,"S1"] * FR1)/df.loc[i,"FR"] - Sm +
- Sm *math.pow((1-(df.loc[i,"PE"] +AU)/SMM),1+EX))
- if df.loc[i,"PE"] + AU >= SMM:
- df.loc[i,"RS"] = df.loc[i,"FR"] * (df.loc[i,"PE"] + (df.loc[i,"S1"] * FR1)/df.loc[i,"FR"] - Sm)
- S = (df.loc[i,"S1"] * FR1)/df.loc[i,"FR"] + (df.loc[i,"R"] - df.loc[i,"RS"])/df.loc[i,"FR"]
- df.loc[i,"RI"] = KI * S *df.loc[i,"FR"]
- df.loc[i,"RG"] = KG * S *df.loc[i,"FR"]
- df.loc[i+1,"S1"] = S*(1-KI-KG)
- else:
- S = (df.loc[i, "S1"] * FR1) / df.loc[i, "FR"]
- df.loc[i + 1, "S1"] = S * (1 - KG - KI)
- df.loc[i, "RS"] = 0
- df.loc[i, "RG"] = KI*S * df.loc[i,"FR"]
- df.loc[i, "RI"] = KG * S *df.loc[i,"FR"]
- else: #其余时段计算
- if df.loc[i, "PE"] > 0:
- AU = SMM * (1 - math.pow((1-(((df.loc[i,"S1"]*df.loc[i-1,"FR"])/df.loc[i,"FR"])/Sm)),1/(1+EX)))
- if df.loc[i,"PE"] + AU < SMM:
- df.loc[i,"RS"] = df.loc[i,"FR"] * (df.loc[i,"PE"] +(df.loc[i,"S1"] * df.loc[i-1,"FR"])/df.loc[i,"FR"] - Sm +
- Sm *math.pow((1-(df.loc[i,"PE"] +AU)/SMM),1+EX))
- if df.loc[i,"PE"] + AU >= SMM:
- df.loc[i,"RS"] = df.loc[i,"FR"] * (df.loc[i,"PE"] + (df.loc[i,"S1"] * df.loc[i-1,"FR"])/df.loc[i,"FR"] - Sm)
- S = (df.loc[i,"S1"] * df.loc[i-1,"FR"])/df.loc[i,"FR"] + (df.loc[i,"R"] - df.loc[i,"RS"])/df.loc[i,"FR"]
- df.loc[i,"RI"] = KI * S *df.loc[i,"FR"]
- df.loc[i,"RG"] = KG * S *df.loc[i,"FR"]
- df.loc[i+1,"S1"] = S*(1-KI-KG)
- else:
- S = (df.loc[i, "S1"] * df.loc[i-1,"FR"]) / df.loc[i, "FR"]
- df.loc[i + 1, "S1"] =S * (1 - KG - KI)
- df.loc[i, "RS"] = 0
- df.loc[i, "RG"] = KG *S *df.loc[i,"FR"]
- df.loc[i, "RI"] = KI * S *df.loc[i,"FR"]
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreBlack.png)
二水源汇流
- # # 计算二水源汇流
- # if i == 0:
- # df.loc[i, "Qs"] = df.loc[i, "RS"] * U
- # df.loc[i,"Qg"] = 5.6
- # df.loc[i, "QT"] = df.loc[i, "Qs"] + df.loc[i, "Qg"]
- # df.loc[i,"Qt"] = 5.6
- # else:
- # df.loc[i,"Qs"] = df.loc[i,"RS"] * U
- # df.loc[i,"Qg"] = CG * df.loc[i-1, "Qg"] + (1-CG) * df.loc[i,"RG"] * U
- # df.loc[i,"QT"] = df.loc[i,"Qs"] + df.loc[i,"Qg"]
- # df.loc[i,"Qt"] = CR * df.loc[i-1,"Qt"] + (1 - CR) * df.loc[i-L,"QT"]
三水源汇流
- # 计算三水源汇流
- if i == 0:
- df.loc[i,"QS"] = df.loc[i,"RS"] * U
- df.loc[i,"QI"] = 1/3 * Q
- df.loc[i,"QG"] = 1/3 * Q
- df.loc[i, "QT"] = df.loc[i, "QS"] + df.loc[i, "QI"] + df.loc[i, "QG"]
- if i >0:
- df.loc[i, "QS"] = df.loc[i, "RS"] * U
- df.loc[i,"QI"] = CI * df.loc[i-1,"QI"] + (1-CI)*df.loc[i,"RI"]*U
- df.loc[i,"QG"] = CG* df.loc[i-1,"QG"]+(1-CG)*df.loc[i,"RG"] *U
- df.loc[i,"QT"] = df.loc[i,"QS"]+df.loc[i,"QI"]+df.loc[i,"QG"]
- if i >=0 and i <= L:
- df.loc[i,"Qt"] = Q
- if i >= L+1:
- df.loc[i,"Qt"] = df.loc[i-1,"Qt"]*CR+(1-CR) * df.loc[i-L,"QT"]
最后写入excel表,保留4位小数
- ds = pd.DataFrame(df)
- ds.to_excel(r"C:\Users\Admin\Desktop\新安江1.xlsx",float_format='%.4f')
最后三水源结果
写到这感觉自己写的太麻烦了,希望以后能够改进吧
这边蒸散发还是借鉴了一个哥们的代码,链接在这边:(26条消息) Python数据分析实例,利用Pandas建立流域三层蒸发和蓄满产流模型_三层蒸发模型代码_Joyonlyonly的博客-CSDN博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。