我正在使用库存数据,我想在执行某些类型的分析时使我的数据集具有相同的数据长度。
问题
如果我为 Apple 加载数据,我将获得自1985年以来的每日数据,但如果天然气ETF 的加载数据可能只能追溯到2012年。我现在想要过滤 Apple 只显示历史可以追溯到2012年。此外,结束日期,例如我的一些数据集可能不是最新的 Apple 数据从1985年到1-20-17,天然气ETF 数据范围为2012年至12-23-16。我还想要另一个设置最大日期的过滤器。所以现在我的苹果数据集被过滤了2012年到12-23-16之间的日期。现在我的数据集是相同的。
方法
我有一个名为 Stocks 的词典,它存储了我的所有日期帧。所有数据框都有一个名为 D 的列,即 Date 列。
我编写了一个函数,用数据框填充字典,并且还获取每个df的最小和最大日期。我将所有这些最小最大日期存储在另外两个词典 DatesMax 和 DateMin 中,然后取这两个词典的最小值和最大值来获得最大值和最小值的日期。用于所有数据帧的过滤器值。
下面的函数有效,它获取多个数据帧的最小和最大日期,并将它们返回到名为 DatesMinMax 的字典中。
def MinMaxDates (FileName):
DatesMax = {}; DatesMin = {}
DatesMinMax = {}; stocks = {}
with open (FileName) as file_object:
Current_indicators = file_object.read()
tickers = Current_indicators.split('\n')
for i in tickers:
a = '/' in i
if a == True:
x = i.find("/")+1
df = pd.read_csv(str( i[x:]) + '_data.csv')
stocks[i] = df
maxDate = max(df.D)
minDate = min(df.D)
DatesMax[i] = maxDate
DatesMin[i] = minDate
else:
df = pd.read_csv(i + '_data.csv')
stocks[i] = df
maxDate = max(df.D)
minDate = min(df.D)
DatesMax[i] = maxDate
DatesMin[i] = minDate
x = min(DatesMax.values())
y = max(DatesMin.values())
DatesMinMax = {'MaxDate' : x, 'MinDate' : y}
return DatesMinMax
print DatesMinMax
# {'MinDate': '2012-02-08', 'MaxDate': '2017-01-20'}
问题
现在,我必须在dict名称 Stocks 中的所有数据帧上运行我的循环,以过滤日期列。重新循环某些东西似乎效率低下,但我无法想到应用过滤器的任何其他方式。
答案 0 :(得分:0)
实际上,您可能不需要捕获最小值和最大值(因为2016-12-30 < 2017-01-20
)以便以后进行过滤,但只需在“D”(日期)上的所有数据帧上运行完整的内部联接merge
)专栏。
考虑使用链合并确保所有数据帧的长度相等,然后通过自动收录器列对输出的主数据帧进行切片以构建 Stocks 字典。当然,您可以使用宽主数据帧进行分析:
with open (FileName) as file_object:
Current_indicators = file_object.read()
tickers = Current_indicators.split('\n')
# DATA FRAME LIST BUILD
dfs = []
for i in tickers:
if '/' in i:
x = i.find("/")+1
df = pd.read_csv(str( i[x:]) + '_data.csv')
# PREFIX ALL NON-DATE COLS WITH TICKER PREFIX
df.columns = [i+'_'+str(col) for col in df.columns if col!='D']
dfs.append(df)
else:
df = pd.read_csv(i + '_data.csv')
# PREFIX ALL NON-DATE COLS WITH TICKER PREFIX
df.columns = [i+'_'+str(col) for col in df.columns if col!='D']
dfs.append(df)
# CHAIN MERGE (INNER JOIN) ACROSS ALL DFS
masterdf = reduce(lambda left,right: pd.merge(left, right, on=['D']), dfs)
# DATA FRAME DICT BUILD
stocks = {}
for i in tickers:
# SLICE CURRENT TICKER COLUMNS
df = masterdf[['D']+[col for col in df.columns if i in col]]
# REMOVE TICKER PREFIXES
df.columns = [col.replace(i+'_', '') for col in df.columns]
stocks[i] = df