所有列上的DataFrame操作

时间:2018-07-12 12:15:38

标签: python pandas numpy dataframe logging

我有一个DataFrame,2017年的日期索引为250个交易日,列的股票行情自动收录器为100。

因此,DataFrame是一个 250 x 100 矩阵,其中包含去年所有交易日中每只股票的每日收盘价序列。

我要对整个DataFrame进行的操作是应用numpy.log操作来计算每只股票的日志日收益率-即将此日志操作应用于此DataFrame中的每一列。

虽然我在DataFrame的单列系列中查找了以前的文章来执行此操作,但我不知道在整个DataFrame的所有列中进行此操作的最佳方法是-思考应该我做类似的事情:

log_matrix1 = np.log(df[1:,:]/df[:-1,:])

这不起作用,因为我收到无法散列的类型错误。

非常感谢您的帮助!

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