Оптимальная структура данных для сохранения множества словарей с разными ключами - PullRequest
0 голосов
/ 05 декабря 2018

Проблема состоит в том, чтобы сохранить словарь для анализа данных, чтобы он масштабировался.Я выполняю поиск 10000 и, основываясь на результатах, сохраняю словарь для каждого запроса.Наконец, я получаю словарь, подобный следующему:

{
'query_1' : {'has_result': True (or False),
             'direct_result': True (or False),
             'title': "title_1",
             'summary': "summary_1",
             'infobox': {'header_11': "data_11",
                         'header_12': "data_12",
                          .
                          .
                          .
              }
'query_2' : {'has_result': True (or False),
             'direct_result': True (or False),
             'title': "title_2",
             'summary': "summary_2",
             'infobox': {'header_21': "data_21",
                         'header_22': "data_22",
                          .
                          .
                          .
              }
.
.
.
}

Проблемной частью, очевидно, является «информационный блок».Я понятия не имею, сколько пар ключ-значение я получу за каждый «информационный блок» (обычно не более 50).И ключи, как ожидается, будут разными для каждого информационного ящика.

Сейчас я могу думать только о следующем способе сохранения данных в формате CSV.

+---------+------------+---------------+---------+-----------+----------------+--------------+
|  query  | has_result | direct_result |  title  |  summary  | infobox_header | infobox_data |
+---------+------------+---------------+---------+-----------+----------------+--------------+
| query_1 | TRUE       | TRUE          | title_1 | summary_1 | header_1       | data_1       |
| query_1 | TRUE       | TRUE          | title_1 | summary_1 | header_2       | data_2       |
| query_1 | TRUE       | TRUE          | title_1 | summary_1 | header_3       | data_3       |
| query_1 | TRUE       | TRUE          | title_1 | summary_1 | header_4       | data_4       |
| query_1 | TRUE       | TRUE          | title_1 | summary_1 | header_5       | data_5       |
| query_2 | TRUE       | FALSE         | title_2 | summary_2 | header_1       | data_1       |
| query_2 | TRUE       | FALSE         | title_2 | summary_2 | header_2       | data_2       |
| query_2 | TRUE       | FALSE         | title_2 | summary_2 | header_3       | data_3       |
| query_2 | TRUE       | FALSE         | title_2 | summary_2 | header_4       | data_4       |
+---------+------------+---------------+---------+-----------+----------------+--------------+

Проблема с моимРешение заключается в том, что «title» и «summary» являются строковой переменной.Для 10000 запросов это не имеет большого значения.Я получаю примерно 200 000 строк.Но я просто думаю, теоретически, это лучший способ сохранить этот словарь для целей анализа данных.

Что если в будущем я использую 100 000 или 1 000 000 запросов?Как вы решите эту проблему?Будете ли вы использовать другую структуру данных с самого начала?и как ты будешь готов к анализу данных?

1 Ответ

0 голосов
/ 05 декабря 2018

Для анализа данных с помощью Python лучшим вариантом будет использование класса.К счастью, есть сторонние библиотеки, которые предоставляют эту функцию, такие как Pandas .

В приведенном ниже решении используется рецепт @ MaxU's explode .

import pandas as pd

# construct dataframe from dictionary of dictionaries, d
df = pd.DataFrame.from_dict(d, orient='index').rename_axis('query').reset_index()

# extract header & data, drop infobox
df['header'] = df['infobox'].map(list)
df['data'] = df['infobox'].map(lambda x: list(x.values()))
df = df.drop('infobox', 1)

# expand dataframe
res = explode(df, ['header', 'data'])

print(res)

     query  has_result  direct_result    title    summary     header     data
0  query_1        True          False  title_1  summary_1  header_11  data_11
1  query_1        True          False  title_1  summary_1  header_12  data_12
2  query_2       False           True  title_2  summary_2  header_21  data_21
3  query_2       False           True  title_2  summary_2  header_22  data_22

Выбор хранилища - это широкий вопрос, который зависит от ваших вариантов использования, требований, существующей инфраструктуры и т. Д. В целом, вы можете счесть Pickle и HDF5 адекватными;с HDF5, обеспечивающим преимущества портативности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...