【问题标题】:Writing data from an API to a CSV将数据从 API 写入 CSV
【发布时间】:2021-05-17 04:57:41
【问题描述】:

基本上,我有这段代码对我有用,它的目的是从 API 下载整个系列,关于在 wallstreetbets 子上提到股票代码的次数。

这是代码:

import requests

tickers = open("ticker_list.txt","r")
for ticker in tickers:
    ticker = ticker.strip()
    url = "https://XXX SENSIBLE INFO/historical/wallstreetbets/"+ticker
    headers = {'XXX (SENSIBLE INFO'}
    r = requests.get(url, headers=headers)
    print(r.content)

.txt 文件是一个包含大约 8000 个股票符号的简单列表。

我向您展示了输出的第一行是什么,仅作为示例:

b'[{"Date": "2018-08-10", "Ticker": "AA", "Mentions": 1}, {"Date": "2018-08-28", "Ticker": "AA", "Mentions": 1}, {"Date": "2018-09-07", "Ticker": "AA", "Mentions": 1}, etc...
b'[{"Date": "2020-12-07", "Ticker": "AACQ", "Mentions": 1}, {"Date": "2020-12-08", "Ticker": "AACQ", "Mentions": 1}, {"Date": "2020-12-22", "Ticker": "AACQ", "Mentions": 1},... etc...
b'[{"Date": "2018-08-08", "Ticker": "AAL", "Mentions": 1}, {"Date": "2018-08-20", "Ticker": "AAL", "Mentions": 1}, {"Date": "2018-09-11", "Ticker": "AAL", "Mentions": 1}, .... etc

我现在要做的是将所有数据存储在一个 csv 文件中,以便将生成的表解释如下:

AA AACQ AAL ......
1/1/2018 3 3 7 ...
2/1/2018 45 89 3 ....
3/1/2018 21 4 2 ......
....

(中间的数字代表每个股票每个日期的提及次数,在这种情况下,为了简化,我只是放了随机数,但它们需要与我在输出中作为“提及”得到的数字相同)

或者,如果更简单,我需要为每个股票创建一个单独的 csv 文件,第一列中包含日期,第二列中包含提及次数

【问题讨论】:

标签: python api csv python-requests dataset


【解决方案1】:

从站点返回的数据是 JSON 格式,因此可以使用 r.json() 将其转换为 Python 数据结构。接下来,有两件事将在这里为您提供帮助。首先,Counter 可用于跟踪 json 数据中的所有 Mentionsdefaultdict 可用于为每个代码构建每个日期条目。集合all_tickers 可用于跟踪数据中看到的所有代码,然后用于形成输出 CSV 文件的标题。

例如:

from collections import defaultdict, Counter
from datetime import datetime
import requests
import csv

dates = defaultdict(Counter)
all_tickers = set()
tickers = open("ticker_list.txt")

for ticker in tickers:
    ticker = ticker.strip()
    url = f"https://XXX SENSIBLE INFO/historical/wallstreetbets/{ticker}"
    headers = {'XXX (SENSIBLE INFO'}
    r = requests.get(url, headers=headers)
    
    for row in r.json():
        all_tickers.add(row['Ticker'])
        date = datetime.strptime(row['Date'], '%Y-%m-%d')   # convert to datetime format
        dates[date][row['Ticker']] += row['Mentions']

with open('output.csv', 'w', newline='') as f_output:
    csv_output = csv.DictWriter(f_output, fieldnames=['Date', *sorted(all_tickers)])
    csv_output.writeheader()
    
    for date, values in sorted(dates.items(), key=lambda x: x[0]):
        row = {'Date' : date.strftime('%d/%m/%Y')}      # Create an output date format of day/month/year
        row.update(values)
        csv_output.writerow(row)

这应该会产生您需要的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-17
    • 2017-12-03
    • 2014-10-04
    • 2023-03-17
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多