Skyhehe
Skyhehe

Reputation: 77

Problem with Iterating through a list and automating algorithm

With reference to the codes below, is there a way for me to automatically loop through open_count and close_count to create trips_check? I have been manually typing in the variables 'Open_1', 'Close_1' ... into trip_check whenever a new variable is added, which I find to be inefficient.

door_dur_log = pd.DataFrame([[1, 2.029, 2.208, np.nan, np.nan, 3.01, np.nan, np.nan],
[2, 2.029, 2.208, np.nan, np.nan, 3.01, 2.42, np.nan],
[3, 1.266, np.nan, np.nan, np.nan, 3.846, np.nan, np.nan],
[4, 1.266, 2.224, np.nan, np.nan, 3.846, 3.102, np.nan],
[5, 3.102, 2.923, 3.156, np.nan, 1.318, 2.186, np.nan],
[6, 2.156, np.nan, np.nan, np.nan, 3.039, np.nan, np.nan],
[7, 2.13, 2.195, np.nan, np.nan, 2.982, 2.817, np.nan],
[8, 2.552, np.nan, np.nan, np.nan, 2.408, np.nan, np.nan]], columns = ['Trip', 'Open_1', 'Open_2', 'Open_3', 'Open_4', 'Close_1', 'Close_2', 'Close_3'])

open_count = ['Open_1', 'Open_2', 'Open_3', 'Open_4']
close_count = ['Close_1', 'Close_2', 'Close_3']

trips_check = door_dur_log[(door_dur_log['Open_1'] > 2.75)|(door_dur_log['Open_1'] < 1) | 
                           (door_dur_log['Open_2'] > 2.75)|(door_dur_log['Open_2'] < 1) | 
                           (door_dur_log['Open_3'] > 2.75)|(door_dur_log['Open_3'] < 1) |
                           (door_dur_log['Open_4'] > 2.75)|(door_dur_log['Open_4'] < 1) |
                           (door_dur_log['Close_1'] > 2.75)|(door_dur_log['Close_1'] < 1)|
                           (door_dur_log['Close_2'] > 2.75)|(door_dur_log['Close_2'] < 1)|
                           (door_dur_log['Close_3'] > 2.75)|(door_dur_log['Close_2'] < 1)]

Upvotes: 0

Views: 28

Answers (1)

Sumit Chaturvedi
Sumit Chaturvedi

Reputation: 348

You could do the following

from functools import reduce

lb_open = [door_dur_log[_] > 2.75 for _ in open_count]
lb_close = [door_dur_log[_] > 2.75 for _ in close_count]
ub_open = [door_dur_log[_] < 1 for _ in open_count]
ub_close = [door_dur_log[_] < 1 for _ in close_count]

constraints = [*lb_open, *lb_close, *ub_open, *ub_close]
combined = reduce(lambda a, b : a|b, constraints)

trips_check = door_dur_log[combined]

The first 4 lines are by list comprehension.

The * operator unpacks a list. It can be used to combine different lists. For example,

a = [1,2,3]
b = [4,5,5]
c = [*a, *b] # c = [1,2,3,4,5,5]

Lastly, the reduce operation takes a binary operation and accumulates the result by applying the operation on the result accumulated so far and the next element in the list. For example,

a = reduce(lambda x, y : x + y, [1,2,3,4]) # a = 10

More information can be found here.

Upvotes: 1

Related Questions