Вопрос: достаточно ли эффективны предложенные методы для выравнивания данного фрейма данных или их можно усовершенствовать?
Пример столбцов входного фрейма данных pandas (это заданное значение, не может быть изменено):
id1 (строка)
id2 (строка)
date_create (datetime[ms])
json_data (объект)
Пример pd.DataFrame(...).to_dict(orient="records"):
final_rows = []
for _, df_row in df.iterrows():
for json_data in df_row["json_data"]:
uuid = json_data.get("uuid", "")
token = json_data.get("token", "")
for data_item in json_data.get("data", []):
for month_col, month_txs in data_item.items():
for tx in month_txs:
final_row = {
"id1": df_row["id1"],
"id2": df_row["id2"],
"date_create": df_row["date_create"],
"uuid": uuid,
"token": token,
"month": month_col,
"type": tx.get("type", None),
"count": tx.get("count", 0),
"amount": tx.get("amount", 0),
}
final_rows.append(final_row)
result = pd.DataFrame(
final_rows,
columns=[
"id1",
"id2",
"date_create",
"uuid",
"token",
"month",
"type",
"count",
"amount",
],
)
Похоже, что циклы for на самом деле дают примерно те же результаты производительности, что и код pandas, на нескольких сотнях тысяч строк данного кадра данных. Часть, которую я лично не могу понять, — это код для выравнивания чуть менее вложенных структур данных (на 2-4 уровня выше самой нижней), но в целом то же самое, и с Pandas, и с циклами for почти в 20 и 6 раз быстрее соответственно, чем то, что я предоставил.
Это только часть кода, который выполняется; другой — агрегация данных, но это единственная часть, которая не сильно меняется между кадрами данных с разными структурами данных.
Важные соображения относительно среды, в которой выполняется код: это движок pyspark с параллельной пакетной обработкой, 1000 строк на пакет (кажется, довольно небольшим для использования возможностей панд, не могу сказать наверняка). Каждый пакет выполняется на отдельном узле, каждый из них извлекает данные из базы данных с отдельным соединением.
Если код pandas настолько эффективен, насколько это возможно, может ли переход на pyspark.sql или поляры кардинально изменить ситуацию?
Вопрос: достаточно ли эффективны предложенные методы для выравнивания данного фрейма данных или их можно усовершенствовать? Пример столбцов входного фрейма данных pandas (это заданное значение, не может быть изменено): [list] [*]id1 (строка)
exploded = df.explode("json_data") # not using .apply(pd.Series), because unsure if all three keys present at all times exploded["uuid"] = exploded["json_data"].apply( lambda x: x.get("uuid", ""), ) exploded["token"] = exploded["json_data"].apply( lambda x: x.get("token", ""), ) exploded["json_data"] = exploded["json_data"].apply( lambda x: x.get("data", []), )
result = pd.DataFrame( final_rows, columns=[ "id1", "id2", "date_create", "uuid", "token", "month", "type", "count", "amount", ], ) [/code] Похоже, что циклы for на самом деле дают примерно те же результаты производительности, что и код pandas, на нескольких сотнях тысяч строк данного кадра данных. Часть, которую я лично не могу понять, — это код для выравнивания чуть менее вложенных структур данных (на 2-4 уровня выше самой нижней), но в целом то же самое, и с Pandas, и с циклами for почти в 20 и 6 раз быстрее соответственно, чем то, что я предоставил. Это только часть кода, который выполняется; другой — агрегация данных, но это единственная часть, которая не сильно меняется между кадрами данных с разными структурами данных. Важные соображения относительно среды, в которой выполняется код: это движок pyspark с параллельной пакетной обработкой, 1000 строк на пакет (кажется, довольно небольшим для использования возможностей панд, не могу сказать наверняка). Каждый пакет выполняется на отдельном узле, каждый из них извлекает данные из базы данных с отдельным соединением. Если код pandas настолько эффективен, насколько это возможно, может ли переход на pyspark.sql или поляры кардинально изменить ситуацию?