Парсинг и обработка данных на 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)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д