Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何高效地过滤字典中存储的多个数据帧的列?_Python_Pandas_Dataframe - Fatal编程技术网

Python 如何高效地过滤字典中存储的多个数据帧的列?

Python 如何高效地过滤字典中存储的多个数据帧的列?,python,pandas,dataframe,Python,Pandas,Dataframe,我正在处理股票数据,我希望在执行某些类型的分析时,我的数据集具有相同长度的数据 问题 如果我给苹果公司一个负荷数据,我将得到1985年以来的每日数据,但如果给天然气ETF一个负荷数据,可能要追溯到2012年。我现在想过滤苹果,只显示2012年的历史。此外,结束日期,例如,我的一些数据集可能不是最新的,因为苹果的数据范围为1985年至2017年1月20日,而天然气ETF的数据范围为2012年至2016年12月23日。我还需要另一个过滤器,设置最大日期。因此,现在我的苹果数据集被过滤为2012年至2

我正在处理股票数据,我希望在执行某些类型的分析时,我的数据集具有相同长度的数据

问题

如果我给苹果公司一个负荷数据,我将得到1985年以来的每日数据,但如果给天然气ETF一个负荷数据,可能要追溯到2012年。我现在想过滤苹果,只显示2012年的历史。此外,结束日期,例如,我的一些数据集可能不是最新的,因为苹果的数据范围为1985年至2017年1月20日,而天然气ETF的数据范围为2012年至2016年12月23日。我还需要另一个过滤器,设置最大日期。因此,现在我的苹果数据集被过滤为2012年至2016年12月23日之间的日期。现在我的数据集是相等的

方法

我有一本叫做Stocks的字典,它存储了我所有的日期框。所有数据帧都有一个名为D的列,它是日期列

我编写了一个函数,用数据帧填充字典,并为每个df获取最小和最大日期。我将所有这些最小-最大日期存储在另外两个字典DatesMax和DateMin中,然后获取这两个字典的最小和最大日期,以获取将用于所有数据帧上的筛选值的最大和最小日期

下面的函数起作用,它获取多个数据帧的最小和最大日期,并在名为DatesMinMax的字典中返回它们

问题


现在,我必须在dict name Stocks中的所有数据帧上运行我的循环,以过滤这些日期列。重新循环某些内容似乎效率低下,但我想不出任何其他方法来应用筛选器。

事实上,您可能不需要捕获最小值和最大值(因为
2016-12-30<2017-01-20
)以进行后续筛选,只需在“D”(日期)列的所有数据帧上运行完整的内部联接即可

考虑使用链式合并,确保所有数据帧的长度相等,然后按ticker列对输出的主数据帧进行切片,以构建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
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