仅在唯一列 id 上循环函数
Looping a function over unique column id's only
我有一个代码可以计算 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 有斜率函数,但计算不正确。
提前致谢。
你可以使用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
功能。
我有一个代码可以计算 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 有斜率函数,但计算不正确。
提前致谢。
你可以使用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
功能。