@Mark_Beresrtov

Как агрегировать данные по элементам вложенного массива?

Из стороннего сервиса выгружаются данные в виде json(csv):
[{ "customer_id": "5f9d7b0a100400c6f00ad1cb",
  "customer_pet": "cat",
  "customer_cat_color": "gold",
  "customer_cat_name": "",
  "timestamp": "2023-05-15 12:22:22.111241 UTC",
  "list_cart": [
    "cart_1",
    "cart_2",
    "cart_3" ]},
  {"customer_id": "5f9d7b0a100400c6f00ad1cb",
  "customer_pet": "cat",
  "customer_cat_color": "gold",
  "customer_cat_name": "",
  "timestamp": "2023-05-15 13:33:33.111241 UTC",
  "list_cart": [
    "cart_3",
    "cart_7",
    "cart_1" ]}
]


Как лучше посчитать посчитать кол-во клиентов с каждым элементом из list_cart?
Т.е. итог нужен в виде
item count
cart_1 ---2
cart_2 ---1
cart_3 ---2
cart_7 ---1

Сейчас вижу вариант добавить уникальный id_event каждому событию и развернуть массив присваивая каждому элементу из list_cart значения id_event, customer_id и сформировать таким образом таблицу/датафрейм с которым работать.

Возможные технологии - Node.js/Python/Pandas/SQL(желательно MS SQL, но можно PostgreSQL и др. диалекты)/Mongo
  • Вопрос задан
  • 67 просмотров
Решения вопроса 1
Maksim_64
@Maksim_64
Data Analyst
Ну пустяковая для pandas проблема.

import pandas as pd
import numpy as np

data = [{ "customer_id": "5f9d7b0a100400c6f00ad1cb",
  "customer_pet": "cat",
  "customer_cat_color": "gold",
  "customer_cat_name": "",
  "timestamp": "2023-05-15 12:22:22.111241 UTC",
  "list_cart": [
    "cart_1",
    "cart_2",
    "cart_3" ]},
  {"customer_id": "5f9d7b0a100400c6f00ad1cb",
  "customer_pet": "cat",
  "customer_cat_color": "gold",
  "customer_cat_name": "",
  "timestamp": "2023-05-15 13:33:33.111241 UTC",
  "list_cart": [
    "cart_3",
    "cart_7",
    "cart_1" ]}
]

df = pd.DataFrame(data)
print(df['list_cart'].explode().value_counts())


Все результат как ты хотел, ну и вдобавок глянь на фрейм колонку list_cart можно, распарсить, как надо под любые нужды. Для других операций группировок и т.д.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019
Bigdata Engineer
выгружаются данные в виде json(csv):

Я вижу 2 стратегии как с этим работать.

1) Как с чистым JSON документом. Можно работать языком запросов JsonPath. И выбирать и трансформировать узлы Json многократно до полного формирования результата.

2) Как с дата-фреймом технологии Pandas, Databricks/Spark. Судя по внешнему виду это Пандас
загрузит успешно. Насчет Датабрикс я не уверент. Тот точно работает с Json-Lines а не с таким деревом где
есть единый корень. У дата-фрейма есть свойства SQL-курсора. Тоесть по нему можно бегать и выбирать
данные. Или другой датафрейм. И датафрейм обычно имеет больший запас прочности по объему данных.

Какую стратегию выбрать - это больше вопрос к автору. Вот что он лучше знает - то пускай и выбирает.
Ответ написан
Комментировать
ipatiev
@ipatiev
Потомок старинного рода Ипатьевых-Колотитьевых
В цикле.
Все операции над массивами производятся в цикле.

Чтобы посчитать количество элементов, вам не нужно Node.js/Pandas/MS SQL,PostgreSQL и их диалекты/Mongo а так же SQL, JAVASCRIPT и MONGODB

Также, перебор массива в цикле с трудом можно отнести к DATA SCIENCE.
Скорее - к первому классу начальной школы программирования.

Попробуйте освоить эту чрезвычайно сложную операцию.
В одном цикле вы перебираете записи массива, и в еще одном, вложенном, цикле перебираете list_cart и создаете новый массив, в котором ключом является элемент из list_cart, а значением - счетчик.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы