Python 熊猫:如何处理真正的大数据?
我的数据样本非常大(120万个文档),我只需要在一个“熊猫数据框架”上创建和分析数据。目前,我的代码如下所示:Python 熊猫:如何处理真正的大数据?,python,pandas,Python,Pandas,我的数据样本非常大(120万个文档),我只需要在一个“熊猫数据框架”上创建和分析数据。目前,我的代码如下所示: 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()
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构造函数没有正确调用
有什么想法吗?谢谢 我认为,由于您的文档集太大,无论您如何操作,都需要很长时间才能将其加载到内存中。我建议,如果不需要一次将整个数据集保存在内存中,可以使用pandas内置的load chunk方法。这允许您顺序加载和处理为此用例设计的数据块 看看这个问题吧
你可以这样做
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
使用此选项,您可以使用从postgres结果创建的优化数据帧
但是根据数据集的原因,将所有数据读入内存需要一些时间熊猫有一个很好的内置方法,应该非常有效
i、 e.只要做:
df = pd.read_sql("SELECT * FROM binance.zrxeth_ob_indicators", conn)
而且它应该会起作用
就其本身而言,120万行并不多,考虑到您的列数/名称,您可能需要检查以下答案:即使您的代码段工作正常,
df.concat([df,dfsub])
也会非常昂贵。它会在每次迭代中重新分配整个df。请注意: