我正在尝试定义一个程序来计算每个安全性的每日回报的平均值:
import csv
import numpy as np
def security_mean(com):
CSV = csv.reader(open("my_file.csv","rb"))
foo = False
old = 0
new = 0
mean = []
for row in CSV:
try:
if foo == True:
old = float(row[-1])
x = (new - old) / old
mean.append(x)
new = float(row[-1])
foo = True
else:
new = float(row[-1])
foo = True
except ValueError:
string = row[-1]
continue
value = np.mean(mean)
print string + ' mean: ' + str(value)
以下是my_file.csv
:
Date Open High Low Close Volume Adj Close
2013-09-27 874.82 877.52 871.31 876.39 1258800 876.39
2013-09-26 878.3 882.75 875 878.17 1259900 878.17
2013-09-25 886.55 886.55 875.6 877.23 1649000 877.23
2013-09-24 886.5 890.1 881.4 886.84 1467000 886.84
2013-09-23 896.15 901.59 885.2 886.5 1777400 886.5
2013-09-20 898.39 904.13 895.62 903.11 4345300 903.11
2013-09-19 905.99 905.99 895.4 898.39 1597900 898.39
2013-09-18 886.35 903.97 883.07 903.32 1934700 903.32
2013-09-17 887.41 888.39 881 886.11 1259400 886.11
2013-09-16 896.2 897 884.87 887.76 1336500 887.76
我可以使用数组使我的函数更小吗?怎么样?
感谢。
注意:每日退货公式:(x - y)/ y 或(x / y) - 1 ;其中x =今天Adj close,y =昨天Adj close
答案 0 :(得分:4)
您似乎可以使用np.loadtxt()
简化您的功能:
np.loadtxt('my_file.csv', skiprows=1, usecols=(1,2,3,4,5,6)).mean(axis=0)
答案 1 :(得分:3)
如果你在一个向量中读取接近的值,比如说adj_close,你可以写新的 - 旧的是一个向量,adj_close [1:] - adj_close [: - 1]。
import csv
import numpy as np
def security_mean(com):
CSV = csv.reader(open("my_file.csv","rb"))
CSV.next() # skip header row
adj_close = np.array([row[-1] for row in CSV], dtype=np.float32)
value = np.mean( (adj_close[1:] / adj_close[:-1] - 1. )
print string + ' mean: ' + str(value)