Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用pandas计算局部导数_Python_Pandas_Numpy - Fatal编程技术网

Python 用pandas计算局部导数

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

A有一个如下所示的CSV,其中它由三列组成,
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]]