【问题标题】:How to use datetime field froma dataframe in linregress scipy?如何在linregress scipy中使用数据框中的日期时间字段?
【发布时间】:2018-04-25 02:36:52
【问题描述】:

当我尝试从dataframelinregress DateClose 字段时,我不断得到error

Traceback(最近一次调用最后一次): 文件“”,第 1 行,在 文件“C:\Python34\lib\site-packages\scipy\stats_stats_mstats_common.py”,>第 75 行,在 linregress xmean = np.mean(x, 无) 文件“C:\Python34\lib\site-packages\numpy\core\fromnumeric.py”,第 2942 行,在 >mean out=out, **kwargs) 文件“C:\Python34\lib\site-packages\numpy\core_methods.py”,第 65 行,位于 >_mean ret = umr_sum(arr,轴,dtype,out,keepdims) TypeError: ufunc add 不能使用类型为 dtype('dtype(' 的操作数

我正在使用的代码。

import openpyxl,os
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import datetime
import pandas_datareader as pdr
from scipy.stats import linregress

start = datetime.datetime(2010,1,1)
end = datetime.datetime(2017,11,10)
i = NSE/CHENNPETRO
df = pdr.DataReader(i, 'quandl', start, end)
# df = df.iloc[::-1]
linregress(df.index,df['Close'])

接下来我可以看哪里?

【问题讨论】:

    标签: python numpy scipy


    【解决方案1】:

    Scipy 只能对数值进行线性回归;它不知道如何处理日期。最好的方法可能是将您的日期转换为数字(例如天数、秒数等,视情况而定)。这是一个例子:

    import pandas as pd
    import numpy as np
    
    data = pd.DataFrame({'x': np.arange(1000) + np.random.randn(1000)},
                        index=pd.date_range('2012', periods=1000, freq='D'))
    data.head()
    #  x
    # 2012-01-01 -0.475795
    # 2012-01-02 -0.222100
    # 2012-01-03  2.494785
    # 2012-01-04  3.237799
    # 2012-01-05  4.412078
    

    现在我们可以使用 pandas time deltas 来查找自第一个索引以来的天数:

    # compute days since the first date in the index
    delta = (data.index - data.index[0])
    days = delta.days
    

    根据您的数据,改用小时、分钟、秒等可能更有意义。

    将此作为输入,线性回归将起作用:

    from scipy.stats import linregress
    linregress(days, data.x)
    # LinregressResult(slope=0.99979977545856191, intercept=0.085015417311694819, rvalue=0.99999344600423345, pvalue=0.0, stderr=0.00011458241597036779)
    

    【讨论】:

    • 我会在这里添加使用 pandas.to_numeric(args) 的可能性,很有用。
    • @jakevdp - 我不明白你的时间增量部分。如果我尝试“seconds = delta.seconds”,则代码将失败。 data.index - data.index[0] 的结果返回一个 int64 值列表。这如何与时间戳一起使用??
    猜你喜欢
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 2020-05-29
    • 2018-10-26
    • 1970-01-01
    相关资源
    最近更新 更多