如何使用带有 Pandas 的 Glob 循环遍历 CSV 文件夹?
How to use Glob with Pandas to loop through a folder of CSVs?
我在一个文件夹中有一组 CSV,我正试图为我的 pandas 脚本循环。我正在使用 glob select 以 .csv 结尾的文件,但它每次都只是 returns 相同的 .csv 文件。
我正在努力完成以下任务:
- 使用 glob select 包含 .csvs 的文件夹和 运行 文件夹中每个单独 .csv 文件的脚本
- 将 .csv 文件名保存为一个变量,以后可以应用于 .png 文件名
基本上,将 .csv 文件输入脚本,将文件名保存为变量,运行 脚本的其余部分,重复直到完成。
我在 MacOS 上使用 Jupyter Notebook
这是我当前的代码:
import yfinance as yf
import matplotlib
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd
import mplfinance as mpf
import glob
path = r'/Users/chris/Desktop/Files'
files = glob.glob(path + "/*.csv")
for f in files:
dfb = pd.read_csv(f,usecols=['Time','Balance'],index_col=0, parse_dates=True)
photoname = files+'.png'
dfb["Balance"] = dfb["Balance"].str.split(expand=True).iloc[:,0]
dfb["Balance"] = dfb["Balance"].str.replace(',','').astype(float)
df = yf.Ticker("DOGE-USD").history(period='max')
df = df.loc["2021-01-01":]
newdfb = dfb['Balance'].resample('D').ohlc().dropna()
newdfb.drop(['open','high','low'],axis=1,inplace=True)
newdfb.columns = ['Balance']
dates = [d.date() for d in newdfb.index]
newdfb.index = pd.DatetimeIndex(dates)
newdfb.index.name = 'Time'
dfc = df.join(newdfb, how='outer').dropna()
dfc.index.name = 'Date'
ap = mpf.make_addplot(dfc['Balance'])
mpf.plot(dfc,type='candle',addplot=ap)
print(address)
mpf.plot(dfc,type='candle',addplot=ap, savefig=photoname) #This saves as a photo
这里的问题是 read_csv 后面的行没有缩进,因此不在 for f in file: loop
中。缩进 read_csv 下面的行后,代码按预期运行。
由于 df = yf.Ticker("DOGE-USD").history(period='max')
和 df = df.loc["2021-01-01":]
中的数据是静态的,将其移到 for 循环之上效率更高,因为这样它只被调用一次。
解决方法代码如下:
import yfinance as yf
import matplotlib
from matplotlib import pyplot as plt
import pandas as pd
import mplfinance as mpf
import glob
path = r'/Users/chris/Desktop/Files'
files = glob.glob(path + "/*.csv")
df = yf.Ticker("DOGE-USD").history(period='max')
df = df.loc["2021-01-01":]
for f in files:
dfb = pd.read_csv(f,usecols=['Time','Balance'],index_col=0,
parse_dates=True)
photoname = files+'.png'
dfb["Balance"] = dfb["Balance"].str.split(expand=True).iloc[:,0]
dfb["Balance"] = dfb["Balance"].str.replace(',','').astype(float)
newdfb = dfb['Balance'].resample('D').ohlc().dropna()
newdfb.drop(['open','high','low'],axis=1,inplace=True)
newdfb.columns = ['Balance']
dates = [d.date() for d in newdfb.index]
newdfb.index = pd.DatetimeIndex(dates)
newdfb.index.name = 'Time'
dfc = df.join(newdfb, how='outer').dropna()
dfc.index.name = 'Date'
ap = mpf.make_addplot(dfc['Balance'])
mpf.plot(dfc,type='candle',addplot=ap)
mpf.plot(dfc,type='candle',addplot=ap, savefig=photoname)
感谢@Nathan Mills 和@Daniel Goldfarb 在原始 post 评论中提供解决方案。
我在一个文件夹中有一组 CSV,我正试图为我的 pandas 脚本循环。我正在使用 glob select 以 .csv 结尾的文件,但它每次都只是 returns 相同的 .csv 文件。
我正在努力完成以下任务:
- 使用 glob select 包含 .csvs 的文件夹和 运行 文件夹中每个单独 .csv 文件的脚本
- 将 .csv 文件名保存为一个变量,以后可以应用于 .png 文件名
基本上,将 .csv 文件输入脚本,将文件名保存为变量,运行 脚本的其余部分,重复直到完成。
我在 MacOS 上使用 Jupyter Notebook
这是我当前的代码:
import yfinance as yf
import matplotlib
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd
import mplfinance as mpf
import glob
path = r'/Users/chris/Desktop/Files'
files = glob.glob(path + "/*.csv")
for f in files:
dfb = pd.read_csv(f,usecols=['Time','Balance'],index_col=0, parse_dates=True)
photoname = files+'.png'
dfb["Balance"] = dfb["Balance"].str.split(expand=True).iloc[:,0]
dfb["Balance"] = dfb["Balance"].str.replace(',','').astype(float)
df = yf.Ticker("DOGE-USD").history(period='max')
df = df.loc["2021-01-01":]
newdfb = dfb['Balance'].resample('D').ohlc().dropna()
newdfb.drop(['open','high','low'],axis=1,inplace=True)
newdfb.columns = ['Balance']
dates = [d.date() for d in newdfb.index]
newdfb.index = pd.DatetimeIndex(dates)
newdfb.index.name = 'Time'
dfc = df.join(newdfb, how='outer').dropna()
dfc.index.name = 'Date'
ap = mpf.make_addplot(dfc['Balance'])
mpf.plot(dfc,type='candle',addplot=ap)
print(address)
mpf.plot(dfc,type='candle',addplot=ap, savefig=photoname) #This saves as a photo
这里的问题是 read_csv 后面的行没有缩进,因此不在 for f in file: loop
中。缩进 read_csv 下面的行后,代码按预期运行。
由于 df = yf.Ticker("DOGE-USD").history(period='max')
和 df = df.loc["2021-01-01":]
中的数据是静态的,将其移到 for 循环之上效率更高,因为这样它只被调用一次。
解决方法代码如下:
import yfinance as yf
import matplotlib
from matplotlib import pyplot as plt
import pandas as pd
import mplfinance as mpf
import glob
path = r'/Users/chris/Desktop/Files'
files = glob.glob(path + "/*.csv")
df = yf.Ticker("DOGE-USD").history(period='max')
df = df.loc["2021-01-01":]
for f in files:
dfb = pd.read_csv(f,usecols=['Time','Balance'],index_col=0,
parse_dates=True)
photoname = files+'.png'
dfb["Balance"] = dfb["Balance"].str.split(expand=True).iloc[:,0]
dfb["Balance"] = dfb["Balance"].str.replace(',','').astype(float)
newdfb = dfb['Balance'].resample('D').ohlc().dropna()
newdfb.drop(['open','high','low'],axis=1,inplace=True)
newdfb.columns = ['Balance']
dates = [d.date() for d in newdfb.index]
newdfb.index = pd.DatetimeIndex(dates)
newdfb.index.name = 'Time'
dfc = df.join(newdfb, how='outer').dropna()
dfc.index.name = 'Date'
ap = mpf.make_addplot(dfc['Balance'])
mpf.plot(dfc,type='candle',addplot=ap)
mpf.plot(dfc,type='candle',addplot=ap, savefig=photoname)
感谢@Nathan Mills 和@Daniel Goldfarb 在原始 post 评论中提供解决方案。