2013-07-08 89 views
0

我是python新手,正在爲功能customer_state努力工作。 我有另一個從csv文件中獲取數據的函數。我想要得到的總和從該文件中的列,也得到sm1(這使我增長速度在時間t(天) 這是我迄今所做的:如何按範圍(366)劃分常量?

def del_pass(): 
    reader = csv.DictReader(open("data.csv", "rb")) 
    all_rows = list() 
    for row in reader: 
     all_rows.append(row) 
    return all rows  

def get_one_column(name): 
    column_list= list() 
    rows = del_pass() 
    for row in rows: 
     value = row(name) 
     if value =='': 
      value = 0 
     else: 
      value = int(value) 
    column_list.append(value) 
    return column_list 

def customer_state(x): 
    sm = sum(x) 
    t = range(366) 
    sm1 = sm + (0.07 * (t/365) * sm) 
    return sm, sm1 

def example_use1(): 
    column_name ="totcust" 
    column = get_one_column(column_name) 
    column_stats = customer_state(column) 
    print column_stats 

每個功能似乎工作正常,除了customer_state(x),這給了我下面的錯誤。

sm1 = (sm + ((0.07/t) * sm)) 
TypeError: unsupported operand type(s) for /: 'float' and 'list' 
+2

你認爲'0.07/range(366)'的結果是什麼?我無法想象你會在那裏得到什麼結果。 –

+0

你能舉一個更小的例子嗎? –

+0

正如消息所示,範圍(366)不是一個數字,而是一個列表。嘗試打印(範圍(366)),看看它在說什麼。 – gcandal

回答

0

我假設0.07 /範圍(366)應該返回在範圍(366)中的相應元素除以0.07列表?

在這種情況下,喲u能既可以使用一個列表理解:

sm1 = [sm + ((0.07/t) * sm)) for t in xrange(1,366)] 

,或者因爲你施加的numpy的標籤的問題,初始化噸作爲numpy的數組:

t = numpy.mgrid[1:366] 
sm1 = sm + (0.07/t) * sm 

然後逐元素劃分將被用於以及。

在這兩種情況下:記住索引和因此範圍列表從零開始,因此這些列表中的第一個元素將是Inf。

+0

YES是我所需要的。謝謝 –

+0

對不起,我稍微更改了公式sm1 = sm +(0.07 *(t/365)* sm),並使用上述方法不起作用 –

+0

我編輯了我的解決方案 - 應該沒有零分與列表理解錯誤了。 – sebastian