python - 如何:Pandas 按 A、B 分组并将 A 组与 B 组的每一行绘制在一个图中
问题描述
我试图用 pandas 找出一条出路,在那里我可以绘制我的数据。首先我想按类别对它们进行分组,然后我想按模型对它们进行分组。在我的表中,我记录了每天的价格(时间戳)。
我想比较的是,模型的价格如何随时间变化,但在每个类别中。
所以我想要一个汽车、自行车等的数字,我只绘制相关的价格线
示例表
# Timestamp Category Model Price
1 2020-05-01 Cars BMW M1 12000€
2 2020-05-01 Cars Audi A8 43000€
3 2020-05-01 Bikes Benelli 5000€
3 2020-05-01 Bikes Honda 9000€
目前,我这样做:
df.groupby(['Category', 'Model' ]).plot(x = "Timestamp", y = "Price")
但这为每个模型绘制了一个单独的图形。
有人可以指出我正确的方向吗?
[已编辑]
我试着做一个 python 例子,所以你们可以得到数据。在这个例子中,我们有股票价格和市场类别。
基本上,我想在一个图中绘制每个 Q 类公司的股票价格,在另一个图中绘制 O 类公司的股票价格。如果有更多类别,请在其他图中绘制公司。
这样,您可以将同一类别的一家公司相互比较
import pandas as pd
# import matplotlib.pyplot as plt
# import seaborn as sns
# import numpy as np
# import plotly
# import cufflinks as cf
import datetime
import yfinance as yf
# import time
import requests
import io
# cf.go_offline()
url="https://pkgstore.datahub.io/core/nasdaq-listings/nasdaq-listed_csv/data/7665719fb51081ba0bd834fde71ce822/nasdaq-listed_csv.csv"
s = requests.get(url).content
companies = pd.read_csv(io.StringIO(s.decode('utf-8')))[:5]
Symbols = companies['Symbol'].tolist()
Category = companies['Market Category'].tolist()
display(Symbols)
gr= companies.groupby('Market Category')
stock_final = pd.DataFrame()
# iterate over each symbol
start = datetime.datetime(2020,9,1)
end = datetime.datetime(2020,11,1)
for i in Symbols:
# print the symbol which is being downloaded
print( str(Symbols.index(i)) + str(' : ') + i, sep=',', end=',', flush=True)
index = Symbols.index(i)
try:
# download the stock price
stock = []
stock = yf.download(i,start=start, end=end, progress=False)
# append the individual stock prices
if len(stock) == 0:
None
else:
stock['Name']=i
stock['Market Category'] = Category[index]
stock_final = stock_final.append(stock,sort=False)
except Exception:
None
groups = stock_final.groupby(['Market Category', 'Name'])
groups.head()
解决方案
我最终在两个 for 循环中完成了它:
for name, group in df.groupby(['Market Category']):
fig, ax = plt.subplots()
for key, grp in group.groupby('Name'):
ax = grp.plot(ax=ax, kind='line', x='timestamp', y='price', label=key)
plt.title(name)
plt.legend(loc='best')
plt.show()
解决方案
推荐阅读
- python - Selenium 如何获取文本的大小
- python - 七(7)行代码python中的繁荣游戏
- python - matplotlib 图例位置的有效位置列表
- qt5 - 以编程方式向 LXDE 桌面管理器发出信号以隐藏其开始面板?
- python - 如何将多索引列与独立列组合
- flutter - 将类中成员的名称作为参数传递给函数
- python - 当我使用调试时,代码在 Visuall Studio Coe 中有效,但在终端 python 中运行时无效
- javascript - 函数返回未定义的javascript
- node.js - Insomnia 中的“无法读取未定义的属性‘名称’”POST JSON 方法
- c# - 使用 Linq 的大 O 表示法