3

我在 Python 中有一些数据最终绘制在图表(Highcharts)上,问题是 x 轴(时间)上数据点之间的间隔不规则。虽然准确,但这使得图表在视觉上看起来有点不稳定。

数据格式如下:

data = {"points": [[1335360000, 1335361920, 93374739787], [1335361920, 1335447840, 11738851087.0]......]} 

即:timestamp from、timestamp to、value

我需要做的是修改数据,使其标准化为最低频率/最长时间间隔,以便在绘制在图表上时看起来一致。

关于最有效的方法有什么想法吗?

更新

在这种情况下,我真的不能使用任何 3rd 方库。

图表通常是这样渲染的,在数据​​点靠得更近的地方显得更加参差不齐:

图表示例

4

2 回答 2

2

如果您还没有尝试过,您可能会发现该pandas库对于将不规则时间序列转换为规则时间序列(以及其他类型的数据操作-jui-jitsu,一般来说)很有用。使用(干净、可重用的习语,一旦你学习它们)和运行时快速(cython 优化)进行编程是有效的。

为了让您体验一下,这里有一些基于您描述的数据格式的 pandas 示例。

  1. 将数据读入pandas.DataFrame. (DataFrame 的作用类似于列的字典,其中的值是 numpy 数组。)

    In [33]: df = pandas.DataFrame(data['points'], columns=['from', 'to', 'value'])
    
    In [34]: df
    Out[34]: 
             from          to  value
    0  1335360000  1335360004      3
    1  1335360004  1335360008     32
    2  1335360008  1335360009      4
    3  1335360009  1335360011     36
    4  1335360011  1335360014     38
    
  2. 转换现有列并添加派生列

    In [46]: utcfromtimestamp = datetime.datetime.utcfromtimestamp
    
    In [47]: df['from'] = df['from'].map(utcfromtimestamp)
    
    In [48]: df['to'] = df['to'].map(utcfromtimestamp)
    
    In [49]: df['delta'] = [x.total_seconds() for x in (df['to'] - df['from'])]
    
    In [50]: df['avg/s'] = df['value'] / df['delta']
    
    In [51]: df
    Out[51]: 
                      from                   to  value  delta      avg/s
    0  2012-04-25 13:20:00  2012-04-25 13:20:04      3      4   0.750000
    1  2012-04-25 13:20:04  2012-04-25 13:20:08     32      4   8.000000
    2  2012-04-25 13:20:08  2012-04-25 13:20:09      4      1   4.000000
    3  2012-04-25 13:20:09  2012-04-25 13:20:11     36      2  18.000000
    4  2012-04-25 13:20:11  2012-04-25 13:20:14     38      3  12.666667
    
  3. 分组并选择要绘制的信息

    In [78]: df.groupby('from')['avg/s'].mean()
    Out[78]: 
    from
    2012-04-25 13:20:00     0.750000
    2012-04-25 13:20:04     8.000000
    2012-04-25 13:20:08     4.000000
    2012-04-25 13:20:09    18.000000
    2012-04-25 13:20:11    12.666667
    Name: avg/s
    

有关上采样或下采样时间序列的信息,请参阅此链接。下一个版本 (0.8) 仍在开发中,计划提供更简洁的方法来重新采样时间序列。

于 2012-05-03T06:37:25.270 回答
1

我想你可以做某种形式的曲线拟合(最小二乘或其他),但为了准确起见,也许你应该坚持不规则的间隔?

如果你把它变成一个折线图,你可能会对你的原始数据没问题。

于 2012-05-03T00:07:56.637 回答