Suponha que eu tenha um bucket gcs com arquivos json com a seguinte estrutura:
[
{
"Id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"Name": "alibaba",
"storeid": "Y1",
"storeName": "alibaba1",
"a": "1/2/3",
"b": "1.0/1.0/3",
"c": "0/0/0",
"d": "0/0/0",
"e": "1.8/3.4",
"f": "1/2/3",
"g": "1/2/3",
},
{
"Id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"Name": "alibaba",
"storeUuid": "Y2",
"storeName": "alibaba2",
"a": "1/2/3",
"b": "1.0/1.0/3",
"c": "0/0/0",
"d": "0/0/0",
"e": "1.7/2.4",
"f": "1/2/3",
"g": "1/2/3",
},
{
"Id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"Name": "alibaba",
"storeUuid": "Y3",
"storeName": "alibaba3",
"a": "1/2/3",
"b": "1.0/1.0/3",
"c": "0/0/0",
"d": "0/0/0",
"e": "2.7/4.4",
"f": "1/2/3",
"g": "1/2/3",
},
{
"Id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"Name": "alibaba",
"storeUuid": "Y4",
"storeName": "alibaba4",
"a": "1/2/3",
"b": "1.0/1.0/3",
"c": "0/0/0",
"d": "0/0/0",
"e": "3.7/5.4",
"f": "1/2/3",
"g": "1/2/3",
}
]
O que eu quero fazer é agregar os diferentes valores somando a, b,c, d, f,g
e calculando a média e
para retornar um único json
como
[
{
"Id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"Name": "alibaba",
"a": "sum over all first instance/sum over all second instances/sum aover all third instance",
"b": "sum over all first instance/sum over all second instances/sum aover all third instance",
"c": "sum over all first instance/sum over all second instances/sum aover all third instance",
"d": "sum over all first instance/sum over all second instances/sum aover all third instance",
"e": "average over all first instance/average over all second instance",
"f": "sum over all first instance/sum over all second instances/sum aover all third instance",
"g": "sum over all first instance/sum over all second instances/sum aover all third instance",
}
]
Não que algum dos valores em */*/*
possa ser NaN e que os dados em e
possam ser uma string data unvavailable
.
Em criei esta função
def format_large_numbers_optimized(value):
abs_values = np.abs(value)
mask = abs_values >= 1e6
formatted_values = np.where(mask,
np.char.add(np.round(value / 1e6, 2).astype(str), "M"),
np.round(value, 2).astype(str))
return formatted_values
def process_json_data_optimized(json_list):
result = {}
keys = set(json_list[0].keys()) - {'Id', 'Name', 'storeid', 'storeName'}
for key in keys:
result[key] = {'values': []}
for json_data in json_list:
for key in keys:
value = json_data.get(key, '0')
result[key]['values'].append(value)
for key in keys:
all_values_processed = []
for value in result[key]['values']:
if isinstance(value, str) and '/' in value:
processed_values = [float(v) if v != 'data unavailable' else 0 for v in value.split('/')]
elif isinstance(value, float) or isinstance(value, int):
processed_values = [value]
else:
processed_values = [0.0]
all_values_processed.append(processed_values)
numeric_values = np.array(all_values_processed)
if numeric_values.ndim == 1:
numeric_values = numeric_values[:, np.newaxis]
summed_values = np.sum(numeric_values, axis=0)
formatted_summed_values = '/'.join(format_large_numbers_optimized(summed_values))
result[key]['summed'] = formatted_summed_values
processed_result = {key: data['summed'] for key, data in result.items()}
processed_result['Id'] = json_list[0]['Id']
processed_result['Name'] = json_list[0]['Name']
return processed_result
Mas isso não cria o que eu espero. Estou totalmente perdido. Eu realmente apreciaria qualquer ajuda.
Observe que você está colocando os valores como listas
all_values_processed
. Supondo que o/
caractere seja apenas um separador, e que o que você deseja substituindoall_values_processed.append(processed_values)
porall_values_processed += processed_values
. Ou melhor ainda, você poderia apenas agregar os valores.Por exemplo, você poderia ter uma função para agregar assim
Uma função que agrega as chaves fornecidas no json
Agora
fornecerá um dicionário com tuplas contendo a contagem e a soma de cada campo. Para obter sua resposta final, você poderia fazer
Já que você marcou os pandas e se eu acertei o OP, aqui está uma solução genérica em potencial:
Saída :
Entrada usada: