SQL cx_Oracle 中循环中的大型数据集的字典追加

SQL Dictionary Appending for Large Datasets in a Loop in cx_Oracle

我正在尝试将字典附加在一起,然后使用“from_dict”从 cx_Oracle 获取最终返回的数据,因为我听说从 [=27] 附加每个返回的行效率更高=].但是,我的循环仍然需要很长时间(结束循环 returns 一个非常大的数据库,每个循环获取一个 I.D 的数据。每个 returns ~ 12,000 行 I.D.-循环中有 700 多个 I.D.s)。我如何利用“from_dict”来加快速度?我认为这不是最有效的方法,因为我现在已经编写了代码。有什么建议么?谢谢。

有没有更高效的方法?使用 concat 而不是 append?

for iteration, c in enumerate(l, start = 1):
   total = len(l)
   data['SP_ID'] = c
   data['BEGIN_DATE'] = BEGIN_DATE
   print("Getting consumption data for service point I.D.:", c, " ---->", iteration, "of", total)
   cursor.arraysize = 1000000
   cursor.prefetchrows = 2
   cursor.execute(sql, data)
   cursor.rowfactory = lambda *args: dict(zip([d[0] for d in cursor.description], args))
   df_row = cursor.fetchall()
   if len(df_row) == 0:
      pass
   else:
      a = {k: [d[k] for d in df_row] for k in df_row[0]} # Here is where I combine dictionaries, but this is for only dataset pulling from SQL.I want to combine all the dictionaries from each loop to increase efficiency.
      AMI_data = pd.DataFrame.from_dict(a)
      #AMI.append(AMI_data)
      #final_AMI_data = pd.concat(AMI)
      # final_data.dropna(inplace = True)

# UPDATED

final_AMI_data = pd.DataFrame()

for iteration, c in enumerate(l, start = 1):
   total = len(l)
   data['SP_ID'] = c
   data['BEGIN_DATE'] = BEGIN_DATE
   print("Getting consumption data for service point I.D.:", c, " ---->", iteration, "of", total)
   cursor.arraysize = 1000000
   cursor.prefetchrows = 2
   cursor.execute(sql, data)
   cursor.rowfactory = lambda *args: dict(zip([d[0] for d in cursor.description], args))
   df_row = cursor.fetchall()
   if len(df_row) == 0:
      pass
   else:
      AMI_data = pd.DataFrame.from_records(df_row)
      final_AMI_data.append(AMI_data, ignore_index = False)
      # final_data.dropna(inplace = True)

如果您已经拥有字典式游标工厂,则无需重新创建字典。 (顺便说一句,请参阅 了解如何制作更好的。)

假设您的 df_rows 在获取所有行后看起来像这样,其中 'X' 和 'Y' 是查询结果的示例列名称:

[{'X': 'xval1', 'Y': 'yval1'},
 {'X': 'xval2', 'Y': 'yval2'},
 {'X': 'xval3', 'Y': 'yval3'}]

1. 然后使用 .from_records() 创建数据框:

pd.DataFrame.from_records(df_rows)

输出:

       X      Y
0  xval1  yval1
1  xval2  yval2
2  xval3  yval3

这样,您无需重组结果即可与 from_dict() 一起使用。

2. 如果您想继续将每组 12,000 个结果添加到同一个 DataFrame,请使用 DataFrame.append()ignore_index=True 继续添加每个现有数据框的新结果组。

最好只是附加到你的数据框中,而不是创建一个越来越大的字典来最终创建一个 df。


如果不清楚,删除 这两行 else:

a = {k: [d[k] for d in df_row] for k in df_row[0]}
AMI_data = pd.DataFrame.from_dict(a)

并将其替换为:

AMI_data = pd.DataFrame.from_records(df_row)
# and then to add it to your final:
final_AMI_data.append(AMI_data, ignore_index=True)