使用CFD进行风分析的Pandas DataFrame双变量插值

0 投票
1 回答
865 浏览
提问于 2025-04-18 13:06

我正在为一个新开发项目进行风力分析。我想预测这个项目在一年中每个小时的空气流动模式,这个模式会根据那个小时的风速和风向来变化。当然,运行8760次风力计算模拟是非常耗时的。所以我的方法是只运行16次模拟(8个风向和2个风速),然后根据这些结果来推算流动分布。

为了让你更好地理解数据的样子,我创建了一个简化的案例。

X = pd.Series([1,2,3,4,5])
Y = pd.Series([1,2,3,4,5])
Z = pd.Series([1,2,3,4,5])
v1 = pd.Series([2,6,1,7,8])
df1 = pd.DataFrame({'X':X,'Y':Y,'Z':Z,'v':v1})
df1['ws']=3
df1['wd']=180
v2 = pd.Series([3,1,4,2,2])
df2 = pd.DataFrame({'X':X,'Y':Y,'Z':Z,'v':v2})
df2['ws']=3
df2['wd']=0
v3 = pd.Series([2.5,2.3,1.3,7.2,1.4])
df3 = pd.DataFrame({'X':X,'Y':Y,'Z':Z,'v':v3})
df3['ws']=6
df3['wd']=180
v4 = pd.Series([2.4,5.6,6.1,2.3])
df4 = pd.DataFrame({'X':X,'Y':Y,'Z':Z,'v':v4})
df4['ws']=6
df4['wd']=0
df=pd.concat([df1,df2,df3,df4])

请注意,最后两列包含了该次模拟的气象风速和风向。点的数量(X,Y,Z)可能会达到10万个。

现在假设我想要一个中间风速(ws)和风向(wd)下的流动分布(X,Y,Z,v)。我希望能够整理这些数据,并在每个点(X,Y,Z)上获得速度场(v)的线性插值。用公式来说就是:(X,Y,Z)=f(data,ws,wd)

我想我需要使用groupby函数,但我还没找到用两个变量来实现的方法。

另外,你觉得数据面板会更适合这种数据结构吗?

1 个回答

0

如果你想查看两个变量的分布特征,可以按照以下方式进行:

In[10]: df.groupby(['ws', 'wd']).apply(lambda x: x.mean())
Out[10]: 
        X  Y  Z     v  ws   wd
ws wd                         
3  0    3  3  3  2.40   3    0
   180  3  3  3  4.80   3  180
6  0    3  3  3  4.10   6    0
   180  3  3  3  2.94   6  180

关于面板数据,这通常是个人喜好的问题,对吧?你是否考虑想要概括的X、Y、Z维度,或者不考虑。如果我个人的话,通常不会这样做,那样的话你就只剩下时间这个维度,这样就变成了时间序列,而不是面板数据。

此外,pandas的面板包以前缺少很多标准数据框所具备的功能。我觉得最近有一些改善,但我不太了解,因为我其实不怎么使用它。肯定还有其他人可以在这方面补充。

撰写回答