Парсинг и обработка данных на python

Узнай цену своей работы

Формулировка задачи:

Есть такая ситуация, через апи со стороннего ресурса получаю json данные. В таком формате:
Объектов в массиве rows может быть очень много, порядка 100 тысяч. Самих параметров в каждом объекте около 30 Задача следующая, выбрать все объекты где param1 >= X и param2 <= Y, после чего посчитать например значение A в зависимости от других параметров, и если A больше какого то значения то этот объект добавляется в список. На данный момент это реализовано в цикле for с проверкой через if, далее идет вычисление, снова if и потом append в другой массив. Понятно что такое решение очень нагружает систему, делаются сравнения по параметрам в объекте которых множество когда нужен всего 1-2 параметра. Может кто сталкивался с подобным, как можно отфильтровать|отсортировать весь массив например, потом провести действия над теми элементами которые удовлетворяют условиям фильтра? Ну или из всего этого массива с объектами создать массив с объектами включающий не все параметры, а только их часть. Если всё заносить в базу данных то было бы гораздо проще, выбрать только те значения которые удовлетворяют фильтру, и уже над ними проводить какие то операции. Но данных очень много и выборки по апи могут быть разными, за сегодня, за вчера, сразу цельно за 3 дня и так далее. Плюс данные за одно и то же число могут дополнятся и изменятся на стороне апи в течении какого то времени. Есть возможность юзать дедик на 64 гига - но наращивание мощностей не вариант когда вопрос кроется в оптимизации... PLEASE HELP!!!

Решение задачи: «Парсинг и обработка данных на python»

textual
Листинг программы
# coding: utf-8
 
import pandas as pd
from pandas import Series,DataFrame
import numpy as np
 
import json
 
path=r"D:\INSTALL\Python3\PROJECTS\example.json"
with open(path, 'r',encoding="utf-8") as f:
    obj=json.load(f)
    #print(obj)
    print(obj["message"]["rows"][:10]) 
    # выведем первые 10 строк из объекта json
    
# создадим фрейм из json
frame=DataFrame(obj['message']['rows'])
# %timeit: 1 loop, best of 3: 287 ms per loop
#frame # выведем фрейм
 
print(frame.info())  # получим параметры фрейма
Out="""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 33739 entries, 0 to 33738
Data columns (total 21 columns):
actions            33739 non-null object
customVariable1    33739 non-null object
param1             33739 non-null int64
param10            33739 non-null float64
param11            33739 non-null int64
param12            33739 non-null int64
param13            33739 non-null int64
param14            33739 non-null float64
param15            33739 non-null int64
param16            33739 non-null int64
param17            33739 non-null int64
param18            33739 non-null int64
param19            33739 non-null float64
param2             33739 non-null int64
param3             33739 non-null int64
param4             33739 non-null int64
param5             33739 non-null int64
param6             33739 non-null int64
param7             33739 non-null int64
param8             33739 non-null int64
param9             33739 non-null int64
dtypes: float64(3), int64(16), object(2)
memory usage: 5.1+ MB
"""
 
# делаем выборку по одному параметру
frame2=frame[frame.param1>2]
# %timeit: 100 loops, best of 3: 3.8 ms per loop
#frame2 # выведем фрейм
 
print(frame2.info()) # получим параметры фрейма
Out="""
<class 'pandas.core.frame.DataFrame'>
Int64Index: 7844 entries, 2 to 33737
Data columns (total 21 columns):
actions            7844 non-null object
customVariable1    7844 non-null object
param1             7844 non-null int64
param10            7844 non-null float64
param11            7844 non-null int64
param12            7844 non-null int64
param13            7844 non-null int64
param14            7844 non-null float64
param15            7844 non-null int64
param16            7844 non-null int64
param17            7844 non-null int64
param18            7844 non-null int64
param19            7844 non-null float64
param2             7844 non-null int64
param3             7844 non-null int64
param4             7844 non-null int64
param5             7844 non-null int64
param6             7844 non-null int64
param7             7844 non-null int64
param8             7844 non-null int64
param9             7844 non-null int64
dtypes: float64(3), int64(16), object(2)
memory usage: 1.3+ MB
""" 
 
# делаем выборку по двум условиям
cond   = frame.param1 > 2
cond1  = frame.param14 > 0.02
frame2 = frame[cond  & cond1]
# для каждого действия
# %timeit: 1000 loops, best of 3: 326 µs per loop
# %timeit: 1000 loops, best of 3: 227 µs per loop
# %timeit: 100 loops, best of 3: 3.34 ms per loop
 
print(frame2.info()) # получим параметры фрейма
Out="""
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1791 entries, 12 to 33723
Data columns (total 21 columns):
actions            1791 non-null object
customVariable1    1791 non-null object
param1             1791 non-null int64
param10            1791 non-null float64
param11            1791 non-null int64
param12            1791 non-null int64
param13            1791 non-null int64
param14            1791 non-null float64
param15            1791 non-null int64
param16            1791 non-null int64
param17            1791 non-null int64
param18            1791 non-null int64
param19            1791 non-null float64
param2             1791 non-null int64
param3             1791 non-null int64
param4             1791 non-null int64
param5             1791 non-null int64
param6             1791 non-null int64
param7             1791 non-null int64
param8             1791 non-null int64
param9             1791 non-null int64
dtypes: float64(3), int64(16), object(2)
memory usage: 293.8+ KB
"""
#frame2 # выведем фрейм
 
dic=frame2.to_dict(orient="index") # конвертруем полученный выборкой фрейм в python словарь
print(dic)
 
print(dic[32771]["param1"])
 
lst=list(dic.values()) # конвертируем словаь в list
print(len(lst))    # 1791
print(lst)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.833 из 5