代码之家  ›  专栏  ›  技术社区  ›  dylanjm

计算数据帧中每个点的坡度

  •  0
  • dylanjm  · 技术社区  · 7 年前

    使用Python2.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_id t_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)
    

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

    但我确信 pandas

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   ilmarinen    7 年前

    出于某种原因,对数函数不包含在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

        2
  •  1
  •   jxc    7 年前

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