【问题标题】:How do I efficiently generate data with random variation in a time series based on existing data points如何根据现有数据点有效地生成时间序列中随机变化的数据
【发布时间】:2020-07-01 11:59:00
【问题描述】:

我在 csv 中有几个数据点,如下所示:

          date      value
0     8/1/2019   0.243902
1    8/17/2019   0.322581
2     9/1/2019   0.476190
3    10/6/2019   0.322581
4   10/29/2019   0.476190
5   11/10/2019   0.526316
6   11/21/2019   1.818182
7    12/8/2019   2.500000
8   12/22/2019   3.076923
9     1/5/2020   3.333333
10   1/12/2020   3.333333
11   1/19/2020   0.000000
12    2/2/2020   0.000000

我想在第一个日期和最后一个日期之间的每个小时生成一个值(假设每个日期都从该日期的 00:00 开始),以便生成的值在每个现有数据点之间创建一条相当平滑的曲线。如果可能的话,我还想为生成的值添加少量随机变化,以使曲线不是完全平滑。我最终希望将这个新数据集输出到一个 csv 中,其中包含相同的两列,其中包含原始行以及生成的值及其关联的日期时间(每个都在自己的行中)。

有没有办法轻松生成这些点并将结果输出到 csv?到目前为止,我已经尝试使用 pandas 来存储数据,但我无法找到一种方法来确保生成的数据考虑到现有数据点。

【问题讨论】:

    标签: python-3.x pandas dataframe


    【解决方案1】:

    我们试试scipy.interpolate:

    # this is the new timestamps
    new_date = pd.date_range(df.date.min(), df.date.max() + pd.to_timedelta('23h'),
                             freq='H')
    
    from scipy import interpolate
    
    tck = interpolate.splrep(df['date'].astype('int64'), df['value'], s=0)
    new_values = interpolate.splev(new_date.astype('int64'), tck)
    
    # visualize
    plt.plot(df.date, df.value, label='raw')
    plt.plot(new_date, new_values, label='intepolated')
    plt.legend();
    

    输出:

    【讨论】:

    • 有没有办法在生成数据后为数据添加更多变化或“噪音”?
    • @Nizag 使用np.random.normal 生成随机噪声并添加到信号中?
    猜你喜欢
    • 2020-06-29
    • 2020-11-26
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2019-07-29
    • 2013-03-31
    • 1970-01-01
    相关资源
    最近更新 更多