Как сохранить каждую итерацию цикла в один файл .csv с помощью pandas

#pandas #csv #request

Вопрос:

Я использую приведенный ниже код, чтобы получить последние ежедневные цены для ряда фондов:

 import requests
import pandas as pd

urls = ['https://markets.ft.com/data/funds/tearsheet/historical?s=LU0526609390:EUR', 'https://markets.ft.com/data/funds/tearsheet/historical?s=IE00BHBX0Z19:EUR', 
'https://markets.ft.com/data/funds/tearsheet/historical?s=LU1076093779:EUR']

def format_date(date):
    date = date.split(',')[-2][1:]   date.split(',')[-1]

    return pd.Series({'Date': date})

for url in urls:
    ISIN = url.split('=')[-1].replace(':', '_')
    ISIN = ISIN[:-4]
    ISIN = ISIN   ".OTHER"
    html = requests.get(url).content
    df_list = pd.read_html(html)
    df = df_list[-1]
    df['Date'] = df['Date'].apply(format_date)
    del df['Open']
    del df['High']
    del df['Low']
    del df['Volume']
    df = df.rename(columns={'Close': 'last_traded_price'})
    df = df.rename(columns={'Date': 'last_traded_on'})
    df.insert(2, "id", ISIN)
    df=df.head(1)
    print (df)
df.to_csv(r'/Users/.../Testdata.csv', index=False)
 

На данный момент файл Testdata.csv перезаписывается каждый раз, когда начинается новый цикл, и я хотел бы найти способ сохранить все данные в файл .csv в этом формате:

 Col 1            Col 2                Col 3
last_traded_on   last_traded_price    id
Oct 07 2021      78.83                LU0526609390.OTHER
Oct 07 2021      11.1                 IE00BHBX0Z19.OTHER
Oct 07 2021      155.56               LU1076093779.OTHER
 

Мне нужно найти способ каким-то образом сохранить данные в файл .csv вне цикла, но я действительно изо всех сил пытаюсь найти способ сделать это.

Спасибо

Ответ №1:

Используйте обработчик файлов:

 with open(r'/Users/.../Testdata.csv', 'w') as csvfile
    # Here, you need to write headers:
    # csvfile.write("header1,header2,header3n")
    for url in urls:
        ISIN = url.split('=')[-1].replace(':', '_')
        ...  # The rest of your code
        df.to_csv(csvfile, index=False, header=False)
 

Или лучше всего собрать каждый кадр данных в список, pd.concat объединить их все и сохранить в файл:

 dfs = [] 
for url in urls:
    ISIN = url.split('=')[-1].replace(':', '_')
    ...  # The rest of your code
    dfs.append(df)

pd.concat(dfs).to_csv(r'/Users/.../Testdata.csv', index=False)
 

Примечание: ваш вывод выглядит как вывод df.to_string() , а не df.to_csv