Контекст
Я сузил пространственную проблему, с которой я столкнулся, до следующего «утверждения» (я могу 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'
(любые другие распространенные библиотеки могут решить эту проблему)