dataframe.resample('4T')。mean()产生的第一个结果不正确,但后续结果一致

时间:2019-03-31 00:45:09

标签: python pandas dataframe

“ df.resample('4T')。mean()”产生的第一个结果在数据帧的第四个值之前。它会继续准确地找到下四个值的平均值,但是由于初始值不可用,因此无法在数据帧中的所需位置获取这些值。实际上,“ 7T”,“ 8T”和“ 9T”都在错误的位置产生了第一个结果,而“ 3T”,“ 5T”和“ 10T”却按预期工作。

代码:

import csv
import datetime
from datetime import datetime
import pandas as pd 

df = pd.read_csv('stockPrices/closingPrices-mar29b.csv',index_col='date',parse_dates=True)
df['close'] = df['close'].shift(1)
df['4ma'] = df.resample('4T').mean().shift(1)
print(df.tail())
我正在使用的

csv文件: https://docs.google.com/spreadsheets/d/1HzKrwcDM233uqlNZI_TdLmewJLIuKM-mKLiRtTlNauc/edit?usp=sharing

当前结果:

                        close        4ma
date                                    
2019-03-25 09:34:00  279.1300        NaN
2019-03-25 09:33:00  278.9300        NaN
2019-03-25 09:32:00  278.8500  278.72875
2019-03-25 09:31:00  278.6900        NaN
2019-03-25 09:30:00  278.7675        NaN

所需结果:

                        close        4ma
date                                    
2019-03-25 09:34:00  279.1300   278.8094
2019-03-25 09:33:00  278.9300        NaN
2019-03-25 09:32:00  278.8500        NaN
2019-03-25 09:31:00  278.6900        NaN
2019-03-25 09:30:00  278.7675        NaN

尝试补救:

1。按如下方式使用'loffset'='2T',但平均值不准确:

df['4ma loffset'] = df['close'].resample('4T',loffset='-2T').mean().shift(1)

2。更改了数据框的顺序:

df = df.sort_index(ascending=True)

3。消除了代码中列的所有移位。 “ 5T”在数据帧的第一分钟内放置了前5分钟的平均值,此后一直保持一致,但“ 4T”在第四分钟之前仍产生了其第一个结果。

**注意在我的代码中使用“ shift”。我在原始数据框中移动了“关闭”列,然后在创建后移动了“ ma”列。我收到的库存数据开始于9:31,结束于16:00。 9:31价格最初是9:30:01-9:31:00分钟的收盘价。因为我想在MM:SS处移动均线(例如9:35:00的5分钟移动均线),所以我必须在原始数据帧上移动(1)才能将数字放入空9:30:00索引中。我还必须移动“ ma”列,否则我将在时间块的开头获取值,如下所示:

2019-03-25 09:34:00  279.1300        NaN
2019-03-25 09:33:00  278.9300        NaN
2019-03-25 09:32:00  278.8500        NaN
2019-03-25 09:31:00  278.6900        NaN
2019-03-25 09:30:00  278.7675  278.87350

1 个答案:

答案 0 :(得分:0)

解决方案:使用以下任意列获取准确的重采样:

df['4ma'] = df.resample('4T', base=2).mean().shift(1)
df['7ma'] = df.resample('7T', base=3).mean().shift(1)
df['8ma'] = df.resample('8T', base=2).mean().shift(1)
df['9ma'] = df.resample('9T', base=1).mean().shift(1)

以下GitHub线程建议使用“ base = x”来解决Pandas中的此问题: https://github.com/pandas-dev/pandas/issues/4197

从本质上讲,当使用分钟数据对熊猫进行下采样时,熊猫会尝试“推断”不同的起点。更改基数将更改采样开始的位置。

我不了解Pandas推断功能背后的逻辑,但是调整底座可以解决此问题。