【问题标题】:Correlation on PythonPython 上的相关性
【发布时间】:2020-01-10 19:07:06
【问题描述】:

我有以下数据框:

    StockId Date    Value
    1       2015-01-02  -0.070012
    2       2015-01-02  -0.022447
    4       2015-01-02  -0.011474
    6       2015-01-02  0.003796
    13      2015-01-02  -0.032061
    ...
    355     2018-09-14  -0.035717
    356     2018-09-14  -0.007899
    357     2018-09-14  0.065217
    358     2018-09-14  0.063536
    359     2018-09-14  -0.023433 

我正在寻找随着时间的推移股票之间的相关性,以便找到与股票 1 最相关的五只股票。有没有使用 pandas 的快速方法来做到这一点?或者这是否需要创建数组然后一一计算相关性?数据框中有 359 只股票。

【问题讨论】:

  • 您的前几行是否缺少一列?数据框似乎从 3 列跳到 4 列。如果是这样,您能否更新列标题。另外,您的数据框的形状是什么?
  • 道歉 - 没有遗漏列,我只是省略了索引。形状约为 2555 x 3。

标签: python pandas correlation


【解决方案1】:

假设您的数据框采用长格式,其中每只股票每天估值一次,您可以使用 pivot 函数重新调整为宽格式。指定Date 为新数据框的索引,StockID 为列。如果您有超过每天采样的数据,您可以将 aggfunc 参数指定为 min/max/avg 或您认为适合您的应用程序的任何其他值。如果您有少于每日采样的数据,您仍然可以运行代码,但请注意相关性将基于一些空值。

注意:我只是说每天,因为这就是您的表格所暗示的。

从那里您可以使用df.corr() 查看相关矩阵。

df = df.pivot(index='Date', columns='StockID')
df.columns = df.columns.droplevel()  # Convert multi-index to single index
print(df)
# StockID           a         b         c
# Date
# 1/10/2020  0.956625  0.175345  0.999375
# 1/11/2020  0.458859  0.714604  0.995440
# 1/12/2020  0.603331  0.881022  0.215262
# 1/13/2020  0.584198  0.303796  0.332117

matrix = df.corr()
print(matrix)
# StockID         a         b         c
# StockID                              
# a        1.000000 -0.680290  0.305365
# b       -0.680290  1.000000 -0.336229
# c        0.305365 -0.336229  1.000000

从那里,您可以遍历每一行,按值对行进行排序,然后您将获得一个按最强相关性排序的字典。

for stock, corr in matrix.to_dict().items():
    corr = {
        k: v for k, v
        in sorted(corr.items(), key=lambda item: -item[1])
        if k != stock
    }
    print(stock, corr)
# a {'c': 0.30536503121224934, 'b': -0.6802897760166712}
# b {'c': -0.3362290204607999, 'a': -0.6802897760166712}
# c {'a': 0.30536503121224934, 'b': -0.3362290204607999}

或者,如果您想要更直观的比较,

plt.matshow(matrix)
plt.colorbar()
plt.show()

【讨论】:

  • 遗憾的是,我没有每天对每只股票进行一次估值。当我运行命令时,我得到:“列中都没有 ['StockID']”。其中一些每天都受到重视,而另一些则不然。
  • 我注意到我的代码中的 StockID 在您的代码中是 StockId。股票的估值频率是高于一天还是低于一天?枢轴函数有一个可以使用的aggfunc 参数。
  • 如果我只想从相关矩阵中可视化一只股票,我该如何替换 print(stock, corr) 命令?
  • 这取决于您希望如何可视化它。如果您已经对数据进行了透视,则可以执行 df[[stock_id]].plot() 假设您已导入 matplotlib,然后您可以使用 plt.show()
  • 谢谢!如果我只想从相关矩阵中查看一只股票(股票 1)(查看它与其他股票的相关性),我该怎么做?矩阵[[1]] 不工作。
猜你喜欢
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 2018-02-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
相关资源
最近更新 更多