Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from pandas import DataFrame
- import pandas as pd
- # switch off warnings
- pd.options.mode.chained_assignment = None
- # main logic function
- def main(result_file = 'output.csv', vlan_file = 'vlans.csv', requests_file = 'requests.csv'):
- # final list of elements
- out_list = [('request_id', []), ('device_id', []), ('primary_port', []), ('vlan_id', [])]
- # get files: with vlans data and requests data
- vlan_csv, requests_csv = read_data(vlan_file, requests_file)
- # division vlan_csv into two files
- # only_primary_port_devices - devices with primary port
- # device_primary - pairs of dataframes with devices available for redundancy
- only_primary_port_devices, device_primary = get_devices_info(vlan_csv)
- for request_data in requests_csv.itertuples():
- # processing of non redundant requests
- if request_data.redundant == 0:
- # from primary devices get minimal vlan value
- minimal_vlan_id = only_primary_port_devices[only_primary_port_devices.vlan_id == only_primary_port_devices.vlan_id.min()]
- # from minimal vlan for id is chosen a minimal device id
- minimal_device_id = minimal_vlan_id[minimal_vlan_id.device_id == minimal_vlan_id.device_id.min()]
- # drop
- only_primary_port_devices = only_primary_port_devices.drop(minimal_device_id.index)
- try:
- device_primary = device_primary.drop(minimal_device_id.index)
- except ValueError:
- pass
- # adding data in dict
- out_list[0][1].append(request_data.request_id)
- out_list[1][1].append(int(minimal_device_id.device_id.values[0]))
- out_list[2][1].append(1)
- out_list[3][1].append(int(minimal_device_id.vlan_id.values[0]))
- # processing of redundant requests
- elif request_data.redundant == 1:
- # if we have available pair vlan IDs
- if not device_primary.empty:
- # getiing minimal ids vlan value
- minimal_primary_vlan_id = device_primary[device_primary.vlan_id == device_primary.vlan_id.min()]
- # device id is gotten from the number of minimal vlan ids
- minimal_primary_device_id = minimal_primary_vlan_id[minimal_primary_vlan_id.device_id == minimal_primary_vlan_id.device_id.min()]
- # drop
- only_primary_port_devices = only_primary_port_devices.drop(minimal_primary_device_id.index)
- device_primary = device_primary.drop(minimal_primary_device_id.index)
- # adding in dict data about minimal_primary_vlan_id
- out_list[0][1].append(request_data.request_id)
- out_list[1][1].append(int(minimal_primary_device_id.device_id.values[0]))
- out_list[2][1].append(1)
- out_list[3][1].append(int(minimal_primary_device_id.vlan_id.values[0]))
- # adding in dict data about minimal_secondary_vlan_id
- out_list[0][1].append(request_data.request_id)
- out_list[1][1].append(int(minimal_primary_device_id.device_id.values[0]))
- out_list[2][1].append(0)
- out_list[3][1].append(int(minimal_primary_device_id.vlan_id.values[0]))
- # create DataFrame from dict and write it into a file
- pd.DataFrame.from_items(out_list).sort_values(by=['request_id','primary_port']).to_csv(result_file, index=False, header=True, columns=['request_id', 'device_id', 'primary_port', 'vlan_id'])
- # returning of the redundancy devices list and list of devices with primary port
- def get_devices_info(vlan_csv):
- primary_results = DataFrame()
- # creating of three lists: a list with devices primary ports and devices secondary ports
- primary_port_devices = vlan_csv[vlan_csv.primary_port == 1]
- only_primary_port_devices = primary_port_devices
- secondary_port_devices = vlan_csv[vlan_csv.primary_port == 0]
- for devices in vlan_csv.device_id.unique():
- primary_port_device = primary_port_devices[(primary_port_devices.device_id == devices)]
- secondary_port_device = secondary_port_devices[(secondary_port_devices.device_id == devices)]
- primary_port_devices['redundancy_able'] = primary_port_device.vlan_id.isin(secondary_port_device.vlan_id)
- primary_results = primary_results.append(primary_port_devices[(primary_port_devices.redundancy_able == True)])
- return only_primary_port_devices[['device_id', 'vlan_id']], primary_results[['device_id', 'vlan_id']]
- # reading data from files and cleaning it
- def read_data(vlan_file = 'vlans.csv', requests_file = 'requests.csv'):
- vlan_csv = DataFrame(pd.read_csv(vlan_file)).dropna(how='any')
- requests_csv = DataFrame(pd.read_csv(requests_file)).dropna(how='any')
- return vlan_csv, requests_csv
- if __name__ == '__main__':
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement