Панды: как работать с действительно большими данными?

Моя выборка данных действительно большая (1,2 миллиона документов), и мне нужно создавать и анализировать данные только на одном «фрейме данных pandas». Пока мой код выглядит так:

conn = psycopg2.connect("dbname=monty user=postgres host=localhost password=postgres")
cur = conn.cursor('aggre')
cur.execute("SELECT * FROM binance.zrxeth_ob_indicators;")
row = cur.fetchall()
df = pd.DataFrame(row,columns = ['timestamp', 'topAsk', 'topBid', 'CPA', 'midprice', 'CPB', 'spread', 'CPA%', 'CPB%'])

Но потребуется много времени, чтобы локально загрузить все в переменной df? До сих пор я пытался сделать следующее:

for row in cur:
      dfsub = pd.DataFrame(row,columns=['timestamp', 'topAsk', 'topBid', 'CPA', 'midprice', 'CPB', 'spread', 'CPA%', 'CPB%'])
      df = df.concat([df,dfsub])

но это дает мне следующую ошибку: конструктор DataFrame не вызывается должным образом!

любая идея? Спасибо!

Вы можете проверить этот ответ: stackoverflow.com/questions/18107953/…

Denis Rasulev 07.01.2019 14:22

Даже если бы ваш фрагмент работал, df.concat([df,dfsub]) был бы чрезвычайно дорогим. Он перераспределяет весь df на каждой итерации.

Mad Physicist 07.01.2019 14:24

посмотрите в это: docs.dask.org/en/latest/dataframe.html

Binyamin Even 07.01.2019 14:30
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
582
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я думаю, что, поскольку ваш набор документов очень велик, загрузка его в память займет много времени, независимо от того, как вы это делаете. Я бы посоветовал, если вам не нужно одновременно хранить весь набор данных в памяти, вы можете использовать встроенный в pandas метод загрузочного фрагмента. Это позволяет вам последовательно загружать и обрабатывать фрагменты данных, предназначенные для этого варианта использования.

См. Этот вопрос, например Как прочитать CSV-файл размером 6 ГБ с помощью pandas

ты можешь сделать что-то вроде этого

class Postgres:
def __init__(self, host, database, user=None, password='', schema='public'):
    self.user = user or getpass.getuser()
    self.database = database
    self.host = host
    self.engine = self.create_engine(self.host, self.database, self.user, password)
    self.schema = schema

@staticmethod
def create_engine(host, database, user, password):
    return psycopg2.connect("postgresql://{user}:{password}@{host}/{database}".format(
        host=host,
        database=database,
        user=user,
        password=password
    ))

def execute(self, query: object) -> object:
    """
    :param query:
    :return: pd.Dataframe()
    """
    result_df = pd.read_sql(query, self.engine)
    self.engine.commit()
    return result_df

с этим вы используете оптимизированное создание DataFrame из результата postgres pandas.

Но, исходя из вашего набора данных, требуется некоторое время, чтобы прочитать все данные в памяти.

Ответ принят как подходящий

У Pandas есть хороший встроенный метод read_sql, который должен быть довольно эффективным

т.е. просто сделайте:

df = pd.read_sql("SELECT * FROM binance.zrxeth_ob_indicators", conn)

и это должно работать ...

Само по себе 1,2 миллиона строк - это немного, учитывая количество / имена столбцов, это, вероятно, <300 МБ ОЗУ (30 байтов на значение * 9 столбцов * 1,2e6 строк) и должно занимать <10 секунд на недавнем компьютере

Другие вопросы по теме