2012-03-30 2 views
1
  • У меня есть большая коллекция в Монго
  • Я хочу, чтобы загрузить данные в Numpy ndarray
  • есть способ загрузки данных из MongoDB без перебора PyMongo. что-то вроде R-Mongo
+0

Я столкнулся с той же проблемой, и после длительного поиска, насколько я мог видеть, такого решения не существует. Я должен был написать собственный конвертер документов для ndarray, который довольно прост. Кроме того, поскольку кажется, что вы заинтересованы в возврате структуры типа dataframe, вы можете рассмотреть возможность преобразования в 'rec.array' vs 'ndarray'. Не стесняйтесь редактировать свой вопрос с помощью примеров документов из своей коллекции, и я могу предоставить вам пример кода, чтобы вы начали. – diliop

+0

@dilop, у меня есть данные в текстовом файле в настоящее время, и я должен сначала загрузить их в mongodb, поделиться тем, как вы это сделали, и я получу идею. – daydreamer

+0

Это вообще помогло или вам нужно больше идей? – diliop

ответ

0

Есть несколько предположений, которые подходят к этому, большинство из которых относятся к вашей схеме «схемы». В зависимости от того, насколько четко определены, то есть степень вложенности, ожидаемый тип и количество ключей и т. Д., Вы можете использовать ярлыки при конвертировании вашей коллекции в numpy rec.array. Я постараюсь, чтобы больше сосредоточиться на этом подходе и меньше на охвате всех возможных случаев конверсии, чтобы дать вам представление о том, как начать. Например, учитывая Монго документ, который выглядит следующим образом:

tdict = {'A': 151, 
     'B': 'somestring', 
     'C': [1, 2, 3], 
     '_id': ObjectId('4edd4e4367fbe05022000034')} 

или список таких документов:

tlist = [{'A': 151, 
      'B': 'somestring', 
      'C': [1, 2, 3], 
      '_id': ObjectId('4edd4e4367fbe05022000034')}, 
     {'A': 151, 
      'B': 'somestring', 
      'C': [1, 2, 3], 
      '_id': ObjectId('4edd4e4367fbe05022000034')}] 

Функция, которая может быть использована для преобразования этого списка numy rec.array может выглядеть это:

import numpy as n 

def DictToRecArray(data, columnNames=[]): 
    result = None 

    if data and isinstance(data, list) or isinstance(data, dict): 
     data = [data] if isinstance(data, dict) else data 
     if isinstance(data[0], dict): 
      columnNames = map(str, data[0].keys()) if not columnNames else columnNames 
      columns = [(str(c), type(data[0][c])) for c in columnNames] 
      for i,clm in enumerate(columns): 
       if clm[1].__name__ in ['str','unicode']: 
        maxlen = 0 
        for row in data:      
         maxlen = len(row[clm[0]]) if len(row[clm[0]]) > maxlen else maxlen 
        columns[i] = (clm[0], n.dtype('S%d' % maxlen,1)) 

      result = n.recarray((len(data)),dtype=columns) 
      c_order = [c[0] for c in columns] 
      for i,row in enumerate(data): 
       for c in c_order:   
        result[i][c] = row[c] 

    return result 

с columnNames, позволяя для подбора ключей от документов, которые будут использоваться в создании вашего rec.array, а также defin упорядочение этих ключей как столбцов в пределах самого rec.array.

Мой предыдущий пункт о предположениях становится очевиден, если вы потратите некоторое время на реализацию DictToRecArray. Например, я мог бы считать наличие значения list как возможность расширить документ на несколько строк в rec.array т.е. для ключа C в tDict я мог дублировать значение ключей A, B и _id и создать в результате rec.array с форма равна (3,) по сравнению с (1,). Спустившись по этому пути, вы увидите, что реализация DictToRecArray будет тесно связана с вашей «схемой», и моя реализация может тормозиться для некоторых ваших документов. Тем не менее, в этом случае, переходя к tlistDictToRecArray результатов:

rec.array([(151, [1, 2, 3], 'somestring', ObjectId('4edd4e4367fbe05022000034')), 
     (151, [1, 2, 3], 'somestring', ObjectId('4edd4e4367fbe05022000034'))], 
     dtype=[('A', '<i8'), ('C', '|O8'), ('B', '|S10'), ('_id', '|O8')]) 

Учитывая, что вы искали data.frame -типа результата от этого, rec.array должен служить вам хорошо. Надеюсь, это заставит вас идти по правильному пути.

Смежные вопросы