仅在唯一列id上循环一个函数

时间:2015-04-07 22:24:34

标签: python statistics

我有一个代码来计算x和y变量的斜率(theil-sen斜率),我想根据csv文件中的特定列值在一个值列表上运行它。我的文件看起来像这样:

station_id year Sum 210018 1917 329.946 210018 1918 442.214 210018 1919 562.864 210018 1920 396.748 210018 1921 604.266 210019 1917 400.946 210019 1918 442.214 210019 1919 600.864 210019 1920 250.748 210019 1921 100.266

我正在使用的功能是:

def theil_sen(x,y):

    n   = len(x)
    ord = numpy.argsort(x)
    xs  = x[ord]
    ys  = y[ord]
    vec1 = numpy.zeros( (n,n) )
    for ii in range(n):
        for jj in range(n):
            vec1[ii,jj] = ys[ii]-ys[jj]
    vec2 = numpy.zeros( (n,n) )
    for ii in range(n):
        for jj in range(n):
            vec2[ii,jj] = xs[ii]-xs[jj]
    v1    = vec1[vec2>0]    
    v2    = vec2[vec2>0]     
    slope = numpy.median( v1/v2 )
    coef  = numpy.zeros( (2,1) ) 
    b_0   = numpy.median(y)-slope*numpy.median(x)
    b_1   = slope
    res   = y-b_1*x-b_0 # residuals 

    return (b_0,b_1,res)

我想使用Sum作为函数中的y值year作为x值,并且只在每个唯一station_id值上运行函数。我的输出应该是:

210018: -117189, 61.29
210019: 164382, -85.45

我知道scipy有一个theil斜率函数,但这是一个不正确的计算。

提前致谢。

1 个答案:

答案 0 :(得分:1)

您可以使用numpy.unique()获取station_ids中的唯一值,然后循环遍历它们:

for id in numpy.unique(station_id):
    print id, theil_sen(year[station_id == id], Sum[station_id == id])

或者,您可能希望查看具有pandas支持和csv功能的groupby