gpt4 book ai didi

Python pandas 时间序列重新采样给出了意想不到的结果

转载 作者:行者123 更新时间:2023-12-01 05:38:02 25 4
gpt4 key购买 nike

此处的数据适用于具有流动余额的银行帐户。我想对数据重新采样以仅使用日终余额,即一天给出的最后一个值。一天可以有多个数据点,代表多笔交易。

In [1]: from StringIO import StringIO

In [2]: import pandas as pd

In [3]: import numpy as np

In [4]: print "Pandas version", pd.__version__
Pandas version 0.12.0

In [5]: print "Numpy version", np.__version__
Numpy version 1.7.1

In [6]: data_string = StringIO(""""Date","Balance"
...: "08/09/2013","1000"
...: "08/09/2013","950"
...: "08/09/2013","930"
...: "08/06/2013","910"
...: "08/02/2013","900"
...: "08/01/2013","88"
...: "08/01/2013","87"
...: """)

In [7]: ts = pd.read_csv(data_string, parse_dates=[0], index_col=0)

In [8]: print ts
Balance
Date
2013-08-09 1000
2013-08-09 950
2013-08-09 930
2013-08-06 910
2013-08-02 900
2013-08-01 88
2013-08-01 87

我预计“2013-08-09”为 1000,但绝对不是“中间”数字 950。

In [10]: ts.Balance.resample('D', how='last')
Out[10]:
Date
2013-08-01 88
2013-08-02 900
2013-08-03 NaN
2013-08-04 NaN
2013-08-05 NaN
2013-08-06 910
2013-08-07 NaN
2013-08-08 NaN
2013-08-09 950
Freq: D, dtype: float64

我预计“2013-08-09”为 930,或“2013-08-01”为 88。

In [12]: ts.Balance.resample('D', how='first')
Out[12]:
Date
2013-08-01 87
2013-08-02 900
2013-08-03 NaN
2013-08-04 NaN
2013-08-05 NaN
2013-08-06 910
2013-08-07 NaN
2013-08-08 NaN
2013-08-09 1000
Freq: D, dtype: float64

我在这里遗漏了什么吗?使用“第一个”和“最后一个”重新采样是否无法按照我预期的方式工作?

最佳答案

为了能够对数据进行重新采样,Panda 首先必须对其进行排序。因此,如果您加载数据并按索引对其进行排序,您会得到以下结果:

>>> pd.read_csv(data_string, parse_dates=[0], index_col=0).sort_index()
Balance
Date
2013-08-01 87
2013-08-01 88
2013-08-02 900
2013-08-06 910
2013-08-09 1000
2013-08-09 930
2013-08-09 950

这解释了为什么你会得到这样的结果。 @Jeff 解释了为什么顺序是“任意的”,根据您的评论,解决方案是在操作之前对数据使用 mergesort 算法...

>>> df = pd.read_csv(data_string, parse_dates=[0],
index_col=0).sort_index(kind='mergesort')
>>> df.Balance.resample('D',how='last')
2013-08-01 88
2013-08-02 900
2013-08-03 NaN
2013-08-04 NaN
2013-08-05 NaN
2013-08-06 910
2013-08-07 NaN
2013-08-08 NaN
2013-08-09 1000
>>> df.Balance.resample('D', how='first')
2013-08-01 87
2013-08-02 900
2013-08-03 NaN
2013-08-04 NaN
2013-08-05 NaN
2013-08-06 910
2013-08-07 NaN
2013-08-08 NaN
2013-08-09 930

关于Python pandas 时间序列重新采样给出了意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18411110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com