计算数据框中每个点的斜率

时间:2019-05-07 21:53:23

标签: python pandas

使用Python 2.7:所以我有一个名为edge_err的数据框,如下所示:

# 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

但是我确信有一种pandas的方式可以完成此任务。我已经看到其他问题可以解决此问题,但不能完全适合我的情况。如何计算每个点之间的斜率?

第一个观测值应保留在表中,但斜率值为0NaN

2 个答案:

答案 0 :(得分:1)

由于某些原因,对数函数未包含在熊猫中,但与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函数调用。

答案 1 :(得分:1)

您还可以使用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