【问题标题】:Trendline plotting not working with bigdataset趋势线绘图不适用于大数据集
【发布时间】:2016-08-25 15:57:36
【问题描述】:

我有一个包含 52166 个数据点的大数据集,如下所示:

                     bc_conc    
2010-04-09 10:00:00  609.542000          
2010-04-09 11:00:00  663.500000          
2010-04-09 12:00:00  524.661667         
2010-04-09 13:00:00  228.706667           
2010-04-09 14:00:00  279.721667         

这是一个熊猫数据框,索引在日期时间。现在我喜欢将 bc_conc 的数据与时间作图,并添加一条趋势线。

我使用了以下代码:

data = data.resample('M', closed='left', label='left').mean()
x1 = data.index
x2 = matplotlib.dates.date2num(data.index.to_pydatetime())
y = data.bc_conc
z = np.polyfit(x2, y, 1)
p = np.poly1d(z)
fig = plt.figure()
ax1 = fig.add_subplot(1, 1, 1)
plt.plot_date(x=x1, y=y, fmt='b-')
plt.plot(x1, p(x2), 'ro')
plt.show()

但是,如您所见,我对数据进行了重新采样。我这样做是因为我没有,代码只是给了我一个没有趋势线的数据图。如果我将它们重新采样到几天,则情节仍然没有趋势线。如果我将它们重新采样到几个月,就会显示一条趋势线。

似乎该代码仅适用于较小的数据集。为什么是这样?我想知道有人可以向我解释这一点,因为我喜欢将我的数据重新采样到几天,但不会更远..

提前致谢

【问题讨论】:

    标签: python numpy pandas matplotlib machine-learning


    【解决方案1】:

    无论是使用每小时还是每天重新采样的数据,这段代码似乎都能正常工作。

    从 100,000 个数据点开始:

    y = np.arange(0, 1000, .01) + np.random.normal(0, 100, 100000)
    data = pd.DataFrame(data={'bc_conc': y}, index=pd.date_range(freq='H', start=datetime(2000, 1, 1), periods=len(y)))
    
    <class 'pandas.core.frame.DataFrame'>
    DatetimeIndex: 100000 entries, 2000-01-01 00:00:00 to 2011-05-29 15:00:00
    Freq: H
    Data columns (total 1 columns):
    bc_conc    100000 non-null float64
    dtypes: float64(1)
    
                            bc_conc
    2000-01-01 00:00:00  -30.639811
    2000-01-01 01:00:00  -26.791396
    2000-01-01 02:00:00 -121.542718
    2000-01-01 03:00:00  -69.267944
    2000-01-01 04:00:00  117.731532
    

    使用可选重采样计算趋势线:

    data = data.resample('D', closed='left', label='left').mean() # optional for daily data
    x2 = matplotlib.dates.date2num(data.index.to_pydatetime()) # Dates to float representing (fraction of) days since 0001-01-01 00:00:00 UTC plus one
    
    [ 730120.  730121.  730122. ...,  734284.  734285.  734286.]
    
    z = np.polyfit(x2, data.bc_conc, 1)
    
    [  2.39988999e-01  -1.75220741e+05]  # coefficients
    
    p = np.poly1d(z)
    
    0.24 x - 1.752e+05 # fitted polynomial
    
    data['trend'] = p(x2)  # trend from polynomial fit
    
                  bc_conc     trend
    2000-01-01 -29.794608  0.026983
    2000-01-02   6.727729  0.266972
    2000-01-03   9.815476  0.506961
    2000-01-04 -27.954068  0.746950
    2000-01-05 -13.726714  0.986939
    
    data.plot()
    plt.show()
    

    产量:

    【讨论】:

    • 我复制了你的代码,但由于某种原因趋势线没有显示。角落里的图例确实显示了一条带有趋势线的绿线。
    • 你的 pandas 和 matplotlib 版本是什么?
    • 我添加了一些中间显示,以便您可以按照和比较步骤来查看哪里有偏差。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2022-10-14
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多