过滤/平滑步进功能以检索最大增量

时间:2016-09-15 21:04:31

标签: python pandas numpy

我有一个pandas系列,其中索引是日期时间。

我可以使用step()函数绘制我的函数,该函数将系列的每个点相对于时间(x是时间)绘制。

我想要一种不那么精确的进化方法。所以我需要减少步数,并忽略较小的增量。 enter image description here 我找到的唯一方法是使用numpy中的poly1d()函数将点插值为多项式,然后逐步执行该函数。不幸的是,我在转换期间失去了时间索引,因为多项式的索引是x。

有没有办法'简化'我的功能只能得到y轴上最大变化的日期(x值)而不是任何变化的所有日期? 正如我上面所写的那样,我希望只有最大的增量,而不是微小的变化。

以下是确切的数据:

2016-01-02    -5.418440
2016-01-09    -9.137942
2016-01-16    -9.137942
2016-01-23    -9.137942
2016-01-30    -9.137942
2016-02-06   -11.795107
2016-02-13   -11.795107
2016-02-20   -11.795107
2016-02-27   -11.795107
2016-03-05   -11.795107
2016-03-12   -13.106988
2016-03-19   -13.106988
2016-03-26   -13.106988
2016-04-02   -13.106988
2016-04-09   -13.106988
2016-04-16   -13.106988
2016-04-23   -13.106988
2016-04-30   -11.458878
2016-05-07     0.051123
2016-05-14     2.010179
2016-05-21    -3.210870
2016-05-28    -0.726291
2016-06-04     5.841818
2016-06-11     5.067061
2016-06-18     5.789375
2016-06-25    16.455159
2016-07-02    22.518294
2016-07-09    39.834977
2016-07-16    54.685965
2016-07-23    54.685965
2016-07-30    55.169290
2016-08-06    55.169290
2016-08-13    55.169290
2016-08-20    53.366569
2016-08-27    45.758675
2016-09-03    10.976592
2016-09-10    -0.554887
2016-09-17    -8.653451
2016-09-24   -18.198305
2016-10-01   -22.218711
2016-10-08   -21.158434
2016-10-15   -11.723798
2016-10-22    -9.928957
2016-10-29   -17.498315
2016-11-05   -22.850454
2016-11-12   -25.190656
2016-11-19   -27.250960
2016-11-26   -27.250960
2016-12-03   -27.250960
2016-12-10   -27.250960

3 个答案:

答案 0 :(得分:1)

所以这是我的想法:

# Load the data
a = load_table('<your_data_file>', delim_whitespace=True, names=['value'], index_col=0)

# Create and additional column containing the difference 
#+between two consecutive values:
a['diff'] = a.value.diff()

# select only the value of the 'diff' column higher than a certain threshold
#+and copy them to a new frame:
b = a[abs(a['diff']) > .5] # The threshold (.5) could be what you think is the best

# Plot your new graph
b.value.plot()

希望这有用......

答案 1 :(得分:0)

一种方法是从原始系列创建一个遮罩,其中将系列中前一个值的绝对值与灵敏度阈值进行比较。掩码只是一个布尔选择数组(矩阵),用于过滤原始系列。

#my_series is your Series
threshold = 10.0
diff_series = my_series.diff.abs()
mask = diff_series > threshold
#now plot the masked values only or create new series from it etc.
my_series[mask].plot()

答案 2 :(得分:-1)

您可以使用pandas resample function

导入数据并将列设置为&#39;日期&#39;和&#39;价值观&#39;。其余部分将Date列解析为datetime。

import pandas as pd
from datetime import datetime

df.columns = ['Date','Values']
df.Date = df.Date.map(lambda x: datetime.strptime(x,'%Y-%m-%d'))
df.set_index('Date',inplace=True)

您现在可以重新取样时间序列。例如,按月:

resampled_df = df.resample('M').mean()
resampled_df.head()

最后,绘制它。

resampled_df.plot()