Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python使用dataframe列值进行绘图_Python_Pandas_Numpy_Plot_Yahoo Finance - Fatal编程技术网

Python使用dataframe列值进行绘图

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

我正在尝试使用数据帧绘制一个图形

我正在使用“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.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我不明白你的意思