在for循环中将来自csv的数据存储在字典中时出现问题

2024-10-02 06:29:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个系统来跟踪股票在一段时间内的表现。我打算让它做的是从电子表格中提取股票代码,在雅虎财经上搜索这些股票代码,提取这些股票的历史数据,然后将这些数据作为字典或列表存储在股票代码中。虽然我已经让webscrape很好地工作,并将数据附加到股票代码中,但我正在努力将数据保存在for循环中,以便以后可以访问它

以下是电子表格的内容:

Ticker    Name
WMT       Walmart
AMZN      Amazon
AAPL      Apple
CVS       CVS Health

将工作表的内容放入变量后,我创建了以下系列:

p_ticker = p_data['Ticker']

然后,我设置了一个循环,该循环在工作表中运行,并从正确的位置应用股票代码

for ticker in p_ticker:
    scrape_string = f"https://query1.finance.yahoo.com/v7/finance/download/{ticker}?period1=1480636740&period2=1606867140&interval=1d&events=history&includeAdjustedClose=true"
    ticker_data = {ticker:scrape_string}
    print(ticker_data)

然而,对于循环,字典和列表并不是专门的领域,我希望能得到任何建议

我尝试了以下几点:

for ticker in p_ticker:
    scrape_string = f"https://query1.finance.yahoo.com/v7/finance/download/{ticker}?period1=1480636740&period2=1606867140&interval=1d&events=history&includeAdjustedClose=true"
    ticker_data = []
    ticker_data.append = pd.read_csv(ticker)

这会导致一个错误:“FileNotFoundError:[Errno 2]文件WMT不存在:'WMT'”

如果我尝试这样做:

for ticker in p_ticker:
    scrape_string = f"https://query1.finance.yahoo.com/v7/finance/download/{ticker}?period1=1480636740&period2=1606867140&interval=1d&events=history&includeAdjustedClose=true"
    ticker_data = []
    ticker_data.append = pd.read_csv(scrape_string)

我得到AttributeError: ‘list’ object attribute ‘append’ is read-only

不幸的是,我有点困惑于如何推进这一点;如果有人有任何想法,这将是非常有帮助的,我将非常感激


Tags: 数据inhttpscomfordatastringyahoo
2条回答

下面是一个非常简单的解决方案,它使用一个函数,从提供的日期范围内的所有标记器返回一个组合数据帧:

from datetime import datetime
import pandas as pd

def get_quotes(tickers: list[str],
               start_date: datetime,
               end_date: datetime = datetime.now(),
               interval: str = '1d') -> pd.DataFrame:
    dfs: list[pd.DataFrame] = []    # initialize an empty list to store dataframes
    for ticker in tickers:          # loop over each ticker
        url = f'https://query1.finance.yahoo.com/v7/finance/download/{ticker}?period1={int(start_date.timestamp())}&period2={int(end_date.timestamp())}&interval={interval}&events=history&includeAdjustedClose=true'
        df = pd.read_csv(url)       # read the csv from the url into a pandas DataFrame
        df['ticker'] = ticker       # set the ticker value of each row to the current ticker
        dfs.append(df)              # append the DataFrame to the list of DataFrames
    return pd.concat(dfs).reset_index(drop=True) # combine the dataframes and reset the index for convenience

data = get_quotes(tickers=['aapl', 'msft'],
                  start_date=datetime.fromisoformat('2021-05-17'),
                  end_date=datetime.fromisoformat('2021-05-21T23:59')) # the end_date is optional, will default to current date

print(data)

输出:

         Date        Open        High         Low       Close   Adj Close    Volume ticker
0  2021-05-17  126.820000  126.930000  125.169998  126.269997  126.269997  74244600   aapl
1  2021-05-18  126.559998  126.989998  124.779999  124.849998  124.849998  63342900   aapl
2  2021-05-19  123.160004  124.919998  122.860001  124.690002  124.690002  92612000   aapl
3  2021-05-20  125.230003  127.720001  125.099998  127.309998  127.309998  76857100   aapl
4  2021-05-21  127.820000  128.000000  125.209999  125.430000  125.430000  79209300   aapl
5  2021-05-17  246.550003  246.589996  243.520004  245.179993  244.615158  24970200   msft
6  2021-05-18  246.270004  246.410004  242.899994  243.080002  242.520004  20168000   msft
7  2021-05-19  239.309998  243.229996  238.600006  243.119995  243.119995  25739800   msft
8  2021-05-20  243.960007  247.949997  243.860001  246.479996  246.479996  21800700   msft
9  2021-05-21  247.570007  248.330002  244.740005  245.169998  245.169998  21855500   msft

通过使用生成器而不是for循环pd.concat()可以改进这一点。此外,由于Yahoo API的工作方式,结束日期应设置为所需结束日期的结束或下一个结束日期的开始

您需要将字典移出循环,如下所示:

ticker_data={}
for ticker in p_ticker:
    scrape_string =f"https://query1.finance.yahoo.com/v7/finance/download/{ticker}?period1=1480636740&period2=1606867140&interval=1d&events=history&includeAdjustedClose=true"
    ticker_data[ticker]=scrape_string

相关问题 更多 >

    热门问题