Я переключаюсь с 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})