我有一个代码来计算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斜率函数,但这是一个不正确的计算。
提前致谢。
答案 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
。