2012-11-29 12 views
2

我需要收集數據來證明我的假設,即用你的慣用手打字是不是與你的非慣用手打字快。我寫了下面的代碼給參與者一個隨機詞,然後他們必須複製它。代碼將花費多長時間來鍵入每個單詞,然後將該數據保存到新文件。對於每個測試的參與者,都會創建一個新的CSV文件。如何獲得來自不同文件中的數據,並組合成一個陣列中的蟒蛇?

現在我需要另寫腳本,會發現平均每手爲每個參與者,然後創建一個包含平均值,所以我可以創建一個圖,以證明我的假設是否是真正的一個陣列。我將如何去獲取來自不同文件的數據並將其組合成一個數組?

我的腳本:

import random 
import time 

name = raw_input('Enter name: ') # get some name for the file 
outfile = file(name + '.csv', 'w') # create a file for this user's data 

# load up a list of 1000 common words 
words = file('1-1000.txt').read().split() 

ntrials = 50 

answers = [] 
print """Type With Dominant Hand""" 
for i in range(ntrials): 
    word = random.choice(words) 
    tstart = time.time() 
    ans = raw_input('Please type ' + word + ': ') 
    tstop = time.time() 
    answers.append((word, ans, tstop - tstart)) 
    print >>outfile, 'Dominant', word, ans, tstop - tstart # write the data to the file 
    if (i % 5 == 3): 
     go = raw_input('take a break, type y to continue: ') 

print """Type With Nondominant Hand"""  
for i in range(ntrials): 
    word = random.choice(words) 
    tstart = time.time() 
    ans = raw_input('Please type ' + word + ': ') 
    tstop = time.time() 
    answers.append((word, ans, tstop - tstart)) 
    print >>outfile, 'Nondominant', word, ans, tstop - tstart # write the data to the file 
    if (i % 5 == 3): 
     go = raw_input('take a break, type y to continue: ') 

outfile.close() # close the file 

樣品結果從上面的腳本:

Dominant sit sit 1.81511306763 
Dominant again again 2.54711103439 
Dominant from from 1.53057098389 
Dominant general general 1.98939108849 
Dominant horse horse 1.93938016891 
Dominant of of 1.07597017288 
Dominant clock clock 1.6587600708 
Dominant save save 1.42030906677 
Nondominant story story 3.92807888985 
Nondominant of of 0.93910908699 
Nondominant test test 1.69210004807 
Nondominant low low 1.13296699524 
Nondominant hit hit 1.15252614021 
Nondominant you you 1.22019600868 
Nondominant river river 1.42011594772 
Nondominant middle middle 1.61595511436 

回答

0
persons = ["billy","bob","joe","kim"] 
num_dom,total_dom,num_nondom,total_nondom=0,0,0,0 
for person in persons: 
    data = file('%s.csv' %person, 'r').readlines() 
    for line in data: 
     if "Nondominant" in line: 
     num_nondom+=1 
     total_nondom+=int(line.split(' ')[-1].strip()) 
     elif "Dominant" in line: 
     num_dom+=1 
     total_nondom+=int(line.split(' ')[-1].strip()) 
     else: continue 
dom_avg = total_dom/num_dom 
nondom_avg = total_nondom/num_nondom 
print "Average speed with Dominant hand: %s" %dom_avg 
print "Average speed with Non-Dominant hand: %s" %nondom_avg 

與被攝對象的名稱填寫「個人」數組,然後你用討好什麼數據。

PS。 Heltonbiker記下了你的想法並添加了它。還通過添加strip來修復newline bug。

+0

它一直給我一個ValueError:無效的文字爲int()與基數10:'2.90565299988 \ n'for第9行total_nondom + = int(line.split('')[ - 1]) – user1864662

+1

替換爲'line .split('')[ - 1] .strip()'。該條將刪除'\ n'字符,然後您可以將其變爲int。我喜歡這個答案,但它應該包括環展示如何處理多個文件! – heltonbiker

0
def avg_one(filename): 
    vals = { 'Dominant': [], 'Nondominant': [] } 
    for line in input: 
     hand, _, _, t = split(line.strip()) 
     vals[hand].append(float(t)) 
    d = vals['Dominant'] 
    nd = vals['Nondominant'] 
    return (sum(d)/len(d), sum(nd)/len(nd)) 

data = [] 
for f in os.listdir(): 
    if f.endswith('.csv'): 
     data.append(avg_one(f)) 

doms, nondoms = zip(data) 

print "Dominant: " + repr(doms) 
print "Nondominant: " + repr(nondoms) 

這假定在相同的目錄中沒有其他.csv文件具有不同的格式(並且會失敗解析)。一般來說,這需要更多的錯誤檢查,但它可以實現這個想法。

1

這似乎是另一種語言,如果你不熟悉numpy的,但這裏的,它利用其優勢的解決方案(注意缺乏循環!)

爲了測試,我創建了第二個用戶數據文件,每個條目增加1秒。

import glob 
import numpy as np 

usecols = [0, 3] # Columns to extract from data file 
str2num = {'Dominant': 0, 'Nondominant': 1} # Conversion dictionary 
converters = {0: (lambda s: str2num[s])} # Strings -> numbers 

userfiles = glob.glob('*.csv') 
userdat = np.array([np.loadtxt(f, usecols=usecols, converters=converters) 
        for f in userfiles]) 

# Create boolean arrays to filter desired results 
dom = userdat[..., 0] == 0 
nondom = userdat[..., 0] == 1 

# Filter and reshape to keep 'per-user' layout 
usercnt, _, colcnt = userdat.shape 
domdat = userdat[dom ].reshape(usercnt, -1, colcnt) 
nondomdat = userdat[nondom].reshape(usercnt, -1, colcnt) 

domavgs = np.average(domdat, axis=1)[:, 1] 
nondomavgs = np.average(nondomdat, axis=1)[:, 1] 

print 'Dominant averages by user: ', domavgs 
print 'Non-dominant averages by user:', nondomavgs 

輸出:

Dominant averages by user:  [ 1.74707571 2.74707571] 
Non-dominant averages by user: [ 1.63763103 2.63763103] 

如果你打算做大量的分析,我會強烈建議讓你的頭部周圍numpy的。

+0

它保持給我一個IndexError:列表索引超出範圍和點到第7行userdat = np.array([np.loadtxt(F,usecols = usecols),用於userfiles F]) – user1864662

+0

行,我已經編輯的溶液以便您的原始文件格式將工作。我懷疑你在第一列之後沒有添加'0'或'1'的額外列;現在你不需要。 – subnivean

+0

其中最遺憾的「錯誤」,我與Python正在等待轉彎numpy的到我的主要日常工具不久製成。一旦你得到它,事情變得更容易......而且還有一些可能! – heltonbiker

相關問題