我正在尝试使用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
答案 0 :(得分:1)
首先将它们转换为数值:
arbitrary_date = datetime(1970,1,1)
pearsonr([(d - arbitrary_date).total_seconds() for d in dateValues], saleNumbers)
Perason相关性不受任一轴(仿射变换)中的缩放或平移的影响
答案 1 :(得分:1)
您可以尝试这样的事情:
import numpy as np
pearsonr(np.array(dateValues, dtype=np.datetime64).astype("int"), np.array(saleNumbers))