Парсинг и обработка данных на python
Формулировка задачи:
Есть такая ситуация, через апи со стороннего ресурса получаю json данные.
В таком формате:
Объектов в массиве rows может быть очень много, порядка 100 тысяч. Самих параметров в каждом объекте около 30
Задача следующая, выбрать все объекты где param1 >= X и param2 <= Y, после чего посчитать например значение A в зависимости от других параметров, и если A больше какого то значения то этот объект добавляется в список.
На данный момент это реализовано в цикле for с проверкой через if, далее идет вычисление, снова if и потом append в другой массив.
Понятно что такое решение очень нагружает систему, делаются сравнения по параметрам в объекте которых множество когда нужен всего 1-2 параметра. Может кто сталкивался с подобным, как можно отфильтровать|отсортировать весь массив например, потом провести действия над теми элементами которые удовлетворяют условиям фильтра? Ну или из всего этого массива с объектами создать массив с объектами включающий не все параметры, а только их часть.
Если всё заносить в базу данных то было бы гораздо проще, выбрать только те значения которые удовлетворяют фильтру, и уже над ними проводить какие то операции. Но данных очень много и выборки по апи могут быть разными, за сегодня, за вчера, сразу цельно за 3 дня и так далее. Плюс данные за одно и то же число могут дополнятся и изменятся на стороне апи в течении какого то времени.
Есть возможность юзать дедик на 64 гига - но наращивание мощностей не вариант когда вопрос кроется в оптимизации...
PLEASE HELP!!!
Листинг программы
- {
- "rows": [
- {
- "param1": 1555,
- "param2": 0.1,
- "param3": 988,
- "paramN": "N"
- },
- {
- "param1": 105,
- "param2": 3,
- "param3": 100,
- "paramN": "N"
- },
- {
- "param1": 500,
- "param2": 1,
- "param3": 450,
- "paramN": "N"
- }
- ]
- }
Решение задачи: «Парсинг и обработка данных на 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)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д