让我们尝试一下:
# Convert to datetime
df['datetime'] = pd.to_datetime(df['datetime'])
# Negate Sale rows
df.loc[df['action'].eq('Sale'), 'amt'] *= -1
# Calculate the total amount
df['total_amt'] = df['amt'].cumsum()
# Plot datetime vs total_amt
ax = df.plot(x='datetime', y='total_amt', ylabel='Qty', xlabel='Date')
plt.show()
DataFrame 和导入:
import pandas as pd
from matplotlib import pyplot as plt
df = pd.DataFrame({
'action': ['Buy', 'Sale', 'Sale', 'Sale', 'Sale', 'Sale', 'Sale', 'Sale',
'Sale', 'Sale', 'Sale', 'Sale', 'Buy', 'Sale', 'Sale', 'Sale',
'Sale', 'Sale', 'Sale'],
'datetime': ['2021-06-15 0:00:00', '2021-06-17 0:00:00',
'2021-06-17 0:00:00', '2021-06-17 0:00:00',
'2021-06-18 0:00:00', '2021-06-18 0:00:00',
'2021-06-19 0:00:00', '2021-06-21 0:00:00',
'2021-06-22 0:00:00', '2021-06-23 0:00:00',
'2021-06-25 0:00:00', '2021-06-30 0:00:00',
'2021-06-30 0:00:00', '2021-07-01 0:00:00',
'2021-07-01 0:00:00', '2021-07-02 0:00:00',
'2021-07-02 0:00:00', '2021-07-03 0:00:00',
'2021-07-03 0:00:00'],
'amt': [60, 11, 4, 2, 1, 2, 1, 1, 1, 1, 3, 3, 50, 2, 6, 1, 3, 1, 2]
})
*列标题被省略,所以我添加了一些。
df.head():
action datetime amt
0 Buy 2021-06-15 0:00:00 60
1 Sale 2021-06-17 0:00:00 11
2 Sale 2021-06-17 0:00:00 4
3 Sale 2021-06-17 0:00:00 2
4 Sale 2021-06-18 0:00:00 1
- 转换日期列
to_datetime:
df['datetime'] = pd.to_datetime(df['datetime'])
这将使 xaxis 刻度更易于使用。
- 否定“action”等于“sales”的行:
df.loc[df['action'].eq('Sale'), 'amt'] *= -1
df.head():
action datetime amt
0 Buy 2021-06-15 60
1 Sale 2021-06-17 -11
2 Sale 2021-06-17 -4
3 Sale 2021-06-17 -2
4 Sale 2021-06-18 -1
- 用
cumsum计算累计总数:
df['total_amt'] = df['amt'].cumsum()
action datetime amt total_amt
0 Buy 2021-06-15 60 60
1 Sale 2021-06-17 -11 49
2 Sale 2021-06-17 -4 45
3 Sale 2021-06-17 -2 43
4 Sale 2021-06-18 -1 42
- 然后是
DataFrame.plot,x 轴为“datetime”,y 轴为“total_amt”:
ax = df.plot(x='datetime', y='total_amt', ylabel='Qty', xlabel='Date')
另一个可选步骤是使用groupby last 仅绘制每天的结束总数:
# Convert to datetime
df['datetime'] = pd.to_datetime(df['datetime'])
# Negate Sale rows
df.loc[df['action'].eq('Sale'), 'amt'] *= -1
# Calculate the total amount
df['total_amt'] = df['amt'].cumsum()
# Get only the Ending Daily Total
daily_df = df.groupby(df['datetime'].dt.date)[['datetime', 'total_amt']].last()
ax = daily_df.plot(x='datetime', y='total_amt', ylabel='Qty', xlabel='Date')
plt.show()
daily_df.head():
datetime total_amt
datetime
2021-06-15 2021-06-15 60
2021-06-17 2021-06-17 43
2021-06-18 2021-06-18 40
2021-06-19 2021-06-19 39
2021-06-21 2021-06-21 38