我有一个DataFrame,2017年的日期索引为250个交易日,列的股票行情自动收录器为100。
因此,DataFrame是一个 250 x 100 矩阵,其中包含去年所有交易日中每只股票的每日收盘价序列。
我要对整个DataFrame进行的操作是应用numpy.log
操作来计算每只股票的日志日收益率-即将此日志操作应用于此DataFrame中的每一列。
虽然我在DataFrame的单列系列中查找了以前的文章来执行此操作,但我不知道在整个DataFrame的所有列中进行此操作的最佳方法是-思考应该我做类似的事情:
log_matrix1 = np.log(df[1:,:]/df[:-1,:])
这不起作用,因为我收到无法散列的类型错误。
非常感谢您的帮助!
答案 0 :(得分:2)
有几种不同的方法。我建议您使用NumPy数组。请注意,log(a / b) = log(a) - log(b)
对于自然对数是正确的。因此,您可以先取每个值的对数,然后取差。
这是一个示例数据框:
df = pd.DataFrame(np.random.rand(5, 5))
print(df)
0 1 2 3 4
0 0.698647 0.185940 0.656863 0.238429 0.746046
1 0.544250 0.240666 0.963219 0.398320 0.181753
2 0.503546 0.300948 0.751702 0.887889 0.982929
3 0.643171 0.239419 0.515604 0.922263 0.028100
4 0.163588 0.044437 0.023044 0.698208 0.238952
然后取不同的日志:
res1 = pd.DataFrame(np.diff(np.log(df.values), axis=0))
res2 = pd.DataFrame(np.log(df).diff()).iloc[1:]
assert (res1.values == res2.values).all()
print(res1)
0 1 2 3 4
0 -0.249738 0.257984 0.382805 0.513184 -1.412139
1 -0.077732 0.223528 -0.247941 0.801592 1.687888
2 0.244735 -0.228720 -0.377000 0.037984 -3.554767
3 -1.369059 -1.684144 -3.107937 -0.278313 2.140491