эффективно растущий большой массив данных по вертикали - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть следующий код, который рекурсивно перебирает каталог, содержащий тысячи CSV-файлов, и пытается прочитать и добавить их все в один DataFrame:

df = pd.DataFrame()
symbol = symbol.upper()

for filepath in glob.iglob(r'W:\data\{0}\option\**\**\**.csv'.format(188), recursive=True):

    optionNameCSI = filepath.split("\\")[-1].split('.')[0]
    try:
        tmp = pd.read_csv(filepath, engine='c')
        strike = tmp['Strike'].iloc[-1]
        expiry = pd.to_datetime(tmp['Option Expiration Date'].iloc[-1])
        m = expiry.month
        y = expiry.year
        PutCall = tmp['PutCall'].iloc[-1]
        future = symbol + numToLetter[m] + str(y)
    except (IndexError, KeyError) as e:
        continue

    if tmp.empty:
        df = tmp
    else:
        df = df.append(tmp)

    print(optionName, 'loaded')

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

1 Ответ

0 голосов
/ 19 ноября 2018

рассмотрите возможность разделения вашего кода на отдельные функции, например, так:

def get_data_from_csv(filepath):
    optionNameCSI = filepath.split("\\")[-1].split('.')[0]
    try:
        df = pd.read_csv(filepath, engine='c')
        # do stuff ...
        return df
    except (IndexError, KeyError) as e:
        return

, тогда вы можете использовать понимание списка, чтобы собрать все данные в списке, как предложили люди выше

filepaths = glob.iglob(r'W:\data\{0}\option\**\**\**.csv'.format(188), recursive=True)
result = [get_data_from_csv(filepath) for filepath in filepaths]
result = [r for r in result if r is not None] # remove 'None' values

затем объедините данные, используя pd.concat

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