【问题标题】:How can I use a loop to apply a function to a list of csv files?如何使用循环将函数应用于 csv 文件列表?
【发布时间】:2020-10-01 03:42:49
【问题描述】:

我正在尝试遍历目录中的所有文件并向它们添加“指标”数据。我的代码可以在其中选择 1 个文件并执行此操作,但现在正试图使其适用于所有文件。问题是当我制作循环时它说

ValueError: Invalid file path or buffer object type: <class 'list'>

目标是每个循环从列表中读取另一个文件,进行更改,然后将文件保存到更改后的文件夹中。

这是不带导入的完整代码。我从列表中复制了 1 个“file_path”并在底部添加评论。


### open dialog to select file
#file_path = filedialog.askopenfilename()

###create list from dir
listdrs = os.listdir('c:/Users/17409/AppData/Local/Programs/Python/Python38/Indicators/Sentdex Tutorial/stock_dfs/')

###append full path to list
string = 'c:/Users/17409/AppData/Local/Programs/Python/Python38/Indicators/Sentdex Tutorial/stock_dfs/'
listdrs_path = [ string + x for x in listdrs]
print (listdrs_path)

###start loop, for each "file" in listdrs run the 2 functions below and overwrite saved csv.
for file in listdrs_path:
    file_path = listdrs_path

    data = pd.read_csv(file_path, index_col=0)


    ########################################
    ####function 1
    def get_price_hist(ticker):


        # Put stock price data in dataframe
        data = pd.read_csv(file_path)
        #listdr = os.listdir('Users\17409\AppData\Local\Programs\Python\Python38\Indicators\Sentdex Tutorial\stock_dfs')
        print(listdr)
        # Convert date to timestamp and make index
        data.index = data["Date"].apply(lambda x: pd.Timestamp(x))
        data.drop("Date", axis=1, inplace=True)

        return data


    df = data
    ##print(data)

    ######Indicator data#####################

    def get_indicators(data):
        # Get MACD
        data["macd"], data["macd_signal"], data["macd_hist"] = talib.MACD(data['Close'])

        # Get MA10 and MA30
        data["ma10"] = talib.MA(data["Close"], timeperiod=10)
        data["ma30"] = talib.MA(data["Close"], timeperiod=30)

        # Get RSI
        data["rsi"] = talib.RSI(data["Close"])
        return data
    #####end functions#######





data2 = get_indicators(data)
print(data2)
data2.to_csv(file_path)

###################################################

#here is an example of what path from list looks like
#'c:/Users/17409/AppData/Local/Programs/Python/Python38/Indicators/Sentdex Tutorial/stock_dfs/A.csv'

【问题讨论】:

    标签: pandas function csv for-loop data-manipulation


    【解决方案1】:

    问题出在第 13 行和第 14 行。您的文件名在变量 file 中,但您使用的是已分配文件列表的 file_path。因此,您将获得ValueError。试试这个:

    ### open dialog to select file
    #file_path = filedialog.askopenfilename()
    
    ###create list from dir
    listdrs = os.listdir('c:/Users/17409/AppData/Local/Programs/Python/Python38/Indicators/Sentdex Tutorial/stock_dfs/')
    
    ###append full path to list
    string = 'c:/Users/17409/AppData/Local/Programs/Python/Python38/Indicators/Sentdex Tutorial/stock_dfs/'
    listdrs_path = [ string + x for x in listdrs]
    print (listdrs_path)
    
    ###start loop, for each "file" in listdrs run the 2 functions below and overwrite saved csv.
    for file_path in listdrs_path:
    
        data = pd.read_csv(file_path, index_col=0)
    
    
        ########################################
        ####function 1
        def get_price_hist(ticker):
    
    
            # Put stock price data in dataframe
            data = pd.read_csv(file_path)
            #listdr = os.listdir('Users\17409\AppData\Local\Programs\Python\Python38\Indicators\Sentdex Tutorial\stock_dfs')
            print(listdr)
            # Convert date to timestamp and make index
            data.index = data["Date"].apply(lambda x: pd.Timestamp(x))
            data.drop("Date", axis=1, inplace=True)
    
            return data
    
    
        df = data
        ##print(data)
    
        ######Indicator data#####################
    
        def get_indicators(data):
            # Get MACD
            data["macd"], data["macd_signal"], data["macd_hist"] = talib.MACD(data['Close'])
    
            # Get MA10 and MA30
            data["ma10"] = talib.MA(data["Close"], timeperiod=10)
            data["ma30"] = talib.MA(data["Close"], timeperiod=30)
    
            # Get RSI
            data["rsi"] = talib.RSI(data["Close"])
            return data
        #####end functions#######
    
    
    
    
    
    data2 = get_indicators(data)
    print(data2)
    data2.to_csv(file_path)
    

    如果有帮助,请告诉我。

    【讨论】:

      猜你喜欢
      • 2020-02-13
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 2016-08-24
      • 2018-06-29
      相关资源
      最近更新 更多