Преобразование списка в датафрейм в многопроцессорной среде - PullRequest
0 голосов
/ 26 апреля 2020

Я использую многопроцессорность в python для повышения производительности кода. Вместо добавления результата непосредственно в фрейм данных я использую общий список.

df_list = mp.Manager().list()

Значения вычисляются и добавляются в приведенный выше список различными процессами.

lock.acquire()
    try:
        temp = [a, b, c, d, e, f, g, h, i, j, k, l, m, n]
        df_list.append(temp)
    finally:
        lock.release()

алфавиты являются переменными, содержащими разные значения.

После завершения дочерних процессов список содержит следующие значения:

print(df_list)
[[0, '2009-10-01', '2010-01-01', 3, 3, 1, 0.25, 0.9, 6, 100000, 101866.70524177742, 7.68, 100000, 0.0], 
 [1, '2009-10-01', '2010-01-01', 5, 7, 2, 0.25, 0.4, 8, 100000, 101866.70524177742, 9.32, 100000, 0.0]] 

Теперь мне нужно преобразовать список в фрейм данных.

cols = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N"]
df = pd.DataFrame(df_list, columns = cols) 

Однако я получаю следующую ошибку:

ValueError                                Traceback (most recent call last)
~\Desktop\Temp\Python\calculate.py in <module>
    469     print(df_list)
    470
--> 471     df = pd.DataFrame(df_list, columns = cols)
    472

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\frame.py in __init__(self, data, index, columns, dtype, copy)
    466                                    dtype=values.dtype, copy=False)
    467             else:
--> 468                 raise ValueError('DataFrame constructor not properly called!')
    469
    470         NDFrame.__init__(self, mgr, fastpath=True)

Не могли бы вы сообщить мне, если я делаю что-то не так.

РЕДАКТИРОВАТЬ: Если мы заменяем список стандартным списком, который он работает (как уже упоминалось в комментариях). Тем не менее, в многопроцессорной среде нам нужен список менеджера для совместного использования между процессами.

Кроме того, я нашел обходной путь, и он, кажется, работает:

simple_list = []
for l in df_list:
    simple_list.append(l)
df = pd.DataFrame(simple_list, columns = cols)

Однако, как вы можете видеть, не очень элегантный способ делать вещи. Тем не менее, остается вопрос: почему я не могу преобразовать список менеджера в фрейм данных за один шаг. Может я что-то не так делаю?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Здесь прекрасно работает (когда я использую стандарт list):

In [1]: import pandas as pd                                                                              

In [2]: df_list = [[0, '2009-10-01', '2010-01-01', 3, 3, 1, 0.25, 0.9, 6, 100000, 101866.70524177742, 7.6
   ...: 8, 100000, 0.0],  
   ...:  [1, '2009-10-01', '2010-01-01', 5, 7, 2, 0.25, 0.4, 8, 100000, 101866.70524177742, 9.32, 100000,
   ...:  0.0]]

In [3]: cols = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N"]

In [4]: df = pd.DataFrame(df_list, columns = cols)                                                       
Out[4]: 
   A           B           C  D  E  F     G    H  I       J              K     L       M    N
0  0  2009-10-01  2010-01-01  3  3  1  0.25  0.9  6  100000  101866.705242  7.68  100000  0.0
1  1  2009-10-01  2010-01-01  5  7  2  0.25  0.4  8  100000  101866.705242  9.32  100000  0.0

Так что проблема заключается в использовании прокси. Решение состоит в том, чтобы преобразовать в список, прежде чем использовать его для создания DataFrame. Заметьте:

In [1]: import multiprocessing as mp

In [2]: proxy = mp.Manager().list([1,2,3])
Out[2]: <ListProxy object, typeid 'list' at 0x8042e5710>

In [3]: reallist = list(proxy)
Out[3]: [1, 2, 3]

In [4]: type(reallist)
Out[4]: list

После явного преобразования мы возвращаемся к обычному старому списку.

0 голосов
/ 26 апреля 2020

Мне известен следующий подход для правильного преобразования из списка в Dataframe (может быть много других подходов):

  1. Задание имени столбца как части списка, как показано ниже: (Я взял только первый 2 колонки из вашего набора)
    df_list= [[ {"A":0 }, {"B": '2009-10-01'}],
        [ {"A":1}, {"B":'2009-10-01'}]]
Затем, используя приведенный ниже код, вы можете преобразовать в кадр данных:
    df = pd.DataFrame(df_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...