Переупорядочить ось X для отметок времени после полуночи - Matplotlib

http://www.cplusplus.com/reference/algorithm/shuffle/

// shuffle algorithm example
#include      // std::cout
#include     // std::shuffle
#include        // std::vector
#include        // std::default_random_engine
#include        // std::chrono::system_clock

int main () 
{
    // obtain a time-based seed:
    unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
    std::default_random_engine e(seed);

    while(true)
    {
      std::vector foo{1,2,3,4,5};

      std::shuffle(foo.begin(), foo.end(), e);

      std::cout << "shuffled elements:";
      for (int& x: foo) std::cout << ' ' << x;
      std::cout << '\n';
    }

    return 0;
}

-1
задан jonboy 5 March 2019 в 11:16
поделиться

1 ответ

С

df = df.astype({
    "Time1": np.datetime64,
    "Occurring1": np.int})

каждая отметка времени имеет одну и ту же дату (2019-03-05 - это просто сегодняшняя дата). Все элементы all_times также имеют одинаковую дату. И отсюда вы получаете «неправильную кривую», используя time_grid = np.arange(all_times.min(), all_times.max(), 10*t_min, dtype="datetime64").

Есть 2 стратегии, чтобы обойти эту проблему:

Стратегия A

Если вы довольны данными, которые видите, но несчастливы только после полуночи данных нет там, где вы бы предпочли их, тогда вы можете перемещать / прокручивать данные. Этот подход не меняет способ извлечения данных для построения графика. Я вставил следующие шаги:

  1. определил самую раннюю метку времени из Time_i (= время, когда должен начаться временной ряд). Это t_start
  2. выяснить, по какому индексу time_grid t_start есть. Это дает index.
  3. незадолго до построения графика сдвига / прокрутки массивов. Но это не сработает, если вы тоже кидаете X! Поэтому используйте суррогатную временную ось для X
  4. не показано: замените метки оси X с помощью matplotlib ( Пример здесь )
[ 1126] Это дает (и код ниже)

enter image description here

Стратегия B

С отметка времени без даты является периодической, вы сталкиваетесь с проблемой, которую вы упомянули. Для интерполяции ось времени должна монотонно возрастать. Таким образом, подход заключается в следующем: при интерполяции с scipy.interpolate.griddata(points, values, xi) используйте для points и x1 суррогаты, которые монотонно растут. Для этого вам придется адаптировать процедуру, которую вы определили occurrences_grid.

Здесь код для стратегии А.

d = ({
    'Time1' : ['8:00:00','10:30:00','12:40:00','16:25:00','22:30:00','1:31:00','2:15:00','2:20:00','2:30:00'],
    'Occurring1' : ['1','2','3','4','5','4','3','2','1'],
    'Time2' : ['8:10:00','10:10:00','13:40:00','16:05:00','21:30:00','1:11:00','3:00:00','3:01:00','6:00:00'],
    'Occurring2' : ['1','2','3','4','5','4','3','2','0'],
    'Time3' : ['8:05:00','11:30:00','15:40:00','17:25:00','23:30:00','1:01:00','6:00:00','6:00:00','6:00:00'],
    'Occurring3' : ['1','2','2','3','2','1','0','0','0'],
    'Time4' : ['9:50:00','10:30:00','14:40:00','18:25:00','20:30:00','0:31:00','2:35:00','6:00:00','6:00:00'],
    'Occurring4' : ['1','2','3','4','4','3','2','0','0'],
    'Time5' : ['9:00:00','11:30:00','13:40:00','17:25:00','00:30:00','2:31:00','6:00:00','6:00:00','6:00:00'],
    'Occurring5' : ['1','2','3','3','2','1','0','0','0'],                   
     })

df = pd.DataFrame(data=d)

df = df.astype({
    "Time1": np.datetime64,
    "Occurring1": np.int,
    "Time2": np.datetime64,
    "Occurring2": np.int,
    "Time3": np.datetime64,
    "Occurring3": np.int,
    "Time4": np.datetime64,
    "Occurring4": np.int,
    "Time5": np.datetime64,
    "Occurring5": np.int,    
})

all_times = df[["Time1", "Time2", "Time3",'Time4','Time5']].values
t_start = min(df["Time1"].iloc[0], df["Time2"].iloc[0], df["Time3"].iloc[0], 
              df["Time4"].iloc[0], df["Time5"].iloc[0])                                  # new: t_start
t_start = np.datetime64(t_start)                                                         # conversion pandas/numpy
t_min = np.timedelta64(int(60*1e9), "ns")
time_grid = np.arange(all_times.min(), all_times.max(), 10*t_min, dtype="datetime64")
index = np.argmax(time_grid>=t_start)                                                    # new: index to start the graphics
print('index');print(index,time_grid[index])
X = pd.Series(time_grid).dt.time.values
occurrences_grid = np.zeros((5, len(time_grid)))

for i in range(5):
    occurrences_grid[i] = griddata(
        points=df["Time%i" % (i+1)].values.astype("float"),
        values=df["Occurring%i" % (i+1)],
        xi=time_grid.astype("float"),
        method="linear"
    )

occ_min = np.min(occurrences_grid, axis=0)
occ_max = np.max(occurrences_grid, axis=0)
occ_mean = np.mean(occurrences_grid, axis=0)

def roll(X,occ_min,occ_max,occ_mean):                                                   # new: shift/roll the values
    return np.arange(len(X)), np.roll(occ_min,-index), np.roll(occ_max,-index), np.roll(occ_mean,-index)
                                                                                       # do not shift X but use a surrogate time axis

X,occ_min,occ_max,occ_mean = roll(X,occ_min,occ_max,occ_mean) 

fig, ax0 = plt.subplots(figsize=(9,4))
plt.style.use('ggplot')
plt.fill_between(X, occ_min, occ_max, color="blue")
plt.plot(X, occ_mean, c="white")
plt.tight_layout()
plt.show()
fig.savefig('plot_model_2.png', transparency=True) 
0
ответ дан pyano 5 March 2019 в 11:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: