计算Datafram中每个点的斜率

2024-10-02 22:34:03 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Python2.7:

# Simplified DF
d = {'model_id': [1, 2, 4, 8, 16], 't_err':[.715130, .236947, .002106, .001043, .000512]}
pd.DataFrame(data=d)

# Slope is the variable I want to compute

      model_id  t_err   slope
0         1  0.715130   0 
1         2  0.236947   1.593640
2         4  0.002106   6.813878
3         8  0.001043   1.013115
4        16  0.000512   1.026592

我想计算每个观测值在model_idt_err之间的斜率。当前我添加slope列的代码如下所示:

def slope(x, y):
        slope_list = []
        for xi in range(0, len(x)-1):
                denom = x[xi+1] - x[xi]
                num = y[xi+1] - y[xi]
                slope = num / denom
                slope_list.append(slope)

        return slope_list

    transformx = [np.log10(1/float(x)) for x in edge_err.model_id.tolist()]
    transformy = [np.log10(x) for x in edge_err.t_err.tolist()]

    edge_err['slope'] = [0] + slope(transformx, transformy)

我必须转换这些数字,因为一个特殊的原因与斜率的计算无关,因此transformxtransformy

但我确信有一种方法可以做到这一点。我见过其他问题解决这个问题,但不太适合我的情况。我该如何计算每个点之间的斜率?你知道吗

第一个观测值应保留在表中,但斜率值应为0NaN。你知道吗


Tags: inidformodelnpnumslopelist
2条回答

也可以使用assign()在一个链中完成所有操作:

edge_err.assign(transformx = -np.log10(edge_err.model_id)
            ,   transformy = np.log10(edge_err.t_err)) \
        .assign(slope = lambda x: (x.transformy.diff())/(x.transformx.diff()))
#   model_id     t_err  transformx  transformy     slope
#0         1  0.715130    -0.00000   -0.145615       NaN
#1         2  0.236947    -0.30103   -0.625349  1.593641
#2         4  0.002106    -0.60206   -2.676542  6.813915
#3         8  0.001043    -0.90309   -2.981716  1.013766
#4        16  0.000512    -1.20412   -3.290730  1.026523

由于某些原因,pandas中没有包含对数函数,但它与numpy函数一起使用非常简单(而且非常有效)。你知道吗

import pandas as pd
import numpy as np
d = {'model_id': [1, 2, 4, 8, 16], 't_err':[.715130, .236947, .002106, .001043, .000512]}
d = pd.DataFrame(d)
transformx = -d['model_id'].apply(np.log10)
transformy = d['t_err'].apply(np.log10)
denom = transformx.diff()
num = transformy.diff()
slope = (num / denom).fillna(0)


slope
 0    0.000000
 1    1.593641
 2    6.813915
 3    1.013766
 4    1.026523
 dtype: float64

如果NaN足够,您可以简单地删除fillna函数调用。你知道吗

相关问题 更多 >