Closed. This question is
off-topic。它当前不接受答案。
想改善这个问题吗?
Update the question,所以它是
on-topic,用于堆栈溢出。
5年前关闭。
我有一个非常简单的问题,我想以比目前更高的效率解决。
我有一堆数据作为一组监视指标。输入数据被构造为元组数组。每个元组是(时间戳,值)。时间戳是整数纪元秒,其值是正常的浮点数。例:
inArr = [ (1388435242, 12.3), (1388435262, 11.1), (1388435281, 12.8), ... ]
时间戳记之间的秒数不一定总是相同的,但通常很接近。有时我们会提交重复的数字,有时会错过数据点,等等。
我当前的解决方案需要时间戳和:
查找每对连续时间戳之间的秒数;
找到这些延迟的中位数;
创建正确大小的数组;
假定第一个时间段的开始时间是第一个时间段之前的中值的一半(将测量值放在该时间段的中间);
对碰巧进入同一时间段的值进行平均;
根据正确的(时间戳-开始时间)/中位数元素将数据添加到此数组。
如果在某个时间范围内没有任何值,我显然会输出None值。
输出数据必须采用以下格式:
outArr = [ (startTime, timeStep, numVals), [ val1, val2, val3, val4, ... ] ]
我怀疑这是Python Pandas
http://pandas.pydata.org/(或Numpy / SciPy)解决的问题。
是的,我的解决方案有效,但是当我在60K数据点上运行时,可能需要十分之一秒(或更长时间)才能运行。当我尝试处理大量数据集时,这很麻烦。
因此,我正在寻找一种可能比纯Python版本运行得更快的解决方案。我猜想(基于先前与Argonne National Labs的几次对话),SciPy和Numpy在阵列操作时(“清嗓子”)“快得多”。我已经简短地(一个小时左右)看了Pandas代码,但是执行这组操作看起来很麻烦。我不正确吗?
-编辑以显示预期的输出-
数据点之间的中值时间为20秒,一半为10秒。为了确保我们在时间戳之间放置正确的线条,我们将开始时间定在第一个数据点之前10秒。如果我们仅将开始时间设为第一个时间戳,则很有可能在一个时间间隔中获得2个时间戳。
因此,1388435242-10 =1388435232。时间步长是中位数20秒。这里的数字是3。
outArr = [ (1388435232, 20, 3), [ 12.3, 11.1, 12.8 ] )
这是Graphite在绘制输出图形时期望的格式。这不是我的发明。但是,时间序列数据采用这种格式似乎很常见,即开始时间,间隔,然后是值数组。
这是草图
创建您的输入序列
In [24]: x = zip(pd.date_range('20130101',periods=1000000,freq='s').asi8/1000000000,np.random.randn(1000000))
In [49]: x[0]
Out[49]: (1356998400, 1.2809949462375376)
创建框架
In [25]: df = DataFrame(x,columns=['time','value'])
将日期设置为随机(以模拟一些数据)
In [26]: df['time1'] = df['time'] + np.random.randint(0,10,size=1000000)
将时代秒转换为datetime64 [ns] dtype
In [29]: df['time2'] = pd.to_datetime(df['time1'],unit='s')
区别系列(创建时间增量)
In [32]: df['diff'] = df['time2'].diff()
看起来像这样
In [50]: df
Out[50]:
time value time1 time2 diff
0 1356998400 -0.269644 1356998405 2013-01-01 00:00:05 NaT
1 1356998401 -0.924337 1356998401 2013-01-01 00:00:01 -00:00:04
2 1356998402 0.952466 1356998410 2013-01-01 00:00:10 00:00:09
3 1356998403 0.604783 1356998411 2013-01-01 00:00:11 00:00:01
4 1356998404 0.140927 1356998407 2013-01-01 00:00:07 -00:00:04
5 1356998405 -0.083861 1356998414 2013-01-01 00:00:14 00:00:07
6 1356998406 1.287110 1356998412 2013-01-01 00:00:12 -00:00:02
7 1356998407 0.539957 1356998414 2013-01-01 00:00:14 00:00:02
8 1356998408 0.337780 1356998412 2013-01-01 00:00:12 -00:00:02
9 1356998409 -0.368456 1356998410 2013-01-01 00:00:10 -00:00:02
10 1356998410 -0.355176 1356998414 2013-01-01 00:00:14 00:00:04
11 1356998411 -2.912447 1356998417 2013-01-01 00:00:17 00:00:03
12 1356998412 -0.003209 1356998418 2013-01-01 00:00:18 00:00:01
13 1356998413 0.122424 1356998414 2013-01-01 00:00:14 -00:00:04
14 1356998414 0.121545 1356998421 2013-01-01 00:00:21 00:00:07
15 1356998415 -0.838947 1356998417 2013-01-01 00:00:17 -00:00:04
16 1356998416 0.329681 1356998419 2013-01-01 00:00:19 00:00:02
17 1356998417 -1.071963 1356998418 2013-01-01 00:00:18 -00:00:01
18 1356998418 1.090762 1356998424 2013-01-01 00:00:24 00:00:06
19 1356998419 1.740093 1356998428 2013-01-01 00:00:28 00:00:04
20 1356998420 1.480837 1356998428 2013-01-01 00:00:28 00:00:00
21 1356998421 0.118806 1356998427 2013-01-01 00:00:27 -00:00:01
22 1356998422 -0.935749 1356998427 2013-01-01 00:00:27 00:00:00
计算中位数
In [34]: df['diff'].median()
Out[34]:
0 00:00:01
dtype: timedelta64[ns]
计算平均值
In [35]: df['diff'].mean()
Out[35]:
0 00:00:00.999996
dtype: timedelta64[ns]
应该让你开始