Python 用于CFD风场分析的双变量数据帧插值
我正在为一项新的开发项目进行风力分析。我将能够预测一年中每一小时的气流模式,作为特定时间风速和风向的函数。当然,运行8760风力CFD模拟需要花费太多时间。我的方法是只运行16个模拟8个风向和2个风速,并根据这些结果插值流量分布 为了让您了解数据的外观,我创建了一个简化的案例Python 用于CFD风场分析的双变量数据帧插值,python,pandas,group-by,interpolation,resampling,Python,Pandas,Group By,Interpolation,Resampling,我正在为一项新的开发项目进行风力分析。我将能够预测一年中每一小时的气流模式,作为特定时间风速和风向的函数。当然,运行8760风力CFD模拟需要花费太多时间。我的方法是只运行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]) df
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的数量级可以是100000
现在,我需要风速ws和风向wd中间值的流量分布X,Y,Z,v。我希望能够聚合数据,并获得速度场v在每个点X,Y,Z的线性插值
将其放在公式中:X,Y,Z=fdata,ws,wd
我想我需要使用groupby函数,但是找不出一种方法来使用两个变量
此外,您是否认为数据面板对于此类数据更适合于数据结构?如果您想查看以两个变量为条件的分布特征,您可以按以下步骤进行操作:
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的panel软件包过去缺少标准数据帧的许多功能。我相信最近有一些恢复,但我知道的不多,因为我没有真正使用它。当然有人可以在这里插手。嗨,谢谢你的回复。你所描述的方法是平均所有东西,甚至是坐标。计算网格的坐标节点应保持原样。只有速度值v应该在整个网格上取平均值。我已经在excel中准备了这组示例数据。这应该只是您自己编写代码的起点。你可以定义任何你喜欢的lambda函数。如果只想返回特定列的平均值,请尝试lambda x:x['v'].mean。我最终使用了另一种方法。我首先将速度未知的数据帧附加到包含所有模拟数据的第一个数据帧。然后,我通过对风向进行组合来剪切这个新的数据帧。在这一点上,我按wd、X、Y、Z对表格进行排序。这为每个网格节点留下了很好的间隙,我可以使用dataframe插值函数通过插值来填充。它使用小样本数据测试。将在这些天内尝试使用全套数据。