Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python上的关联_Python_Pandas_Correlation - Fatal编程技术网

Python上的关联

Python上的关联,python,pandas,correlation,Python,Pandas,Correlation,我有以下数据帧: 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

我有以下数据帧:

    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最相关的五只股票。有没有一种使用熊猫的快速方法?或者这需要创建数组,然后逐个计算相关性吗?数据框中有359只股票。

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

注意:我只是说每天,因为这是你的表似乎意味着什么

从那里可以使用查看相关矩阵

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
从这里开始,您可以遍历每一行,按值对行进行排序,然后您将得到一个按最强相关性排序的dict

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()

前几行是否缺少一列?数据帧似乎从3列跳到4列。如果是,可以更新列标题。另外,您的数据帧的形状是什么?抱歉-没有遗漏列,我只是省略了索引。形状大约是2555x3。遗憾的是,我没有每天对每只股票估价一次。当我运行命令时,我得到:“列中没有任何['StockID']。我注意到我的代码中的
StockID
在你的代码中是
StockID
。股票估值的频率是高于一天还是低于一天?pivot函数有一个可以使用的
aggfunc
参数。如果我只想从相关矩阵中可视化一只股票,如何替换print(stock,corr)命令?这取决于你想如何可视化它。如果您已经对数据进行了透视,则可以执行
df[[stock\u id]].plot()
假设您已导入
matplotlib
,然后可以使用
plt.show()
谢谢!如果我只想从相关矩阵中看到一只股票(股票1)(看看它与其他股票的相关性),我该怎么做?矩阵[[1]]不工作。