Векторизация или параллельная обработка - PullRequest
0 голосов
/ 06 ноября 2018

Я написал некоторый код следующим образом

import pandas as pd
import numpy as np

df = pd.read_csv('D:\\Commodities\\FuturesDatafiltered.csv') #, parse_dates = ['Date'])
trades = pd.read_excel('D:\\Commodities\\Master List.xlsm', sheet_name = 'Active Trades')

newdf = pd.DataFrame()
for index, row in trades.iterrows():
    c = row['Commodity']
    n = row['Nearby']
    f = row['Future']
    z = str(n) + str(f)
    trade = row['Trade']
    dfx = df[(df.Commodity == c)]
    dfx = dfx[(dfx.ContractMonth == n) | (dfx.ContractMonth == f)]
    s = dfx['Filename'].unique()
    np.sort(s)

#Logic for finding x and the next greater element (to x) in an array 
    for i in range(0, len(s), 1):
        x = s[i]
        next = -1
        for j in range(i+1, len(s), 1):
            if s[i] < s[j]:
                next = s[j]
                break
        df1 = dfx[(dfx.Filename == str(s[i]))]
        df2 = dfx[(dfx.Filename == str(next))]
        tempdf = pd.merge(df1, df2, how = 'right', on = ['Date'])

        tempdf['Filter'] = tempdf['ContractMonth_x'].map(str) + tempdf['ContractMonth_y'].map(str)
        tempdf = tempdf[(tempdf.Filter == z)]
        tempdf['Trade'] = trade
        newdf = newdf.append(tempdf, sort = True)


newdf = newdf.rename(columns={'Open_x': 'Open_C1', 
                              'High_x': 'High_C1',
                              'Low_x': 'Low_C1',
                              'Close_x': 'Close_C1',
                              'Volume_x': 'Volume_C1',
                              'Open Interest_x': 'Open Interest_C1',
                              'Open_y': 'Open_C2', 
                              'High_y': 'High_C2',
                              'Low_y': 'Low_C2',
                              'Close_y': 'Close_C2',
                              'Volume_y': 'Volume_C2',
                              'Open Interest_y': 'Open Interest_C2',
                              'Commodity_x': 'Commodity',
                              'ContractYear_x': 'ContractYear_C1', 'ContractYear_y': 'ContractYear_C2',
                              'ContractMonth_x': 'ContractMonth_C1', 'ContractMonth_y': 'ContractMonth_C2',
                              'Filename_x': 'Filename_C1', 'Filename_y': 'Filename_C2',
                              'Month_Code_x': 'Month_Code_C1', 'Month_Code_y': 'Month_Code_C2'})

По сути, первый цикл for ищет определенное подмножество данных на основе «торгующего» кадра данных и объединяет их вместе. Он повторяет это несколько раз и создает новый набор данных. Набор данных "торговля" выглядит следующим образом:

Commodity   Trade                 Nearby Future Begin Month Begin Day   End Month   End Day Begin   End Begin Year  End Year    Begin Date  End Date    N1  F1
    CC  Cocoa 3vs5, May1 to Feb2    3   5   05  01  02  02  1-May   2-Feb   2018    2019    5/1/2018    2/2/2019    H   K
    CC  Cocoa 9vs12, Nov1 to Aug20  9   12  11  01  08  16  1-Nov   16-Aug  2017    2018    11/1/2017   8/16/2018   U   Z
    KC  Coffee 7vs9, Aug1 to Jun20  7   9   08  01  06  20  1-Aug   20-Jun  2018    2019    8/1/2018    6/20/2019   N   U
    KC  Coffee 7vs12, Aug1 to Jun20 7   12  08  01  06  21  1-Aug   21-Jun  2018    2019    8/1/2018    6/21/2019   N   Z
    KC  Coffee 7vs12, Sep1 to Jun20 7   12  09  01  06  21  1-Sep   21-Jun  2018    2019    9/1/2018    6/21/2019   N   Z

Набор данных "df" выглядит следующим образом:

