2017-01-27 3 views
2

Из этого question и других кажется, что не рекомендуется использовать concat или append, чтобы построить базу данных pandas, потому что он каждый раз обрабатывает всю фреймворк данных.Python - эффективный способ добавления строк в dataframe

Мой проект предусматривает получение небольшого количества данных каждые 30 секунд. Это может зайти на 3-х дневный уик-энд, поэтому кто-то может легко ожидать более 8000 строк, которые будут созданы по одной строке за раз. Каким будет наиболее эффективный способ добавления строк в этот фреймворк?

+0

Если вы добавляете только строку каждые 30 секунд, действительно ли она должна быть эффективной? –

+3

Есть ли причина, по которой он должен быть DataFrame? Почему бы просто не записать его в файл, а затем конвертировать в конец? – sundance

+0

@ Stephen Rauch Ну, я надеялся сохранить свои образцы как можно ближе к каждые 30 секунд. Возможно, неправильно, я вытаскиваю данные, а затем добавляю их в dataframe, затем используя 'time.sleep (30)' до своего времени, чтобы получить следующий набор данных. Мое беспокойство заключалось в том, что он становится больше, чем время загрузки начнет увеличивать время между каждым образцом. Из этого вопроса [link] (http://stackoverflow.com/questions/10715965/add-one-row-in-a-pandas-dataframe) кажется, что при размере 6000 требуется 2,29 секунды. Я хотел бы, если возможно, свести это число к минимуму. – Jarrod

ответ

4

Вы можете добавить строки в DataFrame на месте с использованием loc на несуществующий индекс. Из Pandas documentation:

In [119]: dfi 
Out[119]: 
    A B C 
0 0 1 0 
1 2 3 2 
2 4 5 4 

In [120]: dfi.loc[3] = 5 

In [121]: dfi 
Out[121]: 
    A B C 
0 0 1 0 
1 2 3 2 
2 4 5 4 
3 5 5 5 

Как и ожидалось, с использованием loc значительно быстрее, чем append (около 14х):

import pandas as pd 
df = pd.DataFrame({"A": [1,2,3], "B": [1,2,3], "C": [1,2,3]}) 

%%timeit 
df2 = pd.DataFrame({"A": [4], "B": [4], "C": [4]}) 
df.append(df2) 

# 1000 loops, best of 3: 1.61 ms per loop 

%%timeit 
df.loc[3] = 4 

# 10000 loops, best of 3: 113 µs per loop 
+0

Спасибо, это выглядит намного лучше, чем я использовал. Я ценю помощь! – Jarrod

1

Вам нужно разделить задачу на две части:

  1. эффективно Прием данных (сбор его) каждые 30 секунд.
  2. Обработка данных после их сбора.

Если ваши данные критические (то есть вы не можете позволить себе их потерять), отправьте его в очередь, а затем прочитайте в очереди из очереди.

Очередь обеспечит надежное (гарантированное) принятие и что ваши данные не будут потеряны.

Вы можете прочитать данные из очереди и выгрузить ее в базу данных.

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

Практический результат - разделить сбор и анализ частей вашего приложения.

+0

Это отличная идея! Вероятно, немного за пределами моего уровня мастерства в данный момент, но это только дает мне так много хороших идей !!! Я думаю, что после того, как я это сделаю, я попытаюсь сделать что-то подобное. Спасибо! – Jarrod

2

Я использовал df.loc[i] = [new_data] предложение этот ответ, но у меня есть> 500000 строк, и это было очень медленный.

Несмотря на то, что ответы на них полезны для вопроса ОП, я нашел его более эффективным, когда речь идет о большом количестве строк вверх (вместо обмана, описанного OP), чтобы использовать csvwriter для добавления данных в памяти CSV, затем, наконец, используйте pandas.read_csv(csv) для генерации желаемого вывода DataFrame.

output = BytesIO() 
csv_writer = writer(output) 

for row in iterable_object: 
    csv_writer.writerow(row) 

output.seek(0) # we need to get back to the start of the BytesIO 
df = read_csv(output) 
return df 

Это, ~ 500000 строк был 1000x быстрее и как счетчик строка растет увеличение скорости будет только больше (the df.loc[1] = [data] получите много медленнее сравнительно)

Надеется, что это поможет кому-то, кто нуждается в эффективности при занимая больше строк, чем OP.

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