如何制作时间序列图并标记 Python Pandas 中销售额最高的 5 天?
How to make Time Series plot and mark 5 days with the highest sales in Python Pandas?
我在 Python Pandas 中有 DataFrame,如下所示:
date_col - 采用“datetime64”格式
销售额 - 采用“int64”格式
date_col
sales
2019-01-05
100
2019-03-20
500
2019-04-28
290
...
...
我需要创建时间序列图并用单独的颜色标记销售额最高的 5 天。
目前我有如下代码:
df['sales'].plot(linewidth=1.5,
grid = True,
marker="o",
linestyle="-",
markersize=4,
label="Daily sales",
color = "steelblue")
plt.xlabel("date")
plt.ylabel("sales")
plt.legend()
plt.show()
它给出了结果:
但作为最终结果,我需要如下内容:
- 垂直线表示销售额最高的 5 天
- 销售额最高的 5 天的年月日格式
我如何在 Python 中做到这一点?我如何修改我的代码或以其他方式进行修改?
mrCopiCat 我使用了您的代码,结果如下所示,为什么?
嗯,您可以将 matplotlib
中内置的 ax.annotate
函数与 ax.vlines
一起使用。这是一个最大值为 5 的示例(我确实为日期使用了简单的 int 值(为了示例),但它肯定会与您的日期时间值一起使用):
import numpy as np
import pandas as pd
import random
import matplotlib.pyplot as plt
# init figure and axis
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set(title="maximum sales ...")
# sample df
data = {'date_col': list(range(20)), 'sales': [random.randint(1, 30) for _ in range(20)]}
df = pd.DataFrame.from_dict(data).set_index('date_col')
# plotting the df
df.plot(ax=ax)
# adding the lines
num_max = 5 # change this if you want more or less points
for row in df.sort_values(by='sales', ascending=False).iloc[:num_max].iterrows():
print(row[0], row[1])
xmax, ymax = row[0], row[1]
ax.vlines(xmax, 0, ymax, color="tab:red")
ax.annotate(f'{xmax}', xy=(xmax, ymax), xytext=(xmax, ymax + 1), color="tab:red")
# setting size limit and plotting
ax.set_ylim(0,40) # change or remove that too
plt.show()
输出:
我在 Python Pandas 中有 DataFrame,如下所示:
date_col - 采用“datetime64”格式
销售额 - 采用“int64”格式
date_col sales 2019-01-05 100 2019-03-20 500 2019-04-28 290 ... ...
我需要创建时间序列图并用单独的颜色标记销售额最高的 5 天。
目前我有如下代码:
df['sales'].plot(linewidth=1.5,
grid = True,
marker="o",
linestyle="-",
markersize=4,
label="Daily sales",
color = "steelblue")
plt.xlabel("date")
plt.ylabel("sales")
plt.legend()
plt.show()
它给出了结果:
但作为最终结果,我需要如下内容:
- 垂直线表示销售额最高的 5 天
- 销售额最高的 5 天的年月日格式
我如何在 Python 中做到这一点?我如何修改我的代码或以其他方式进行修改?
mrCopiCat 我使用了您的代码,结果如下所示,为什么?
嗯,您可以将 matplotlib
中内置的 ax.annotate
函数与 ax.vlines
一起使用。这是一个最大值为 5 的示例(我确实为日期使用了简单的 int 值(为了示例),但它肯定会与您的日期时间值一起使用):
import numpy as np
import pandas as pd
import random
import matplotlib.pyplot as plt
# init figure and axis
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set(title="maximum sales ...")
# sample df
data = {'date_col': list(range(20)), 'sales': [random.randint(1, 30) for _ in range(20)]}
df = pd.DataFrame.from_dict(data).set_index('date_col')
# plotting the df
df.plot(ax=ax)
# adding the lines
num_max = 5 # change this if you want more or less points
for row in df.sort_values(by='sales', ascending=False).iloc[:num_max].iterrows():
print(row[0], row[1])
xmax, ymax = row[0], row[1]
ax.vlines(xmax, 0, ymax, color="tab:red")
ax.annotate(f'{xmax}', xy=(xmax, ymax), xytext=(xmax, ymax + 1), color="tab:red")
# setting size limit and plotting
ax.set_ylim(0,40) # change or remove that too
plt.show()
输出: