Интервал построения данных в фрейме данных

Немного новичок в python, поэтому, возможно, код можно улучшить.

У меня есть текстовый файл со значениями x и y, разделенными некоторым NaN между ними.

Данные идут от -x к x, а затем возвращаются (от x к -x), но с несколько другими значениями y, скажем:

x=np.array([-0.02,-0.01,0,0.01,0.02,NaN,1,NaN,0.02,0.01,0,-0.01,-0.02])

И я хотел бы построить (matplotlib) до первого NaN с определенным форматом, x = 1 с другим форматом и последним набором данных с третьим другим форматом (цвет, маркер, ширина линии...).

Конечно, данные, которые у меня есть, немного сложнее, но я думаю, что это простая полезная аппроксимация.

Есть идеи? Я использую pandas в качестве инструмента для обработки данных.

0
0
529
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете создать групповую метку, используя cumsum, где x равно нулю. Затем вы можете определить словарь с ключом метки со значениями, представляющими собой словарь, содержащий все параметры построения. Используйте groupby, чтобы построить каждую группу отдельно, распаковав все параметры, чтобы установить аргументы для этой группы.

Образец данных

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

x = np.array([-0.02,-0.01,0,0.01,0.02,np.NaN,1,np.NaN,0.02,0.01,0,-0.01,-0.02])
df = pd.DataFrame({'x': x})

Код

df['label'] = df.x.isnull().cumsum().where(df.x.notnull())

plot_params = {0: {'lw': 2, 'color': 'red', 'marker': 'o'},
               1: {'lw': 6, 'color': 'black', 'marker': 's'},
               2: {'lw': 9, 'color': 'blue', 'marker': 'x'}}

fig, ax = plt.subplots(figsize=(3,3))
for label, gp in df.groupby('label'):
    gp.plot(y='x', **plot_params[label], ax=ax, legend=None)
plt.show()


Вот как выглядит df для справки после определения метки группы

print(df)
       x  label
0  -0.02    0.0
1  -0.01    0.0
2   0.00    0.0
3   0.01    0.0
4   0.02    0.0
5    NaN    NaN
6   1.00    1.0
7    NaN    NaN
8   0.02    2.0
9   0.01    2.0
10  0.00    2.0
11 -0.01    2.0
12 -0.02    2.0

Хорошее решение, имеет смысл добавлять эту новую метку для каждого набора значений. В итоге я выбрал df[df["label"]==0.0].x df[df["label"]==1.0].x ... и т. д., чтобы это имело смысл с остальной частью моего предыдущего кода.

C. Alexander 19.12.2020 13:53

Другие вопросы по теме