Я написал некоторый код следующим образом
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