在数据框中迭代并保存每个股票历史数据,而无需在 CSV 中下载
Posted
技术标签:
【中文标题】在数据框中迭代并保存每个股票历史数据,而无需在 CSV 中下载【英文标题】:iterrate and save each stock historical data in dataframe without downloading in CSV 【发布时间】:2021-11-08 01:44:50 【问题描述】:我想从 yfinance 中提取特定股票列表的历史数据。我想将每个股票存储在一个单独的数据框中(每个股票都有自己的 df)。
我可以通过下面的代码将它下载到多个 csv,但我找不到将它们存储在不同数据帧中的方法(不必将它们下载到 csv)
import yfinance
stocks = ['TSLA','MSFT','NIO','AAPL','AMD','ADBE','ALGN','AMZN','AMGN','AEP','ADI','ANSS','AMAT','ASML','TEAM','ADSK']
for i in stocks:
df = yfinance.download(i, start='2015-01-01', end='2021-09-12')
df.to_csv( i + '.csv')
我希望我的最终结果是一个名为“TSLA”的数据帧,用于 tsla 历史数据,另一个名为“MSFT”的数据帧用于 msft 数据......等等
我试过了:
stock = ['TSLA','MSFT','NIO','AAPL','AMD']
df_ =
for i in stock:
df = yfinance.download(i, start='2015-01-01', end='2021-09-12')
df_["".format(i)] = df
我必须按键调用每个数据帧才能像df_["TSLA"]
一样得到它,但这不是我想要的。我需要一个只有 TSLA 的数据帧,它有 tsla 数据等等。有什么办法吗?
【问题讨论】:
我不知道你说的不下载是什么意思。如果要保存在本地,不需要下载吗?请尝试此代码。您可以从股票列表中为每个创建一个数据框。for i in stock:vars()[f'df_i'] = yfinance.download(i, start='2015-01-01', end='2021-09-12')
如果您想将每个数据保存在像TSLA
这样的单独变量中,那么您只会浪费时间 - 您可以使用vars()
、globals()
来实现,但最好将其保存为字典,因为稍后您可以使用带有for
-loop 的字典在所有数据帧上运行相同的代码。
【参考方案1】:
您无需多次下载数据。您只需要使用groupby
拆分整个数据并使用locals()
动态创建变量:
stocks = ['TSLA', 'MSFT', 'NIO', 'AAPL', 'AMD', 'ADBE', 'ALGN', 'AMZN',
'AMGN', 'AEP', 'ADI', 'ANSS', 'AMAT', 'ASML', 'TEAM', 'ADSK']
data = yfinance.download(stocks, start='2015-01-01', end='2021-09-12')
for stock, df in data.groupby(level=1, axis=1):
locals()[stock] = df.droplevel(level=1, axis=1)
df.to_csv(f'stock.csv')
输出:
>>> TSLA
Adj Close Close High Low Open Volume
Date
2014-12-31 44.481998 44.481998 45.136002 44.450001 44.618000 11487500
2015-01-02 43.862000 43.862000 44.650002 42.652000 44.574001 23822000
2015-01-05 42.018002 42.018002 43.299999 41.431999 42.910000 26842500
2015-01-06 42.256001 42.256001 42.840000 40.841999 42.012001 31309500
2015-01-07 42.189999 42.189999 42.956001 41.956001 42.669998 14842000
... ... ... ... ... ... ...
2021-09-03 733.570007 733.570007 734.000000 724.200012 732.250000 15246100
2021-09-07 752.919983 752.919983 760.200012 739.260010 740.000000 20039800
2021-09-08 753.869995 753.869995 764.450012 740.770020 761.580017 18793000
2021-09-09 754.859985 754.859985 762.099976 751.630005 753.409973 14077700
2021-09-10 736.270020 736.270020 762.609985 734.520020 759.599976 15114300
[1686 rows x 6 columns]
>>> ANSS
Adj Close Close High Low Open Volume
Date
2014-12-31 82.000000 82.000000 83.480003 81.910004 83.080002 304600
2015-01-02 81.639999 81.639999 82.629997 81.019997 82.089996 282600
2015-01-05 80.860001 80.860001 82.070000 80.779999 81.290001 321500
2015-01-06 79.260002 79.260002 81.139999 78.760002 81.000000 344300
2015-01-07 79.709999 79.709999 80.900002 78.959999 79.919998 233300
... ... ... ... ... ... ...
2021-09-03 368.380005 368.380005 371.570007 366.079987 366.079987 293000
2021-09-07 372.070007 372.070007 372.410004 364.950012 369.609985 249500
2021-09-08 372.529999 372.529999 375.820007 369.880005 371.079987 325800
2021-09-09 371.970001 371.970001 375.799988 371.320007 372.519989 194900
2021-09-10 373.609985 373.609985 377.260010 372.470001 374.540009 278800
[1686 rows x 6 columns]
【讨论】:
【参考方案2】:您可以创建全局或局部变量,如
globals()["TSLA"] = "some value"
print(TSLA)
locals()["TSLA"] = "some value"
print(TSLA)
但坦率地说,这是浪费时间。将其保存为字典会更有用。
使用字典,您可以使用for
-loop 在所有数据帧上运行一些代码。
您还可以按名称选择数据框。等等
例子:
df_max =
for name, df in df_.items():
df_max[name] = df.max()
name = input("What to display: ")
df_[name].plot()
【讨论】:
以上是关于在数据框中迭代并保存每个股票历史数据,而无需在 CSV 中下载的主要内容,如果未能解决你的问题,请参考以下文章