我如何使用循环对csv文件列表应用一个函数?

问题描述 投票:0回答:1

我试图循环浏览一个目录中的所有文件,并向它们添加 "指标 "数据。我的代码可以选择1个文件来做这件事,但现在我想让它在所有文件上工作。问题是当我进行循环时,它说

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

目标是让每个循环从列表中读取另一个文件,进行修改,并将文件和修改后的文件保存回文件夹。

这里是完整的代码wo导入。我从列表中复制了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个回答
0
投票

问题出在第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)

让我知道,如果它的帮助。

© www.soinside.com 2019 - 2024. All rights reserved.