index   Date    Open    High    Low Close   Volume  Open Interest   Filename    ContractYear    Commodity   Month_Code  ContractMonth   Filter
468763  1/5/1981    2039    2084    2039    2051    1108    6610    CC1981H 1981    CC  H   3   19813
468764  1/6/1981    2060    2070    2047    2056    1069    6495    CC1981H 1981    CC  H   3   19813
468765  1/7/1981    2038    2038    2005    2010    1609    6316    CC1981H 1981    CC  H   3   19813
468766  1/8/1981    1995    1997    1966    1979    2088    6062    CC1981H 1981    CC  H   3   19813
468767  1/9/1981    1989    1994    1973    1989    946     5976    CC1981H 1981    CC  H   3   19813
468768  1/12/1981   1989    2004    1980    1987    946     5840    CC1981H 1981    CC  H   3   19813
468769  1/13/1981   1946    1964    1928    1929    3039    5701    CC1981H 1981    CC  H   3   19813
468770  1/14/1981   1939    1980    1922    1975    3832    5668    CC1981H 1981    CC  H   3   19813
468771  1/15/1981   1975    2000    1962    1972    1811    5483    CC1981H 1981    CC  H   3   19813

Я только что скопировал и вставил образец, так как набор данных слишком велик. Эта программа занимает около 15 минут для запуска на полном наборе данных. Есть ли способ ускорить это? Варианты, которые я рассмотрел или исследовал: 1. Векторизация - я посмотрел на это, но не могу понять, как это сделать. Я должен использовать итерацию над фреймом данных, чтобы создать подмножество данных. Если только я не пропустил что-то здесь. 2. Параллельная обработка - есть ли способ распараллелить этот процесс? По сути, выполняйте каждую итерацию цикла for параллельно, а затем добавляйте все вместе.

Пожалуйста, обратите внимание - я новичок / начинающий (и самоучка) - любая помощь будет принята с благодарностью. Заранее спасибо за любую помощь.

Вывод будет следующим:

Date    Trade   Commodity   Filename_C1 Filename_C2 Open_C1 High_C1 Low_C1  Close_C1    Volume_C1   Open Interest_C1    Open_C2 High_C2 Low_C2  Close_C2    Volume_C2   Open Interest_C2    ContractYear_C1 ContractYear_C2 ContractMonth_C1    ContractMonth_C2    Month_Code_C1   Month_Code_C2   Filter
1/2/2018    Cocoa 3vs5, May1 to Feb2    CC  CC2019H CC2019K 1956    1996    1956    1996    43616   9728    2003    2015    2003    2015    43616   5659    2019    2019    3   5   H   K   35
1/3/2018    Cocoa 3vs5, May1 to Feb2    CC  CC2019H CC2019K 1979    1988    1959    1975    42938   9992    1995    2005    1974    1989    42938   6229    2019    2019    3   5   H   K   35
1/4/2018    Cocoa 3vs5, May1 to Feb2    CC  CC2019H CC2019K 1933    1975    1919    1975    22834   10500   1975    1990    1934    1990    22834   6327    2019    2019    3   5   H   K   35
1/5/2018    Cocoa 3vs5, May1 to Feb2    CC  CC2019H CC2019K 1969    1970    1957    1967    22898   10563   1971    1985    1968    1982    22898   6377    2019    2019    3   5   H   K   35
1/8/2018    Cocoa 3vs5, May1 to Feb2    CC  CC2019H CC2019K 1950    1988    1950    1988    40143   10778   1999    2003    1999    2003    40143   6376    2019    2019    3   5   H   K   35
1/9/2018    Cocoa 3vs5, May1 to Feb2    CC  CC2019H CC2019K 1986    2010    1973    1980    42618   10881   2004    2004    1988    1994    42618   6540    2019    2019    3   5   H   K   35
1/10/2018   Cocoa 3vs5, May1 to Feb2    CC  CC2019H CC2019K 1985    2029    1984    2020    39646   11079   1998    2034    1997    2033    39646   6550    2019    2019    3   5   H   K   35
1/11/2018   Cocoa 3vs5, May1 to Feb2    CC  CC2019H CC2019K 2005    2019    1997    2012    38791   11469   2012    2033    2012    2026    38791   6597    2019    2019    3   5   H   K   35
1/12/2018   Cocoa 3vs5, May1 to Feb2    CC  CC2019H CC2019K 2021    2022    1985    2005    36741   11594   2012    2018    2012    2018    36741   6626    2019    2019    3   5   H   K   35
...