streamlit快速搭建芝加哥雨型应用

目的

通过streamlit快速搭建芝加哥雨型应用,该应用实现以下功能:

  • 内置重庆各区县的暴雨强度计算公式,
  • 支持自定义城市的暴雨公式参数,
  • 支持雨型生成,输出图片和文字
  • 提供降雨历时、汇水面积、径流系数输入,支持径流量计算
  • 在线部署,网页使用。

原型

用 obsidian excalidraw 简单绘制原型。

image.png

主要原理

主要功能实现

雨强计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def intensity(A, B, C, N, t, P):
    """
    雨强计算。
    参数:
    - a,b,c,n: 参数。
    - p (float): 设计重现期(单位:年)。
    - t (np.ndarray): 分钟数组
    返回:
    - its: 雨强(单位:mm/min)。
    """
    a = A * 0.4 * (1 + C * math.log10(P))
    its = a * ((1 - N) * t + B) / np.power(t + B, N + 1)
    return its
   
q = (A * (1 + C * math.log10(P))) / ((duration_minutes + B) ** N)

雨强分布计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def rainCalc_single_period(A, B, C, N, T: int, p: float, peak_ratio: float):
"""
计算单一时段内的降雨强度分布。
参数:
- T (int): 降雨持续时间(单位:分钟)。
- p (float): 设计重现期(单位:年)。
- peak_ratio (float): 雨强峰值所在时间占总降雨历时的比例。
返回:
- np.ndarray: 随时间变化的降雨强度数组(单位:mm/min)。
内部参数:
- t (np.ndarray): 分钟数组
- peak_time (float): 峰值时间
"""
# ...函数实现代码...
t = np.arange(0, T)
peak_time = T * peak_ratio
itAr = np.zeros(len(t))
# 计算雨强
for i in range(len(t)):
if t[i] < peak_time:
itAr[i] = intensity(A, B, C, N, (peak_time - t[i]) / peak_ratio, p) / 60
else:
itAr[i] = intensity(A, B, C, N, (t[i] - peak_time) / peak_ratio, p) / 60
return itAr

其余功能实现均较为简单,项目所有代码均开源在 GitHub,有兴趣的可以去参观,点个 star 最好了,仓库如下:
maoyu92/Chicago_rain_pattern (github.com)
如果发现代码有不对的地方,也留言提醒我一下。

应用部署

Streamlit 是非常好用的一个应用框架,支持免费部署一个应用,非常方便。

部署 GitHub

应用部署在 GitHub。通过 git 将本地仓库部署在 GitHub 上,具体方法可参考:
在vscode中使用git-新手向_新手vscode git-CSDN博客
这里跳过。

Streamlit 应用发布

登录 Streamlit,登录后点击右上角 create app。
选择 I have an app。
image.png

在连接上自己的 GitHub 后,依次选择仓库地址,分支,主文件,定义 url 名称,点击 depoly。
image.png

稍等片刻,如果一切顺利就成功了,非常丝滑~

注意事项

  1. 仓库文件需要包括 requirement.txt,为项目运行需要的环境。
  2. 注意代码引用文件需要用相对应用的方式,不要绝对引用。

成果预览

网址:Streamlit (chicagorainpattern.streamlit.app)

image.png

制作 exe 发布

nativefier

安装nativefier
如果安装不快或者安装不成功,可以试下先换为阿里源。

1
2
npm config set registry https://registry.npmjs.org/
npm install -g nativefier
1
2
3
nativefier --name '<app.exe name>' '<streamlit sharing website url>' --platform <'windows' or 'mac' or 'linux'>

nativefier --name "rainmaker" "https://chicagorainpattern.streamlit.app/" --platform windows

完成后会在执行命令的目录下生成一个可执行文件。
image.png

image.png

点击就可以直接运行
image.png

这种方法感觉像是内置了一个浏览器,缺点也很明显,只能根据网址生成,如果取消已生成的 web 应用,则无法生效。可能也是防止可以随便生成应用吧。还有就是文件比较大,分享比较麻烦,还不如直接发网址。

PyInstaller

包装 PyInstaller包

1
pip install pyinstaller

检查是否安装

1
pip show pyinstaller

将 pyinstaller. exe 路径放入系统变量
通常在 C:\ProgramData\anaconda 3\Scripts 这个下面。

创建一个.spec文件

1
pyinstaller --name rainmaker main.py

遇到问题
pathlib与 pyinstaller 不兼容

1
pip uninstall pathlib

继续执行创建. Spec 文件
运行了半天,结束后出现好几个文件
image.png

修改. Spec 文件
主要修改内容

  1. Pathex 路径正确
  2. Datas 都包括所有信息和位置关系
  3. Hookspath 指定自定义 hook 路径
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

a = Analysis(
['main.py'],
pathex=['D:\\BaiduSyncdisk\\pythonprograms\\rainmaker'], # 确保路径正确
binaries=[],
datas=[('raincode.xlsx', '.'), ('hook/hook-streamlit.py', 'hook')],
hiddenimports=[], # 根据需要添加隐藏导入
hookspath=['./hooks'], # 指定自定义hook路径
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0, # 根据需求调整
)
pyz = PYZ(a.pure)

exe = EXE(
pyz,
a.scripts,
[],
exclude_binaries=True,
name='rainmaker',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True, # 或False,根据应用类型
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
coll = COLLECT(
exe,
a.binaries,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='rainmaker',
)

使用. Spec 文件打包

1
pyinstaller rainmaker.spec

失败,感觉打包还是有点难度。后面有空继续

打包完成后,在 dist/ (Windows上可能是 dist/YourAppName.exe)找到可执行文件,并运行它来测试打包是否成功。

1
2
pyinstaller --onefile --additional-hooks-dir=./hooks run.py --clean
pyinstaller --onefile --additional-hooks-dir=./hooks main.py --clean

streamlit快速搭建芝加哥雨型应用
https://maoyu92.github.io/2024/06/16/02 生态环境/streamlit快速搭建芝加哥雨型应用/
作者
陈文茂
发布于
2024年6月16日
许可协议