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

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

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

Есть такая ситуация, через апи со стороннего ресурса получаю json данные. В таком формате:
Листинг программы
  1. {
  2. "rows": [
  3. {
  4. "param1": 1555,
  5. "param2": 0.1,
  6. "param3": 988,
  7. "paramN": "N"
  8. },
  9. {
  10. "param1": 105,
  11. "param2": 3,
  12. "param3": 100,
  13. "paramN": "N"
  14. },
  15. {
  16. "param1": 500,
  17. "param2": 1,
  18. "param3": 450,
  19. "paramN": "N"
  20. }
  21. ]
  22. }
Объектов в массиве rows может быть очень много, порядка 100 тысяч. Самих параметров в каждом объекте около 30 Задача следующая, выбрать все объекты где param1 >= X и param2 <= Y, после чего посчитать например значение A в зависимости от других параметров, и если A больше какого то значения то этот объект добавляется в список. На данный момент это реализовано в цикле for с проверкой через if, далее идет вычисление, снова if и потом append в другой массив. Понятно что такое решение очень нагружает систему, делаются сравнения по параметрам в объекте которых множество когда нужен всего 1-2 параметра. Может кто сталкивался с подобным, как можно отфильтровать|отсортировать весь массив например, потом провести действия над теми элементами которые удовлетворяют условиям фильтра? Ну или из всего этого массива с объектами создать массив с объектами включающий не все параметры, а только их часть. Если всё заносить в базу данных то было бы гораздо проще, выбрать только те значения которые удовлетворяют фильтру, и уже над ними проводить какие то операции. Но данных очень много и выборки по апи могут быть разными, за сегодня, за вчера, сразу цельно за 3 дня и так далее. Плюс данные за одно и то же число могут дополнятся и изменятся на стороне апи в течении какого то времени. Есть возможность юзать дедик на 64 гига - но наращивание мощностей не вариант когда вопрос кроется в оптимизации... PLEASE HELP!!!

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

textual
Листинг программы
  1. # coding: utf-8
  2.  
  3. import pandas as pd
  4. from pandas import Series,DataFrame
  5. import numpy as np
  6.  
  7. import json
  8.  
  9. path=r"D:\INSTALL\Python3\PROJECTS\example.json"
  10. with open(path, 'r',encoding="utf-8") as f:
  11.     obj=json.load(f)
  12.     #print(obj)
  13.     print(obj["message"]["rows"][:10])
  14.     # выведем первые 10 строк из объекта json
  15.    
  16. # создадим фрейм из json
  17. frame=DataFrame(obj['message']['rows'])
  18. # %timeit: 1 loop, best of 3: 287 ms per loop
  19. #frame # выведем фрейм
  20.  
  21. print(frame.info())  # получим параметры фрейма
  22. Out="""
  23. <class 'pandas.core.frame.DataFrame'>
  24. RangeIndex: 33739 entries, 0 to 33738
  25. Data columns (total 21 columns):
  26. actions            33739 non-null object
  27. customVariable1    33739 non-null object
  28. param1             33739 non-null int64
  29. param10            33739 non-null float64
  30. param11            33739 non-null int64
  31. param12            33739 non-null int64
  32. param13            33739 non-null int64
  33. param14            33739 non-null float64
  34. param15            33739 non-null int64
  35. param16            33739 non-null int64
  36. param17            33739 non-null int64
  37. param18            33739 non-null int64
  38. param19            33739 non-null float64
  39. param2             33739 non-null int64
  40. param3             33739 non-null int64
  41. param4             33739 non-null int64
  42. param5             33739 non-null int64
  43. param6             33739 non-null int64
  44. param7             33739 non-null int64
  45. param8             33739 non-null int64
  46. param9             33739 non-null int64
  47. dtypes: float64(3), int64(16), object(2)
  48. memory usage: 5.1+ MB
  49. """
  50.  
  51. # делаем выборку по одному параметру
  52. frame2=frame[frame.param1>2]
  53. # %timeit: 100 loops, best of 3: 3.8 ms per loop
  54. #frame2 # выведем фрейм
  55.  
  56. print(frame2.info()) # получим параметры фрейма
  57. Out="""
  58. <class 'pandas.core.frame.DataFrame'>
  59. Int64Index: 7844 entries, 2 to 33737
  60. Data columns (total 21 columns):
  61. actions            7844 non-null object
  62. customVariable1    7844 non-null object
  63. param1             7844 non-null int64
  64. param10            7844 non-null float64
  65. param11            7844 non-null int64
  66. param12            7844 non-null int64
  67. param13            7844 non-null int64
  68. param14            7844 non-null float64
  69. param15            7844 non-null int64
  70. param16            7844 non-null int64
  71. param17            7844 non-null int64
  72. param18            7844 non-null int64
  73. param19            7844 non-null float64
  74. param2             7844 non-null int64
  75. param3             7844 non-null int64
  76. param4             7844 non-null int64
  77. param5             7844 non-null int64
  78. param6             7844 non-null int64
  79. param7             7844 non-null int64
  80. param8             7844 non-null int64
  81. param9             7844 non-null int64
  82. dtypes: float64(3), int64(16), object(2)
  83. memory usage: 1.3+ MB
  84. """
  85.  
  86. # делаем выборку по двум условиям
  87. cond   = frame.param1 > 2
  88. cond1  = frame.param14 > 0.02
  89. frame2 = frame[cond  & cond1]
  90. # для каждого действия
  91. # %timeit: 1000 loops, best of 3: 326 µs per loop
  92. # %timeit: 1000 loops, best of 3: 227 µs per loop
  93. # %timeit: 100 loops, best of 3: 3.34 ms per loop
  94.  
  95. print(frame2.info()) # получим параметры фрейма
  96. Out="""
  97. <class 'pandas.core.frame.DataFrame'>
  98. Int64Index: 1791 entries, 12 to 33723
  99. Data columns (total 21 columns):
  100. actions            1791 non-null object
  101. customVariable1    1791 non-null object
  102. param1             1791 non-null int64
  103. param10            1791 non-null float64
  104. param11            1791 non-null int64
  105. param12            1791 non-null int64
  106. param13            1791 non-null int64
  107. param14            1791 non-null float64
  108. param15            1791 non-null int64
  109. param16            1791 non-null int64
  110. param17            1791 non-null int64
  111. param18            1791 non-null int64
  112. param19            1791 non-null float64
  113. param2             1791 non-null int64
  114. param3             1791 non-null int64
  115. param4             1791 non-null int64
  116. param5             1791 non-null int64
  117. param6             1791 non-null int64
  118. param7             1791 non-null int64
  119. param8             1791 non-null int64
  120. param9             1791 non-null int64
  121. dtypes: float64(3), int64(16), object(2)
  122. memory usage: 293.8+ KB
  123. """
  124. #frame2 # выведем фрейм
  125.  
  126. dic=frame2.to_dict(orient="index") # конвертруем полученный выборкой фрейм в python словарь
  127. print(dic)
  128.  
  129. print(dic[32771]["param1"])
  130.  
  131. lst=list(dic.values()) # конвертируем словаь в list
  132. print(len(lst))    # 1791
  133. print(lst)

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут