2D-интерполяция со значениями формата дата-время X - PullRequest
0 голосов
/ 14 мая 2018

У меня есть такой фрейм данных:

import pandas as pd
import numpy as np

time = pd.date_range('2018-05-14 00:00:00','2018-05-14 01:00:00',freq='5T')
mile = np.linspace(0,100,10)
x = list(time)*len(mile)
y = np.repeat(mile,len(time))
z = []
for i in range(0,10,1):
    z.extend(np.random.normal(loc=i*5, scale=5, size=13))
origin_data = pd.DataFrame({'x':x, 'y':y ,'z':z})

origin_data содержит исходные позиции точек (x и y) и их значения (z). Я хочу интерполировать значения z в этих новых позициях : x = pd.date_range('2018-05-14 00:00:00','2018-05-14 01:00:00',freq='1T') с y = np.linspace(0,91,1), просто используя билинейную интерполяцию.

Я узнал об официальном документе о scipy.interpolate.interp2d. Но его тип x числовой, мой тип datetime. Кроме того, значения z в учебном пособии вычисляются, а мои уже заданы, поэтому я не знаю, как обрабатывать порядок ввода значений z. Может ли кто-нибудь дать мне пример, который содержит график результатов интерполяции, основанный на приведенном выше кадре данных? Спасибо за внимание!

1 Ответ

0 голосов
/ 16 мая 2018

Вот как я нашел этот вопрос:

import pandas as pd
import numpy as np
from scipy import interpolate
import itertools


time = pd.date_range('2018-05-14 00:00:00','2018-05-14 01:00:00',freq='5T')
mile = np.arange(0,100,10)
x = list(time)*len(mile)
y = np.repeat(mile,len(time))
z = []


for i in range(0,10,1):
    z.extend(np.random.normal(loc=i*5, scale=5, size=13))
origin_data = pd.DataFrame({'x':x, 'y':y ,'z':z})

from ggplot import *

ggplot(aes(x = 'x', y = 'y', colour = 'z'), data = origin_data) +\
    geom_point(size = 100) +\
    scale_x_date(labels = date_format("%Y-%m-%d %H:%M:S"))


x_numeric = [x.timestamp() for x in origin_data['x']]



x_cors = pd.unique(x_numeric)
y_cors = pd.unique(origin_data['y'])

cors = list(itertools.product(x_cors,y_cors))

interp_func = interpolate.LinearNDInterpolator(cors, z)
interp_func = interpolate.CloughTocher2DInterpolator(cors, z)

new_x = [x.timestamp() for x in pd.date_range('2018-05-14 00:00:00','2018-05-14 01:00:00',freq='1T')]
new_y = np.arange(0,91,1)

new_cors = list(itertools.product(new_x,new_y))

new_z = interp_func(new_cors)


new_data = pd.DataFrame({'x':[x[0] for x in new_cors],
                         'y':[x[1] for x in new_cors],
                         'z':new_z})

import datetime

new_data['x'] = [pd.Timestamp(x,unit = 's') for x in new_data['x']]

ggplot(aes(x='x',y='y',colour='z'),data=new_data) +\
    geom_point(size=100) +\
    scale_x_date(labels = date_format("%Y-%m-%d %H:%M:S"))
...