【问题标题】:How to find the correlation between two lists when one list consists of date values?当一个列表包含日期值时,如何找到两个列表之间的相关性?
【发布时间】:2016-08-13 20:32:29
【问题描述】:

我正在尝试使用 scipy 中的 pearsonr 函数每 30 天计算两个列表之间的相关性。

一个列表包含日期(称为dateValues),另一个包含销售(称为saleNumbers)。我之前已经使用 datetime.strptime 提取了日期,如果我打印出 dateValues,我会得到一个任意长度的日期范围。

datetime.datetime(2016, 8, 12, 0, 0), datetime.datetime(2016, 8, 11, 0, 0), datetime.datetime(2016, 8, 10, 0, 0)...etc

这里是销售清单:

saleNumbers = [3567,2348,1234,....etc]

但是当我这样做时

pearsonr(dateValues,saleNumbers)

我得到了错误

TypeError: unsupported operand type(s) for +: 'datetime.datetime' and 'datetime.datetime'

找了好久,发现可以用datetime.date来做日期之间的算术运算。

所以我这样做了:

print(datetime.date(dateValues[0]) - datetime.date(dateValues[29]))

果然,这给了我 30 天的时差。

然后我尝试了这个:

pearsonr(datetime.date(dateValues[0]) - datetime.date(dateValues[29]),saleNumbers)

然后我得到这个错误

TypeError: len() of unsized object

有什么想法可以让我继续前进吗?另外我不认为 datetime.date(dateValues[0]) - datetime.date(dateValues[2]) 是查找相关性时处理日期列表的正确 Pythonic 方式。

PS:在这张图片中,是一个 Excel 电子表格,显示了我已经完成的工作,但试图在 Python 中复制:http://i.imgur.com/0Fj36Al.jpg

【问题讨论】:

    标签: python numpy scipy data-analysis python-datetime


    【解决方案1】:

    先将它们转换为数值:

    arbitrary_date = datetime(1970,1,1)
    pearsonr([(d - arbitrary_date).total_seconds() for d in dateValues], saleNumbers)
    

    人物相关性不受任一轴上的缩放或平移(仿射变换)的影响

    【讨论】:

    • 谢谢,但是 dt 是错字吗,应该改为 d 吗?还有这个表达式是什么意思: datetime(1970,1,1)).total_seconds() ?
    • @bwrr:d 和任意时间戳之间的秒数
    【解决方案2】:

    你可以试试这样的:

    import numpy as np
    pearsonr(np.array(dateValues, dtype=np.datetime64).astype("int"), np.array(saleNumbers))
    

    【讨论】:

    • astype(np.int64) 在这里可能是更好的选择
    猜你喜欢
    • 1970-01-01
    • 2014-12-26
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 2010-10-05
    相关资源
    最近更新 更多