Python使用dataframe列值进行绘图
我正在尝试使用数据帧绘制一个图形 我正在使用“pandas_datareader”获取数据 因此,我的代码如下:Python使用dataframe列值进行绘图,python,pandas,numpy,plot,yahoo-finance,Python,Pandas,Numpy,Plot,Yahoo Finance,我正在尝试使用数据帧绘制一个图形 我正在使用“pandas_datareader”获取数据 因此,我的代码如下: tickers = ["AAPL","GOOG","MSFT","XOM","BRK-A","FB","JNJ","GE","AMZN","WFC"] import pandas_datareader.data as web import datetime as dt end = dt.datetime.now().strftime("%Y-%m-%d") start = (dt.d
tickers = ["AAPL","GOOG","MSFT","XOM","BRK-A","FB","JNJ","GE","AMZN","WFC"]
import pandas_datareader.data as web
import datetime as dt
end = dt.datetime.now().strftime("%Y-%m-%d")
start = (dt.datetime.now()-dt.timedelta(days=365*3)).strftime("%Y-%m-%d")
%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
data = []
for ticker in tickers:
sub_df = web.get_data_yahoo(ticker, start, end)
sub_df["name"] = ticker
data.append(sub_df)
data = pd.concat(data)
因此,在变量data
中,有8列=['Date','Open','High','Low','Close','Volume','Adj Close','name']
变量“数据”如下所示:
我想做的是绘制一个以“日期”值为参数的图表
x参数“高”为y参数,多列为“名称”
列值([“AAPL”、“GOOG”、“MSFT”、“XOM”、“BRK-A”、“FB”、“JNJ”、“GE”、“AMZN”、“WFC”])
我该怎么做
当我执行data.plot()
时,结果将data
作为x参数,但有5列['open'、'high'、'low'、'close'、'volume'、'adj close']
而不是7列[“AAPL”、“GOOG”、“MSFT”、“XOM”、“BRK-A”、“FB”、“JNJ”、“GE”、“AMZN”、“WFC”]
:我想做什么。
结果如下:
您应该按
名称对数据进行分组,然后进行绘图。类似于data.groupby('name').plot()
的内容应该可以让您开始学习。您可能需要输入date
作为x值,输入high
作为y值。我现在不能自己测试,因为我在手机上
更新
这一天,当我接触到电脑时,我意识到自己有点不对劲。您需要在分组之前重置索引,然后打印并最终更新图例。像这样:
fig,ax=plt.subplot()
name=data.name.unique()
data.reset_index().groupby('name').plot(x='Date',y='High',ax=ax)
plt.图例(名称)
plt.show()
当然,如果你想让这张图有任何意义,你需要对价值进行某种形式的调整,因为BRK-A比任何其他股票都贵。你应该按名称对数据进行分组,然后进行绘图。类似于data.groupby('name').plot()
的内容应该可以让您开始学习。您可能需要输入date
作为x值,输入high
作为y值。我现在不能自己测试,因为我在手机上
更新
这一天,当我接触到电脑时,我意识到自己有点不对劲。您需要在分组之前重置索引,然后打印并最终更新图例。像这样:
fig,ax=plt.subplot()
name=data.name.unique()
data.reset_index().groupby('name').plot(x='Date',y='High',ax=ax)
plt.图例(名称)
plt.show()
当然,如果你想让这张图有意义,你需要对价值进行某种形式的调整,因为BRK-A比任何其他股票都要昂贵。你需要重塑数据,使名称成为数据框的标题,因为你只想绘制High
,您可以提取High
和name
列,并将其转换为宽格式,然后进行绘图:
import matplotlib as mpl
mpl.rcParams['savefig.dpi'] = 120
high = data[["High", "name"]].set_index("name", append=True).High.unstack("name")
# notice here I scale down the BRK-A column so that it will be at the same scale as other columns
high['BRK-A'] = high['BRK-A']/1000
high.head()
您需要重塑数据,使名称成为数据框的标题,因为您只想打印高
,您可以提取高
和名称
列,并将其转换为宽格式,然后进行打印:
import matplotlib as mpl
mpl.rcParams['savefig.dpi'] = 120
high = data[["High", "name"]].set_index("name", append=True).High.unstack("name")
# notice here I scale down the BRK-A column so that it will be at the same scale as other columns
high['BRK-A'] = high['BRK-A']/1000
high.head()
并且已经给了你很好的答案
我只想添加一个pandas\u datareader
允许我们将所有数据读入pandas.Panel,只需一步:
p = web.DataReader(tickers, 'yahoo', start, end)
现在我们可以随心所欲地把它切成薄片
# i'll intentionally exclude `BRK-A` as it spoils the whole graph
p.loc['High', :, ~p.minor_axis.isin(['BRK-A'])].plot(figsize=(10,8))
或者,您可以动态切片并仅保存高值
值:
df = web.DataReader(tickers, 'yahoo', start, end).loc['High']
这给了我们:
In [68]: df
Out[68]:
AAPL AMZN BRK-A FB GE GOOG JNJ MSFT WFC XOM
Date
2014-03-13 539.659988 383.109985 188852.0 71.349998 26.000000 1210.502120 94.199997 38.450001 48.299999 94.570000
2014-03-14 530.890015 378.570007 186507.0 69.430000 25.379999 1190.872020 93.440002 38.139999 48.070000 94.220001
2014-03-17 529.969994 378.850006 185790.0 68.949997 25.629999 1197.072063 94.180000 38.410000 48.169998 94.529999
2014-03-18 531.969986 379.000000 185400.0 69.599998 25.730000 1211.532091 94.239998 39.900002 48.450001 95.250000
2014-03-19 536.239990 379.000000 185489.0 69.290001 25.700001 1211.992061 94.360001 39.549999 48.410000 95.300003
2014-03-20 532.669975 373.000000 186742.0 68.230003 25.370001 1209.612076 94.190002 40.650002 49.360001 94.739998
2014-03-21 533.750000 372.839996 188598.0 67.919998 25.830000 1209.632048 95.930000 40.939999 49.970001 95.989998
... ... ... ... ... ... ... ... ... ... ...
2017-03-02 140.279999 854.820007 266445.0 137.820007 30.230000 834.510010 124.360001 64.750000 59.790001 84.250000
2017-03-03 139.830002 851.989990 264690.0 137.330002 30.219999 831.359985 123.930000 64.279999 59.240002 83.599998
2017-03-06 139.770004 848.489990 263760.0 137.830002 30.080000 828.880005 124.430000 64.559998 58.880001 82.900002
2017-03-07 139.979996 848.460022 263560.0 138.369995 29.990000 833.409973 124.459999 64.779999 58.520000 83.290001
2017-03-08 139.800003 853.070007 263900.0 137.990005 29.940001 838.150024 124.680000 65.080002 59.130001 82.379997
2017-03-09 138.789993 856.400024 263620.0 138.570007 29.830000 842.000000 126.209999 65.199997 58.869999 81.720001
2017-03-10 139.360001 857.349976 263800.0 139.490005 30.430000 844.909973 126.489998 65.260002 59.180000 82.470001
[755 rows x 10 columns]
已经给了你很好的答案
我只想添加一个pandas\u datareader
允许我们将所有数据读入pandas.Panel,只需一步:
p = web.DataReader(tickers, 'yahoo', start, end)
现在我们可以随心所欲地把它切成薄片
# i'll intentionally exclude `BRK-A` as it spoils the whole graph
p.loc['High', :, ~p.minor_axis.isin(['BRK-A'])].plot(figsize=(10,8))
或者,您可以动态切片并仅保存高值
值:
df = web.DataReader(tickers, 'yahoo', start, end).loc['High']
这给了我们:
In [68]: df
Out[68]:
AAPL AMZN BRK-A FB GE GOOG JNJ MSFT WFC XOM
Date
2014-03-13 539.659988 383.109985 188852.0 71.349998 26.000000 1210.502120 94.199997 38.450001 48.299999 94.570000
2014-03-14 530.890015 378.570007 186507.0 69.430000 25.379999 1190.872020 93.440002 38.139999 48.070000 94.220001
2014-03-17 529.969994 378.850006 185790.0 68.949997 25.629999 1197.072063 94.180000 38.410000 48.169998 94.529999
2014-03-18 531.969986 379.000000 185400.0 69.599998 25.730000 1211.532091 94.239998 39.900002 48.450001 95.250000
2014-03-19 536.239990 379.000000 185489.0 69.290001 25.700001 1211.992061 94.360001 39.549999 48.410000 95.300003
2014-03-20 532.669975 373.000000 186742.0 68.230003 25.370001 1209.612076 94.190002 40.650002 49.360001 94.739998
2014-03-21 533.750000 372.839996 188598.0 67.919998 25.830000 1209.632048 95.930000 40.939999 49.970001 95.989998
... ... ... ... ... ... ... ... ... ... ...
2017-03-02 140.279999 854.820007 266445.0 137.820007 30.230000 834.510010 124.360001 64.750000 59.790001 84.250000
2017-03-03 139.830002 851.989990 264690.0 137.330002 30.219999 831.359985 123.930000 64.279999 59.240002 83.599998
2017-03-06 139.770004 848.489990 263760.0 137.830002 30.080000 828.880005 124.430000 64.559998 58.880001 82.900002
2017-03-07 139.979996 848.460022 263560.0 138.369995 29.990000 833.409973 124.459999 64.779999 58.520000 83.290001
2017-03-08 139.800003 853.070007 263900.0 137.990005 29.940001 838.150024 124.680000 65.080002 59.130001 82.379997
2017-03-09 138.789993 856.400024 263620.0 138.570007 29.830000 842.000000 126.209999 65.199997 58.869999 81.720001
2017-03-10 139.360001 857.349976 263800.0 139.490005 30.430000 844.909973 126.489998 65.260002 59.180000 82.470001
[755 rows x 10 columns]
显示数据帧的实际片段会有所帮助。您的原始代码片段没有解释数据帧是如何组织的,本质上是不相关的。@DYZ I updated!谢谢您的帮助。您应该使用原始数据帧(sub_df
)。它们中的每一个都有Date
和High
,因此只需在循环中绘制它们:sub_df.plot(x='Date',y='High',label=ticker)
。它们将全部显示在同一图表中。您可能需要添加一个图例来查看哪个是哪个(plt.legend()
)。@DYZ实际上,然后我得到了一个错误(“KeyError:'Date'),带有“sub_df.plot(x='Date',y='High',label=ticker)”看起来像Date
实际上是一个索引。然后,您需要sub_df.reset_index().plot(…)
。显示数据帧的实际片段会有所帮助。您的原始代码片段没有解释数据帧是如何组织的,本质上是不相关的。@DYZ I updated!谢谢您的帮助。您应该使用原始数据帧(sub_df
)。它们中的每一个都有Date
和High
,因此只需在循环中绘制它们:sub_df.plot(x='Date',y='High',label=ticker)
。它们将全部显示在同一图表中。您可能需要添加一个图例来查看哪个是哪个(plt.legend()
)。@DYZ实际上,然后我得到了一个错误(“KeyError:'Date'),带有“sub_df.plot(x='Date',y='High',label=ticker)”看起来像Date
实际上是一个索引。然后你需要sub_df.reset_index().plot(…)
。他的数据最初是在按ticker分组的数据帧中,他只需要在将ticker连接到一个数据帧之前进行绘图。好的,然后我得到了10个图,分别是[“AAPL”,“GOOG”,“MSFT”,“XOM”,“BRK-A”,“FB”,“JNJ”,“GE”,“AMZN”,“WFC”],但每个图中的列不是[“AAPL”,“GOOG”,“MSFT”,“XOM”,“BRK-A”、“FB”、“JNJ”、“GE”、“AMZN”、“WFC”]但是['open'、'high'、'low'、'close'、'volume'、'adj close']@dyz是对的。将每个股票代码的数据连接起来只会让你的工作更加困难。也就是说,你应该提到你用来实现上述结果的代码。@Grr我不明白你的意思