如何更改数据帧以在Python中绘制数据

如何更改数据帧以在Python中绘制数据,python,pandas,web-scraping,stock,price,Python,Pandas,Web Scraping,Stock,Price,我想从Yahoo finance刮取多只股票,并将股票转换为欧元,如果股票是美元或英镑。我有一个将历史股票转换为欧元的代码,带有日期,但现在我必须使df能够正确绘制数据。 这是我现在拥有的代码 import yfinance as yf import pandas as pd import numpy as np start = '2013-01-01' end = '2021-01-01' rates = ['USDEUR=X', 'GBPEUR=X'] ti

我想从Yahoo finance刮取多只股票,并将股票转换为欧元,如果股票是美元或英镑。我有一个将历史股票转换为欧元的代码,带有日期,但现在我必须使df能够正确绘制数据。 这是我现在拥有的代码

 import yfinance as yf
 import pandas as pd
 import numpy as np
    
 start = '2013-01-01'
 end = '2021-01-01'
    
 rates = ['USDEUR=X', 'GBPEUR=X']
 tickers = yf.Tickers(' '.join(rates))
    
 exchange_rates = []
for i in range(len(tickers.tickers)):
    exchange_rates.append(tickers.tickers[i].history(start=start, end=end).Close)

ex_df = pd.DataFrame(exchange_rates).T
ex_df.columns = rates
ex_df['EUREUR=X'] = 1.0

assets = {'^AEX':'EUR', 'AAPL':'USD', 'AZN.L':'GBP', 'AD.AS':'EUR', 'ASML.AS':'EUR'}

  stock_df = pd.DataFrame()

for k,v in assets.items():
    data = yf.download(k, start=start, end=end, progress=False).Close.to_frame()
    data['ticker'] = k
    if v[:3] == 'EUR':
        data['rating'] = ex_df['EUREUR=X']
        data['price'] = data['Close'] / data['rating'] 
    elif v[:3] == 'USD':
        data['rating'] = ex_df['USDEUR=X']
        data['price'] = data['Close'] / data['rating'] 
    elif v[:3] == 'GBP':
        data['rating'] = ex_df['GBPEUR=X']
        data['price'] = data['Close'] / data['rating'] 
    else:
        data['rating'] = np.NaN
        data['price'] = np.NaN
stocks_df = pd.concat([stock_df, data], axis=0)

我将重新发布代码的完整版本。 这两个
df.fillna()
都是相同的。我还替换了图形图像。 祝你好运

import yfinance as yf
import pandas as pd
import numpy as np

start = '2020-07-01'
end = '2021-01-01'

rates = ['USDEUR=X', 'GBPEUR=X']
tickers = yf.Tickers(' '.join(rates))

exchange_rates = []
for i in range(len(tickers.tickers)):
    exchange_rates.append(tickers.tickers[i].history(start=start, end=end).Close)

ex_df = pd.DataFrame(exchange_rates).T
ex_df.columns = rates
ex_df['EUREUR=X'] = 1.0

assets = {'^AEX':'EUR', 'AAPL':'USD', 'AZN.L':'GBP', 'AD.AS':'EUR', 'ASML.AS':'EUR'}

stock_df = pd.DataFrame()
for k,v in assets.items():
    data = yf.download(k, start=start, end=end, progress=False).Close.to_frame()
    data['ticker'] = k
    if v[:3] == 'EUR':
        data['rating'] = ex_df['EUREUR=X']
        data['price'] = data['Close'] / data['rating'] 
    elif v[:3] == 'USD':
        data['rating'] = ex_df['USDEUR=X']
        data['price'] = data['Close'] / data['rating'] 
    elif v[:3] == 'GBP':
        data['rating'] = ex_df['GBPEUR=X']
        data['price'] = data['Close'] / data['rating'] 
    else:
        data['rating'] = np.NaN
        data['price'] = np.NaN

    stock_df = pd.concat([stock_df, data], axis=0)

my_stocks = stock_df.pivot(columns='ticker', values='price')
my_stocks.head()

ticker  AAPL    AD.AS   ASML.AS     AZN.L   ^AEX
Date                    
2020-06-30  102.574478  24.260000   326.899994  7694.486885     559.729980
2020-07-01  102.278087  23.879999   327.149994  7665.306388     562.669983
2020-07-02  102.418480  24.129999   332.750000  7758.488549     570.750000
2020-07-03  102.418480  23.870001   333.950012  7626.217088     568.630005
2020-07-06  105.119162  23.900000   343.549988  7810.244933     578.520020

import matplotlib.pyplot as plt

for c in my_stocks.columns.values[1:]:
    plt.plot(my_stocks.index, my_stocks[c], label=c)

plt.title('title')
plt.xlabel('Date',fontsize=18)
plt.ylabel('Adj. Price € (EUR)',fontsize=18)

plt.legend(my_stocks.columns.values[1:], loc='center right')
plt.show()

再次感谢!在我的\u stocks=pd.read\u csv(io.StringIO(data),delim\u whitespace=True)之后,我收到这个错误“初始值必须是str或None,而不是DataFrame”。对不起,我不知道我做错了什么。错误的原因是因为缺少一个库。这是以问题中给出的文本格式读取数据的代码。因为您已经有了数据,所以可以从行
import matplotlib.pyplot as plt
中复制数据,然后绘制图形。我已经导入了该库。你能在这里分享整个日期吗?我想我做错了别的事情。如果我们在这里共享整个代码,其他用户也将拥有整个代码。您检查数据了吗?我已经创建了数据并更改了图表。但是,收购期已经更改。我已经更新了上面的代码,如果我运行我的_stocks.head(),我将只看到一只股票。我用过你的图形代码。我在图表上什么也看不到。我认为问题在于我对数据帧(stock_df)做了一些错误的处理。是否可以清除NA数据,即如果数据丢失,代码将使用上次已知的价格和/或货币价格?我需要这些数据来计算50天和200天的SMA。