嗨,我正在构建一个从 Yfinance 下载股票数据的工具,我想下载一次历史数据,将其保存到目录中的 vs 文件中,然后每天只需添加最后一个交易日(一行)并重新保存。问题是 cvs 文件是从头开始覆盖的,所以如果我只提供要下载的最后一个交易日,那将是我最终为每个交易品种获得的所有行。 我使用的代码分为两部分..首先在 pandas 中创建数据帧,然后将其与包含的所有新功能一起保存,然后从保存的目录中获取我想要的任何其他项目中的数据帧。 我还有第二个问题,关于这是否是使用 cvs 文件和 pandas 数据框而不是 sqlite 数据库的良好实践,以及不同方法之间的优缺点是什么。
第 1 部分 创建目录和cvs文件
import yfinance as yf
import os
import pandas as pd
with open(r'C:\zPythonFilesDir\yfinance\symbolstest.csv') as f:
lines = f.read().splitlines()
#print(lines)
for symbol in lines:
print(symbol)
data = yf.download(symbol, start="2023-07-01", end="2023-07-30")
#print(data)
data.to_csv(r'C:\zPythonFilesDir\yfinance\datasetstest\{}.csv'.format(symbol))
for filename in os.listdir(r'C:\zPythonFilesDir\yfinance\datasetstest'):
#print(filename)
symbol = filename.split(".")[0]
print(symbol)
df = pd.read_csv(r'C:\zPythonFilesDir\yfinance\datasetstest/{}'.format(filename))
# new columns and functions here
x = 2 * round(df['High'],2)
df['new_val'] = x
# write new datasets with functions columns in different directory
df.to_csv(r'C:\zPythonFilesDir\yfinance\newdatasetstest\{}.csv'.format(symbol))
print(df)
第 2 部分 从 Cvs 文件获取数据
import os
import pandas as pd
for filename in os.listdir(r'C:\zPythonFilesDir\yfinance\newdatasetstest'):
#print(filename)
symbol = filename.split(".")[0]
print(symbol)
df1= pd.read_csv(r'C:\zPythonFilesDir\yfinance\newdatasetstest/{}'.format(filename))
print(df1)
df2 = pd.read_csv(r'C:\zPythonFilesDir\yfinance\newdatasetstest/AAPL.csv')
print(df2)
symbolstest.cvs 具有感兴趣的符号
数据框默认的to_csv方法在打开文件时使用写入模式,你需要做的就是将其更改为附加,这可以完成。
SAVE_TO_PATH = r'C:\zPythonFilesDir\yfinance\newdatasetstest\{}.csv'.format(symbol)
df.to_csv(SAVE_TO_PATH, mode='a', header=False)
我还将路径移到函数参数之外以提高可读性,并将标头设置为 false,因为我们不想每天附加它们
顺便说一句,它是 CSV(逗号分隔值)而不是 cVS。
底线是当您想向现有文件添加行时使用 mode='a' 或当您第一次添加/想要覆盖文件时使用 mode='w' 。(mode='w' 是默认值,所以你不必指定它)