Превратить pandas dataframe в подобный файлу объект в памяти?
Я загружаю около 2 - 2,5 миллиона записей в базу данных Postgres каждый день.
Затем я читаю эти данные с помощью pd.read_sql, чтобы превратить их в фрейм данных, а затем выполняю некоторые манипуляции со столбцами и небольшие слияния. Я сохраняю эти измененные данные в виде отдельной таблицы для использования другими людьми.
Когда я делаю pd.to_sql, это занимает вечность. Если я сохраню файл csv и использую COPY FROM в Postgres, то все это займет всего несколько минут, но сервер находится на отдельной машине, и перенос файлов там затруднен.
Используя psycopg2, похоже, что я могу использовать copy_expert, чтобы извлечь выгоду из массового копирования, но все же использовать python. Я хочу, если возможно, избегать написания реального файла CSV. Могу ли я сделать это в памяти с панелью данных панд?
Вот пример моего кода панд. Я хотел бы добавить copy_expert или что-то, чтобы сделать сохранение этих данных намного быстрее, если это возможно.
for date in required_date_range:
df = pd.read_sql(sql=query, con=pg_engine, params={'x' : date})
...
do stuff to the columns
...
df.to_sql('table_name', pg_engine, index=False, if_exists='append', dtype=final_table_dtypes)
Может кто-нибудь помочь мне с примером кода? Я бы предпочел использовать панды до сих пор, и было бы неплохо сделать это в памяти. Если нет, я просто напишу временный файл CSV и сделаю это таким образом.
Edit - вот мой окончательный код, который работает. Это займет всего пару сотен секунд на дату (миллионы строк) вместо пары часов.
to_sql = "" "КОПИЯ% s ОТ STDIN С CSV HEADER" ""
def process_file(conn, table_name, file_object):
fake_conn = cms_dtypes.pg_engine.raw_connection()
fake_cur = fake_conn.cursor()
fake_cur.copy_expert(sql=to_sql % table_name, file=file_object)
fake_conn.commit()
fake_cur.close()
#after doing stuff to the dataframe
s_buf = io.StringIO()
df.to_csv(s_buf)
process_file(cms_dtypes.pg_engine, 'fact_cms_employee', s_buf)