2015-04-07 75 views
0

我有一個代碼,它可以計算x和y變量(theil-sen斜率)的斜率,並且我希望根據csv中的特定列值在列表中運行此值文件。我的文件是這樣的:僅通過唯一列id的循環功能

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有一個斜率函數,但它是一個錯誤的計算。

在此先感謝。

回答

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功能。

+0

似乎適用於21008站,但對於210019它返回南,南。爲什麼它的價值正是我嘗試使用時發生的情況:stat = df.groupby(['station_id'])。apply(lambda x:theil_sen(x ['Sum'],x ['year'])) –

+0

我將你的數據從上面複製到三個數組中,它對我很有用(你的熊貓方法正是我所想的)。你確定數據是正確讀取的嗎? – fetteelke

+0

嗯。我正在讀取來自熊貓的csv文件中的數據,這些數據與我發佈的內容完全相同。袒護我,我是python的新手,你是什麼意思加載作爲3陣列? –