'Для' l oop, который сильно зависит от поднабора, слишком медленно. Альтернативы для оптимизации? - PullRequest
0 голосов
/ 15 января 2020

Я переключаюсь с R на Python. К сожалению, я натыкаюсь на множество циклов, которые работают быстро в моих R-скриптах и ​​слишком медленны в Python (по крайней мере в моих буквальных переводах таких сценариев). Этот пример кода является одним из них.

Я постепенно привыкаю к ​​мысли, что когда дело доходит до pandas, желательно отбросить for циклы и использовать вместо них while, vectorizing funcions и apply.

Мне нужно несколько примеров того, как именно это сделать, поскольку, к сожалению, мои циклы слишком сильно полагаются на подмножества, сопоставление и добавление classi c, которые слишком медленны в своих операциях. необработанная форма.

# Create two empty lists to append results during loop
values = []
occurrences = []

#Create sample dataset, and sample series. It's just a sorted column (time series) and a column of random values:
time = np.arange(0,5000000,1)
variable = np.random.uniform(1,1000,5000000).round()
data = pd.DataFrame({'time' : time, 'variable':variable })

#Time datapoints to match
time_datapoints_to_match = np.random.uniform(0,5000000,200).round()

for i in time_datapoints_to_match:
    time_window = data[(data['time'] > i) & (data['time'] <= i+1000  )] #Subset a time window
    first_value_1pct = time_window['variable'].iloc[0] * 0.01 #extract 1/100 of the first value in time window
    try: #Check if we have a value which is lower than this 1/100 value within the time window
        first_occurence = time_window.loc[time_window['variable'] < first_value_1pct , 'time' ].iloc[0]
    except IndexError: #In case there are no matches, let's return NaN
        first_occurence = float('nan')
    values.append(first_value_1pct)
    occurrences.append(first_occurence)        

#Create DataFrame out of the two output lists
final_report = pd.DataFrame({'values': values, 'first_occurence': occurrences})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...