我有一个包含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
它是一个pandas数据帧,索引在日期时间。现在我想根据时间绘制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()
但是,正如您所看到的,我重新采样了我的数据。我这样做是因为我没有,代码只是给了我一个没有趋势线的数据图。如果我将它们重新采样到几天,情节仍然没有趋势线。如果我将它们重新采样到几个月,趋势线会显示出来。
似乎代码仅适用于较小的数据集。为什么是这样?我想知道是否有人可以向我解释这一点,因为我想将我的数据重新采样到几天,但不是更远......
提前致谢
答案 0 :(得分:2)
无论是使用每小时还是每日重采样数据,此代码似乎都能正常运行。
从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()
收率: