Вызов функции повторной выборки Pandas от миллисекунды до миллисекунды - PullRequest
0 голосов
/ 06 июня 2018

У меня проблемы с использованием функции повторной выборки панд.У меня есть мелкие данные выборки, и я пытаюсь выполнить повторную выборку с частотой 0,7 секунды.Я попытался использовать ресамплирование с опцией «700L», но не работает должным образом.Я сделал пример:

import pandas as pd
from datetime import datetime
import pytz
import numpy as np
import matplotlib.pyplot as plt

def convert_2_datetime(timestamp, timezoneid):
    """

    :param timestamp: UTC format in milliseconds (data.index.values)
    :param timezoneid: timezone object from CTX (for example pytz.timezone(ctx.inp.assets[0].properties['timezoneid']))
    :return: vector of datetimes
    """

    if isinstance(timestamp,int) or isinstance(timestamp,float):
        utctime = datetime.utcfromtimestamp(timestamp / 1000).replace(tzinfo=pytz.utc)
        output = utctime.astimezone(pytz.timezone(timezoneid.zone))
    else:
        utctime = [datetime.utcfromtimestamp(i / 1000).replace(tzinfo=pytz.utc) for i in timestamp]
        output = [i.astimezone(pytz.timezone(timezoneid.zone)) for i in utctime]

    return output

# minute sampled data
v1 = [0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0]
data = pd.DataFrame({'v1':np.array(v1)},index=np.arange(start=1,stop=len(v1)+1)*60000)

data['ts']= convert_2_datetime(timestamp=data.index.values,timezoneid=pytz.timezone('UTC'))
data.set_index('ts',inplace=True)
data07 = data.resample(rule='700L',closed={'right','left'}).interpolate(method='linear')
data06 = data.resample(rule='600L',closed={'right','left'}).interpolate(method='linear')
data11 = data.resample(rule='1100L',closed={'right','left'}).interpolate(method='linear')

plt.show()

data07.v1.plot(style='.',label='700 ms')
data06.v1.plot(style='.', label = '600 ms')
data11.v1.plot(style='.', label = '1500 ms')
data.v1.plot(style='x',label='original')
plt.legend()

print('Finish!')

Окончательный результат будет верным, если я сделаю выборку с «600L» (data06 в примере);это не правильно с '700L' (data07 в примере).См. Следующий рисунок:

enter image description here

Я что-то упускаю из-за функции повторной выборки?

Большое спасибо всем!

1 Ответ

0 голосов
/ 06 июня 2018

Обходной путь

В вашем случае, я думаю, вам следует выполнить повторную выборку по методу, например по mean, перед интерполяцией.Я считаю, что это просто связано с выводом resample, и то, как interpolate читает это.В качестве примера выглядит следующее:

data07 = data.resample('700L').mean().interpolate()
data06 = data.resample('600L').mean().interpolate()
data10 = data.resample('1000L').mean().interpolate()

Этот график показывает, что он работает:

data07.v1.plot(style='.',label='700 ms', alpha=0.75, ms=3,zorder=2)
data06.v1.plot(style='^',label='600 ms', alpha=0.5, zorder=1)
data10.v1.plot(style='^',label='1000 ms', alpha=0.5, zorder=0, ms=10)
data.v1.plot(style='x',label='original', ms=10)
plt.legend()

enter image description here

Объяснение (вид ...) :

При повторной выборке данных любым методом, включая mean(), вы получаете NaN с для того места, где ваши данные были пересчитаны:

>>> data.resample('700L').mean().head()
                                   v1
ts                                   
1970-01-01 00:00:59.500000+00:00  0.0
1970-01-01 00:01:00.200000+00:00  NaN
1970-01-01 00:01:00.900000+00:00  NaN
1970-01-01 00:01:01.600000+00:00  NaN
1970-01-01 00:01:02.300000+00:00  NaN

При вызове interpolate при этом он заполнит NaN соответствующей линейной интерполяцией.

>>> data.resample('700l').mean().interpolate().head()
                                   v1
ts                                   
1970-01-01 00:00:59.500000+00:00  0.0
1970-01-01 00:01:00.200000+00:00  0.0
1970-01-01 00:01:00.900000+00:00  0.0
1970-01-01 00:01:01.600000+00:00  0.0
1970-01-01 00:01:02.300000+00:00  0.0

Когда вы вызываете interpolate непосредственно на выходеиз resample, поведение interpolate, похоже, не соответствует ожидаемому, давая вначале кучу NaN с, за которым следует постепенный наклон от максимума (1) вниз.Не совсем уверен, почему:

>>> data.resample('700l').interpolate().head()
                                  v1
ts                                  
1970-01-01 00:00:59.500000+00:00 NaN
1970-01-01 00:01:00.200000+00:00 NaN
1970-01-01 00:01:00.900000+00:00 NaN
1970-01-01 00:01:01.600000+00:00 NaN
1970-01-01 00:01:02.300000+00:00 NaN
...