Выбор точек над/под линиями

У меня есть следующий набор данных:

df = pd.DataFrame(np.random.rand(50,2), columns=list('AB'))

данные графика

plt.scatter(x=df.A, y=df.B)

x = plt.axhline(y=0.4,c='k')
y = plt.axvline(x=0.4,c='k')
plt.plot([0.2, 0.3], [0, 0.4], c='k')

Я хочу выбрать точки в зеленых областях (см. график ниже). Точки во втором квадранте было легко выбрать, но не точки в зеленой области в третьем квадранте.

Вот как я выбрал точки во втором квадранте:

df[( df['A'] < 0.4) & (df['B'] > 0.4)]

после этого я застрял.

Учитывая, что условия могут стать сложными, например, иметь дело с кривыми линиями и т. д. Как лучше всего решить эту проблему?

Открыт для любых предложений.

Выбор точек над/под линиями

Определена ли функция линии [0.2, 0.3], [0, 0.4]? А как бы вы хотели решить задачу, т.е. с помощью математической функции или применить классификатор?

knh190 22.05.2019 11:08

Я бы попробовал что-то вроде df[( df['A'] < 0,4) & ((df['B'] > 0,4) | df['B'] < f(['A']))], тогда как f (['A']) будет функцией, определяющей ту кривую, которая у вас есть в третьем квадранте. В настоящее время у меня нет под рукой Python IDE - я дам правильный ответ, как только сделаю это.

sekky 22.05.2019 11:08

@ knh190 это не функция, а визуализация того, что я хочу сделать. Я предпочитаю рассматривать оба метода, если это возможно, математически и применяя классификатор.

Reda S 22.05.2019 11:22

@sekky спасибо. Ждем вашего ответа :)

Reda S 22.05.2019 11:23
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
4
926
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я предлагаю вам использовать functools:

import numpy as np
import functools

cr1 = functools.reduce(np.logical_and, [df.B < 0.4, df.A < 0.2])
cr2 = functools.reduce(np.logical_and, [df.B < 0.4, df.A > 0.2, df.B > (df.A-0.2)*4])
df_filtered = df[functools.reduce(np.logical_or, [cr1,cr2])]

Спасибо, но мне пришлось изменить эти уравнения, чтобы получить желаемые результаты: , [ df.B < 0,4, df.B > (df.A-0,2)*4])'

Reda S 22.05.2019 15:50
Ответ принят как подходящий

Поскольку я обещал решение, вот одно из них без использования functools:

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

np.random.seed(42)
df = pd.DataFrame(np.random.rand(50,2), columns=list('AB'))
plt.scatter(x=df.A, y=df.B)

x = plt.axhline(y=0.4,c='k')
y = plt.axvline(x=0.4,c='k')
plt.plot([0.2, 0.3], [0, 0.4], c='k')

# the next line is the one selecting all datapoints within 
sub_df = df[(( df['A'] < 0.4) & (df['B'] > 0.4)) | (df['B'] < 0.4) & (df['A'] < (0.2 + 0.25*df['B']))]
plt.scatter(sub_df['A'], sub_df['B'], marker='x', color='red')

plt.xlabel('A')
plt.ylabel('B')

plt.show()

Предложение df['A'] < (0.2 + 0.25*df['B']) просто описывает линейную функцию. Вы можете заменить это чем-нибудь другим (например, экспоненциальной функцией).

Результирующий график из приведенного выше кода:

Спасибо, functools тоже работал, но это проще и понятнее :)

Reda S 23.05.2019 10:20

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