在数据框中迭代并保存每个股票历史数据,而无需在 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 中下载的主要内容,如果未能解决你的问题,请参考以下文章

我可以从数据源导入 INTO excel 而无需迭代吗?

如何迭代数据框中的行以检测不同的单词并将其保存在新列中?

用 Pandas 数据框中的行填充嵌套字典

将预定义的数字分配给数据框中的列行值

将数据从 .txt 保存并加载到正确的 texbox

迭代多个数据帧并执行数学函数保存输出