2016-07-09 2 views
2

У меня есть коллекция MongoDB, которые содержат следующее:разница MongoDB к предыдущей записи

[{'price': 0.74881,, 
    'date': '20160601 00:00:00.134', 
    'instrument': 'EUR/GBP'}, 
{'price': 0.76881, 
    'date': '20160601 00:00:00.135', 
    'instrument': 'EUR/GBP'}, 
{'price': 0.78881, 
    'date': '20160601 00:00:00.300', 
    'instrument': 'EUR/GBP'}, 
{'price': 1.76881, 
    'date': '20160601 00:00:00.302', 
    'instrument': 'EUR/GBP'}, 

Как я могу обновить каждую запись, так что содержит процентное увеличение/уменьшение спроса и предложения к предыдущей записи? Реальная запись содержит миллионы записей, поэтому панды не подходят.

В выводе каждая запись должна содержать содержать дополнительное поле в каждой записи называется price_change_to_pervious_item

+0

Ваш вопрос трудно понять. Не могли бы вы рассказать? – styvane

+0

Это цены на акции. Для каждой записи я хотел бы рассчитать, насколько она увеличилась или уменьшилась по сравнению с предыдущей транзакцией. – Nickpick

+0

Значение поля «дата» с вами будет не из легких. Также, пожалуйста, подумайте о включении ожидаемого результата в ваш вопрос. – styvane

ответ

1

Похоже, что вы хотите обрабатывать ваши записи в парной моде. Эта функция от самого itertools documentation.

from itertools import tee, izip 

def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 

    return izip(a, b) 

После того как вы это, и если предположить, что ваши данные сортируются

results = [] 
for d1, d2 in pairwise(data): 
    if not result: 
    d1['price_change_to_pervious_item'] = 0.0 
    results.append(d1) 
    delta = d2['price'] - d1['price'] 
    d2['price_change_to_pervious_item'] = delta 
    results.append(d2) 

Это не тестировалось, но вы получите общее представление. Pairwise позволяет обрабатывать строки в режиме (d1, d2), (d2, d3).

+0

Как только у вас есть пары, они независимы, поэтому вы можете использовать многопроцессорность обработки ваших данных, за вычетом 'if not result «взломать начальную дельта. –

+0

Спасибо за это. Что касается скорости, есть ли что-нибудь лучше, чем mongodb, которое я мог бы использовать, если количество данных превышает мою RAM? – Nickpick

+0

Если вам нужна чистая скорость без большой работы, я бы использовал базу данных SQL, такую ​​как Postgresql, и написал функцию окна, используя функцию задержки, которая будет похожа на парный подход, за исключением того, что вы можете делать все в одном из утверждений. Если у вас есть миллионы или миллиарды строк, я бы подумал об использовании Redshift на амазонке или загрузке и настройке Vertica. Оба имеют сжатие на уровне столбцов и поддерживают несколько узлов. По моему опыту, ваша работа в sql - это лучший выбор. Удачи. –

Смежные вопросы