绘制熊猫数据集

时间:2020-09-04 15:11:08

标签: python pandas matplotlib

假设我有以下熊猫df:

import pandas as pd

df = pd.DataFrame( data = {'Day': ['2020-08-30', '2020-08-30','2020-08-30','2020-08-30',
                                        '2020-08-29', '2020-08-29','2020-08-29','2020-08-29',
                                            '2020-08-28', '2020-08-28','2020-08-28','2020-08-28'],
                                'Curve': ['Brazil', 'Japan','Brazil', 'Japan','Brazil', 'Japan','Brazil', 'Japan','Brazil', 'Japan','Brazil', 'Japan'],
                                'Value': [100, 950, 200, 1000, 50, 50, 250, 1200, 20, 30, 240, 1100],
                                'Expiry': ['1Y', '1Y', '2Y','2Y','1Y','1Y','2Y','2Y', '1Y','1Y','2Y','2Y']})

df['Difference'] = df.groupby(['Curve', 'Expiry']).Value.diff(-1)

Example Dataframe

我想绘制它并在下图中显示结果,有人知道该怎么做吗?基本上,用“曲线”绘制“差”,其中X轴是“到期”。我不在乎图例,轴名称等。只是为了了解如何根据到期时间绘制曲线。

所需的Pyplot图

Desired Pyplot graph

如果是否有可能知道如何在两个单独的图形中绘制曲线(即,每个单独的曲线一个图形),也很感兴趣。预先感谢,祝您有美好的一天

2 个答案:

答案 0 :(得分:0)

您正在寻找枢纽操作。但是首先,您似乎只想过滤最后一个日期。

df2 = (
    df[df.Day=='2020-08-30']
    .pivot(index='Expiry', columns='Curve', values='Difference')
)
print(df2)

df2.plot()
plt.show()

输出

Curve   Brazil  Japan
Expiry
1Y        50.0  900.0
2Y       -50.0 -200.0


更新

您可以使用df.Day.max()获取最后的日期,也可以使用df.filter选择要绘制的线条。

df.sort_values('Day', ascending=False, inplace=True)
df2 = (
    df[df.Day==df.Day.max()]
    .pivot(index='Expiry', columns='Curve', values='Difference')
)

only_columns = ['Brazil', 'North Korea']
df2 = df2.filter(items=only_columns, axis=1)
print(df2)

输出

Curve   Brazil
Expiry
1Y        50.0
2Y       -50.0

答案 1 :(得分:0)

嗨,您会得到期望的结果

df2=df[["Difference","Day","Curve"]]
braz=df2[df2['Curve']=='Brazil']
jap=df2[df2['Curve']=='Japan']

braz=df2[df2['Curve']=='Brazil']
jap=df2[df2['Curve']=='Japan']


f, axes  = plt.subplots(1)

axes.plot(list(range(braz.shape[0])),braz["Difference"],label="Brazil")
axes.plot(list(range(braz.shape[0])),jap["Difference"],label="Japan")

axes.legend()
axes.set_xlabel('Difference')
axes.set_ylabel('?')


f.set_figheight(8)
f.set_figwidth(8)