Сходятся к фиксированному количеству строк, которое проверяет неравенство в двух столбцах DataFrame - PullRequest
0 голосов
/ 23 апреля 2020

Контекст

Я сузил пространственную проблему, с которой я столкнулся, до следующего «утверждения» (я могу sh я мог бы назвать это уравнением, но я далек от этого), которое я конкретно связан с простым примером с использованием Pandas DataFrame ниже.


Пусть df DataFrame, содержащий объекты (1 строка = 1 объект), которые иметь два атрибута (т.е. два столбца); расстояние D и пороговое расстояние T.

D фиксирован и не может изменяться. Поэтому я хотел бы изменить T, используя параметр w, чтобы количество строк, которое подтверждает это неравенство: D ≤ t/w подводит итог (или суммирует максимально близко) к фиксированному значению L.

Прежде всего, я хотел бы иметь возможность формализовать это предложение, потому что я совершенно уверен, что оно соответствует тому, что я видел долгое время go в более формальной ситуации, чем то, которое я я на самом деле застрял. Что я достиг, так это то, что для меня явно неудовлетворительно:

∑ (D ≤ t / w) = L
r

Где сумма за r - это общее количество записей (т.е. количество строк), для которых выполняется неравенство.


До сих пор я написал простое while l oop, но оно не является ни идеальным, ни оптимальным, и, кроме того, я действительно хочу (нужно) точно настроить значение переменная w среди итераций, чтобы вычисленная длина максимально приближалась к L (т. е. с как можно меньшим числом итераций).

import pandas as pd
# Generate some sample data:
df = pd.DataFrame({'D': 1000*np.random.rand(4408), 'T': 400*np.random.randn(4408)})
L = len(df[df['D']<df['T']]) # somwhere around 700 normally
L_to_reach = 40 # The desired length
w = 1
i = 0
while (L > L_to_reach):
# It would probably be better to "oscillate" around 40, e.g. by sampling
# each odd step a value under L, and each even step a value above L
    df['T'] /= w
    L = len(df[df['D']<df['T']])
    i+=1
    w*=2
    print("Iter: {} nb_rows: {}".format(i,L))
    if i>100:
        break # get out of here!

Вопрос

Как Могу ли я достичь этого умным (быстрее / лучше) способом?
Например, избавившись от while l oop и вместо этого выполнив некоторые матричные операции?
Кроме того, не стесняйтесь, дайте мне знать если проблема такого типа на самом деле имеет название, я чувствую себя полностью истощенным из-за этого, поскольку это не основная тема c, над которой я работаю.

Для пояснения к фону на каждом шаге итерации я должен сделать большие запросы к двум базам данных, поэтому я действительно хочу минимизировать их общее количество. Кроме того, этот DataFrame является только одним образцом большого набора данных, который я повторяю.


Environment

Ubuntu 18.04
Python 3.6.9 (default, Apr 18 2020, 01:56:04)
Pandas '1.0.3'
(любые другие распространенные библиотеки могут решить эту проблему)

...