Python 用pandas计算局部导数
A有一个如下所示的CSV,其中它由三列组成,Python 用pandas计算局部导数,python,pandas,numpy,Python,Pandas,Numpy,A有一个如下所示的CSV,其中它由三列组成,ix,iy和iz,表示计算变量u'的点(x,y,z)。原始CSV()包含128^3行,描述了ix,iyiz的所有可能组合: i,ix,iz,iy,u' 0,1,1,1,-0.8696748576752853 1,1,1,2,2.3557976585107454 2,1,1,3,0.47209618683697663 3,1,1,4,-1.930481713597933 4,1,1,5,-1.7868247414530511 5,1,1,6,-0.560
ix
,iy
和iz
,表示计算变量u'
的点(x,y,z)。原始CSV()包含128^3行,描述了ix,iy
iz
的所有可能组合:
i,ix,iz,iy,u'
0,1,1,1,-0.8696748576752853
1,1,1,2,2.3557976585107454
2,1,1,3,0.47209618683697663
3,1,1,4,-1.930481713597933
4,1,1,5,-1.7868247414530511
5,1,1,6,-0.5603642778861779
6,1,1,7,0.24540750240253573
7,1,1,8,0.5505270314521304
8,1,1,9,-0.1954277406567968
9,1,1,10,-1.3521265193776344
我想取u'
对iy
的导数,换句话说,计算$\frac{u(x,y+1,z)-u(x,y,z}{dy}$。在我的第一次尝试中,我尝试了这样的方法(其中dy=8.68)
换句话说,对于iy
的某个固定值,我找到了ix
和iz
的所有组合,以及iy+1
时的所有组合,然后进行了商运算。结果似乎对几行是正确的,但对整个数据(128^3行)来说是正确的,需要一段荒谬的时间来计算代码。我想这是因为在计算商之前,代码搜索所有ix
和iz
的组合,出于某种原因,这似乎不太明智
我如何改进这一点?有另一种方法来评估这种操作?一个内置函数?您可以按
ix、iz、iy
(按此顺序)排序,并使用diff创建派生列der_y
:
df.sort_values(['ix','iz','iy'], axis=0, ascending=True, inplace=True, kind='quicksort', na_position='first')
dy=1
df['der_y'] = df["u'"].diff(periods=-1)/-dy
#you will need to replace when `iy==128` with your desired output (probably NaN)
df.loc[df['iy']==128,'der_y'] = None
此代码的输出:
i ix iz iy u' der_y
0 0 1 1 1 -0.869675 3.225473
1 1 1 1 2 2.355798 -1.883701
2 2 1 1 3 0.472096 -2.402578
3 3 1 1 4 -1.930482 0.143657
4 4 1 1 5 -1.786825 1.226460
5 5 1 1 6 -0.560364 0.805772
6 6 1 1 7 0.245408 0.305120
7 7 1 1 8 0.550527 -0.745955
8 8 1 1 9 -0.195428 -1.156699
9 9 1 1 10 -1.352127 NaN
问题中提供的for循环的输出:
[[ 3.22547252]
[-1.88370147]
[-2.4025779 ]
[ 0.14365697]
[ 1.22646046]
[ 0.80577178]
[ 0.30511953]
[-0.74595477]
[-1.15669878]]
你希望起点是什么?请检查我的答案。这应该可以完成工作,除非
iy=1
,你可以轻松地用你喜欢的任何东西替换它(可能的NaN
)我会检查,但它似乎不正确,因为你没有使用dy值。但我会检查…dy=1吗?如果不是一列,你可以将该列除以dy。请在帖子中找到我关于这一点的编辑。我想为最后一点设置NaN,iy=128
,这样我就可以将我的解决方案的第一行与你的进行比较。如你所知你可以看到,在我的代码中,iy
从1变为128,因为当实现iy
=129并使129+1时,代码失败。是的,我也这么想。在我的代码中,没有导入for循环x和z的顺序。再次感谢,帮了我很大的忙。
[[ 3.22547252]
[-1.88370147]
[-2.4025779 ]
[ 0.14365697]
[ 1.22646046]
[ 0.80577178]
[ 0.30511953]
[-0.74595477]
[-1.15669878]]