有效地将流数据附加到Dataframe

时间:2015-07-10 03:36:31

标签: python json python-3.x pandas

我有一个连接到我从中传输数据的API 看起来像这样:

df = pd.DataFrame(columns=('time','bid','ask')) 
for line in response.iter_lines(1):             
     if line:
        try:
            msg = json.loads(line.decode())     
            if "instrument" in msg or "tick" in msg: 
                x  = pd.DataFrame([[msg['tick']['time'],msg['tick']['bid'],msg['tick']['ask']]], columns=('time','bid','ask'))
                df = df.append(x, ignore_index=True) 
        except Exception as e:
            print("Caught exception when converting message into json\n" + str(e))

我正在接受这个并将其放入数据帧进行处理,如下所示:

x  = pd.DataFrame([[msg['tick']['time'],msg['tick']['bid'],msg['tick']['ask']]], columns=('time','bid','ask'))

我的问题是,是否有更有效的方法来获取数据 数据帧比上面的?但是,如果有一种完全不同的方式,那么请赐教!

我特别怀疑这一行:

False

正如我想的那样,获取字典信息可能更有效率。

感谢您的帮助,我真的很感激。

1 个答案:

答案 0 :(得分:0)

您不需要将dict转换为DataFrame以便追加,您可以将字典直接传递给append,如下所示:

df = df.append(msg['tick'],ignore_index=True)

如果你想在一个批次中加载它们,你可以用列表理解来清理响应,只保留带有正确键的条目,然后将其传递给append(你将无法使用但是要跳过个别例外。)

response_cleaned = [{'time': msg['tick']['time'],
                     'bid': msg['tick']['bid'],
                     'ask': msg['tick']['ask']} 
               for msg in response 
               if 'tick' in msg 
               and 'ask' in msg['tick'] 
               and 'time' in msg['tick'] 
               and 'bid' in msg['tick']]

print("{} bad records recieved".format(len(response) - len(response_cleaned)))

df = df.append(response_cleaned)