如何在Python中复现Excel SLOPE函数 计算风切变指数并新增DataFrame列
风切变指数Python实现方案
风切变指数的计算逻辑你已经很清楚了:对高度对数和风速对数做线性回归,返回的斜率就是目标值,和ExcelSLOPE函数的计算逻辑完全一致,以下是适配你的需求的可直接运行的实现:
前置依赖
需要用到pandas、numpy,线性回归可以选scipy.stats.linregress(可读性更高)或原生numpy.polyfit(不需要额外安装scipy),结果完全等价。
实现步骤
首先预设固定高度的对数数组,因为高度是固定值不需要重复计算:
import numpy as np import pandas as pd from scipy.stats import linregress # 高度顺序和你df中的风速列顺序一一对应 heights = [40, 60, 80] ln_height = np.log(heights)
定义逐行计算风切变的函数,替换函数内的列名为你df中实际的风速列名即可:
def get_shear_index(row): # 提取当前行三个高度的风速,取对数 ln_ws = np.log([row['ws_40m'], row['ws_60m'], row['ws_80m']]) # 线性回归取斜率作为风切变指数 return linregress(ln_height, ln_ws).slope # 若不想使用scipy,可替换为numpy.polyfit实现,结果一致: # def get_shear_index(row): # ln_ws = np.log([row['ws_40m'], row['ws_60m'], row['ws_80m']]) # return np.polyfit(ln_height, ln_ws, deg=1)[0]
对df逐行应用函数,新增结果列:
df['shear_index'] = df.apply(get_shear_index, axis=1)
注意事项
- 若风速存在0值或负值,取对数会得到NaN,最终计算结果也会为NaN,属于正常逻辑
- 计算逻辑和Excel
SLOPE(ln_ws序列, ln_h序列)的输出完全一致,不需要额外校准
内容的提问来源于stack exchange,提问作者gigWindcat
相关产品推荐
相关产品推荐

