将网络抓取的数据附加到同一个 Excel 工作表
Append web-scraped data to same excelsheet
我想使用 for 循环 (date_range) 从 Web 中获取一列,并将该列附加到同一个 sheet,每次迭代时,彼此相邻。
import pandas as pd
import datetime as dt
import openpyxl
range = pd.date_range(start='5/12/2020', end='5/21/2020')
for date in range:
df = pd.read_csv("ürl")
writer = pd.ExcelWriter('Sample.xlsx', engine='openpyxl')
writer.book = openpyxl.load_workbook('Sample.xlsx')
writer.sheets = dict((ws.title, ws) for ws in writer.book.worksheets)
read = pd.read_excel(r'Sample.xlsx')
writer.sheets.write(1, max_column+1, df)
writer.save()
date += delta
解决方案 1
我不完全确定你还有什么,但我试着想出这个作为起点。它使用 Yahoo Finance API 来模拟您的股票价格。这定义了两个函数,一个接受一个公司符号并获取该公司的当前市场价格,另一个通过将其应用于一列符号的所有值将其推广到数据框。
from datetime import datetime
def get_market_price(symb):
try:
comp_info = yf.Ticker(symb)
return comp_info.info['regularMarketPrice']
except Exception:
return np.nan
def fetch_today(df):
today = datetime.today().date().strftime('%Y-%m-%d')
df[today] = df['Companies'].apply(get_market_price)
return df
这里是一些示例数据,以及上述函数的应用。
df = pd.DataFrame({
'Companies': ['XOM', 'GE', 'MSFT', 'BP', 'C', 'PG']
})
df = fetch_today(df)
print(df)
输出
Companies 2020-05-25
0 XOM NaN
1 GE 6.48
2 MSFT 183.19
3 BP 22.98
4 C NaN
5 PG 112.29
在此示例中,您应该每天使用 pd.read_csv
读取数据,应用 fetch_today
,然后使用 pd.to_csv
保存新数据帧。每次你 运行 它在新的一天,它都会附加一个带有当前日期标题和新数据的列。
解决方案 2
如果您的数据只是公司列表,并且您只想 运行 此脚本一次并获取特定范围内的数据,那么这样的方法可能会起作用。
def get_closing_values(symb):
comp_info = yf.download(symb, start='2020-5-12', end='2020-5-21')
s = comp_info['Close']
s.name = symb
return s.to_frame().T
companies = ['XOM', 'GE', 'MSFT', 'BP', 'C', 'PG']
df = pd.concat([get_closing_values(comp) for comp in companies])
print(df)
Date 2020-05-11 2020-05-12 2020-05-13 2020-05-14 2020-05-15 2020-05-18
XOM 45.740002 44.119999 41.930000 42.299999 42.000000 45.340000
GE 6.190000 6.000000 5.790000 5.700000 5.490000 6.270000
MSFT 186.740005 182.509995 179.750000 180.529999 183.160004 184.910004
BP 23.500000 23.059999 22.230000 22.139999 21.820000 23.510000
C 44.070000 42.349998 40.599998 42.060001 41.919998 45.669998
PG 115.309998 114.550003 113.919998 113.809998 114.610001 116.209999
我想使用 for 循环 (date_range) 从 Web 中获取一列,并将该列附加到同一个 sheet,每次迭代时,彼此相邻。
import pandas as pd
import datetime as dt
import openpyxl
range = pd.date_range(start='5/12/2020', end='5/21/2020')
for date in range:
df = pd.read_csv("ürl")
writer = pd.ExcelWriter('Sample.xlsx', engine='openpyxl')
writer.book = openpyxl.load_workbook('Sample.xlsx')
writer.sheets = dict((ws.title, ws) for ws in writer.book.worksheets)
read = pd.read_excel(r'Sample.xlsx')
writer.sheets.write(1, max_column+1, df)
writer.save()
date += delta
解决方案 1
我不完全确定你还有什么,但我试着想出这个作为起点。它使用 Yahoo Finance API 来模拟您的股票价格。这定义了两个函数,一个接受一个公司符号并获取该公司的当前市场价格,另一个通过将其应用于一列符号的所有值将其推广到数据框。
from datetime import datetime
def get_market_price(symb):
try:
comp_info = yf.Ticker(symb)
return comp_info.info['regularMarketPrice']
except Exception:
return np.nan
def fetch_today(df):
today = datetime.today().date().strftime('%Y-%m-%d')
df[today] = df['Companies'].apply(get_market_price)
return df
这里是一些示例数据,以及上述函数的应用。
df = pd.DataFrame({
'Companies': ['XOM', 'GE', 'MSFT', 'BP', 'C', 'PG']
})
df = fetch_today(df)
print(df)
输出
Companies 2020-05-25
0 XOM NaN
1 GE 6.48
2 MSFT 183.19
3 BP 22.98
4 C NaN
5 PG 112.29
在此示例中,您应该每天使用 pd.read_csv
读取数据,应用 fetch_today
,然后使用 pd.to_csv
保存新数据帧。每次你 运行 它在新的一天,它都会附加一个带有当前日期标题和新数据的列。
解决方案 2
如果您的数据只是公司列表,并且您只想 运行 此脚本一次并获取特定范围内的数据,那么这样的方法可能会起作用。
def get_closing_values(symb):
comp_info = yf.download(symb, start='2020-5-12', end='2020-5-21')
s = comp_info['Close']
s.name = symb
return s.to_frame().T
companies = ['XOM', 'GE', 'MSFT', 'BP', 'C', 'PG']
df = pd.concat([get_closing_values(comp) for comp in companies])
print(df)
Date 2020-05-11 2020-05-12 2020-05-13 2020-05-14 2020-05-15 2020-05-18
XOM 45.740002 44.119999 41.930000 42.299999 42.000000 45.340000
GE 6.190000 6.000000 5.790000 5.700000 5.490000 6.270000
MSFT 186.740005 182.509995 179.750000 180.529999 183.160004 184.910004
BP 23.500000 23.059999 22.230000 22.139999 21.820000 23.510000
C 44.070000 42.349998 40.599998 42.060001 41.919998 45.669998
PG 115.309998 114.550003 113.919998 113.809998 114.610001 116.209999