2014-12-04 85 views
0

嗨指标数字,我真正的新大熊猫。我试图弄清楚这里的数据类型是怎么回事,但到目前为止我无法走得很远。返回“可迭代”在Python中熊猫

我打算做的是很简单的。我在data1中搜索DataFrame data2的索引,并且距离目标时间最近的时间。

由于data1data2非常相似,只是有一些小的时间差,由于略有不同的采样率,附上只有在这里的data1样本:

enter image description here

我做了这样的事情在由时间戳data2比较搜索最接近的匹配数据的data1到时间戳:

idxcollect = [] 
for loopidx, tstamploop in enumerate(tstamp_data1[820990:821000]): 
    idxtemp = data2[ data2['timestamp'] == tstamp_data2.asof(tstamploop) ].index 
    delta1 = np.abs(data2.timestamp[idxtemp]  - data1.timestamp[loopidx]) 
    delta2 = np.abs(data2.timestamp[idxtemp + 1] - data1.timestamp[loopidx]) 

    if delta1.iloc[0] < delta2.iloc[0]: 
     idxreturn = idxtemp 
     idxcollect.append(idxreturn) 
    else: 
     idxreturn = idxtemp + 1 
     idxcollect.append(idxreturn) 

tstamp_data1/tstamp_data2是​​,从历元时间在data1data2计算。

我得到的输出是:

[Int64Index([809498], dtype='int64'), Int64Index([809499], dtype='int64'), Int64Index([809500], dtype='int64'), Int64Index([809501], dtype='int64'), Int64Index([809502], dtype='int64'), Int64Index([809503], dtype='int64'), Int64Index([809509], dtype='int64'), Int64Index([809513], dtype='int64'), Int64Index([809521], dtype='int64'), Int64Index([809533], dtype='int64')]

我想这样做是切片相应的data2从通过上述操作中发现的指数排,简单的东西如:

data2.ix[ idxcollect[:11] ]

但是,使用Int64Index格式,我无法做任何事情,只要我想做的事情都很简单。有什么出路吗?感谢您的时间和关注和帮助!

+1

包括一些示例数据。你只需要~10行来展示你想要完成的事情。 – 2014-12-04 18:45:38

+0

感谢您的建议。添加! – 2014-12-05 03:55:44

回答

1

您可以DATA2的索引存储为列表,请DATA1的时间戳列表和存储数据创建一个新的数据框:

data2indx = data2.index.tolist() 
data1tm = data1['timestamp'].tolist() 
data2sub = pd.DataFrame(columns = data2.columns) 

然后切片数据2和追加行data2sub基于选择:

for n, i in enumerate(data1tm): 
    c = [abs(i-j) for j in data2indx] 
    mins = min(c) 
    index = c.index(mins) 
    data2sub.loc[n] = data2.iloc[index] 

也许有人可以提供一个更有效的方法。

+0

看起来很有前途。感谢您的及时回复。让我试试看... – 2014-12-05 03:55:21

+0

您的功能可以完美适用于小数据范围。然而,它仅仅处理了data1和27.7 Mb数据的29.6 Mb,然后iPython决定杀死内核,所以我吃掉了所有16 GB的RAM。有什么出路吗?谢谢。 – 2014-12-05 17:18:28

+0

@HarryMacDowel可能生成的列表太大,导致系统资源浪费。尝试修订。 – 2014-12-05 18:33:33

0

我找到了出路,解决了速度问题。问题是,它需要更多的时间来处理比较,以为最接近的浮点值搜索最近的时间戳搜索。

因此,关键是,如果你已经在数据发现,我已经有一个timesec列。

enter image

我所做的就是设置第一个时间戳0,然后从此开始增加从时间戳的0基准计算的相应timedelta。这产生timesec列,这是一个简单而快速的计算。

在这个问题中,我问到“可迭代”数字,正如罗比指出的那样,.tolist()函数将解决列表的嵌套列表问题。但是,在另一个数据集中搜索仅87258个时间戳需要60个小时。为了加快速度,您可以利用timesec来实现更清晰,更快速的搜索。

通过采用简单getnearpos功能from a previous Stack Overflow answer

def getnearpos(array,value): 
    idx = (np.abs(array-value)).argmin() 
    return idx 

为87258个时间戳现在搜索变成了87258个浮点数搜索,它需要完成搜索的时间:1小时1分钟23S,一相比~60小时大幅度改善。

如果任何碰巧看到这个问题的人知道更快的实现,请与我分享。我非常渴望学习!谢谢!