标准化大量数字数据以创建有价值的折线图

时间:2018-11-07 10:30:59

标签: python python-3.x pandas dataframe plot

我有以下数据框:

Year           Month    Value
2005               9    1127.080000
2016               3    9399.000000
                   5    3325.000000
                   6    120.000000
                   7    40.450000
                   9    3903.470000
                   10   2718.670000
                   12   12108501.620000
2017               1    981879341.949982
                   2    500474730.739911
                   3    347482199.470025
                   4    1381423726.830030
                   5    726155254.759981
                   6    750914893.859959
                   7    299991712.719955
                   8    133495941.729959
                   9    27040614303.435833
                   10   26072052.099796
                   11   956680303.349909
                   12   755353561.609832
2018               1    1201358930.319930
                   2    727311331.659607
                   3    183254376.299662
                   4    9096130.550197
                   5    972474788.569924
                   6    779912460.479959
                   7    1062566320.859962
                   8    293262028544467.687500
                   9    234792487863.501495

如您所见,我按月和年分组有一些巨大的价值。我的问题是我想创建一个线条图,但是当我这样做时,对我来说没有任何意义:

df.plot(kind = 'line', figsize = (20,10))

enter image description here

考虑到值在数月和数年内波动,以视觉方式显示数据没有多大意义,但是在大部分时间段中显示为一条平线,而在最后阶段则显示一个大峰值。

我想问题可能出在y轴刻度上,无法正确拟合数据。我试图将对数转换应用于y轴,但这并未添加任何更改,我还试图将0到1之间的数据归一化只是为了进行测试,但该图仍然相同。关于如何在一段时间内更准确地表示我的数据的任何想法?而且,如何在x轴上显示月份和年份的名称?

编辑:

这是我应用对数变换的方式:

df.plot(kind = 'line', figsize = (20,10), logy = True)

这是结果:

enter image description here

对我来说,考虑到绘制的值代表了一段时间内的收入,该图仍然无法真正理解,对我而言,对数值进行对数转换对我来说意义不大。

这是我如何标准化数据:

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
df_scaled = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)
df_scaled.set_index(df.index, inplace = True)

然后我将其绘制:

df_scaled.plot(kind = 'line', figsize = (20, 10), logy = True)

enter image description here

正如您所看到的,这种情况似乎有所改变,我对于如何在给定的时间段内正确地可视化这些数据有些困惑。

1 个答案:

答案 0 :(得分:1)

问题是一个值比其他值大得多,从而导致峰值。而是使用半对数图

df.plot(y='Value', logy=True)

输出

使其像x-axis一样使用日期

df['Day'] = 1  # we need a day
df['Date'] = pd.to_datetime(df[['Year', 'Month', 'Day']])
df.plot(x='Date', y='Value', logy=True)

输出

enter image description here