“ 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
答案 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推断功能背后的逻辑,但是调整底座可以解决此问题。