Advertisement
Guest User

Untitled

a guest
Dec 6th, 2017
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.98 KB | None | 0 0
  1. from pandas import DataFrame
  2. import pandas as pd
  3.  
  4. # switch off warnings
  5. pd.options.mode.chained_assignment = None
  6.  
  7.  
  8. # main logic function
  9. def main(result_file = 'output.csv', vlan_file = 'vlans.csv', requests_file = 'requests.csv'):
  10.     # final list of elements
  11.     out_list = [('request_id', []), ('device_id', []), ('primary_port', []), ('vlan_id', [])]
  12.  
  13.     # get files: with vlans data and requests data
  14.     vlan_csv, requests_csv = read_data(vlan_file, requests_file)
  15.     # division vlan_csv into two files
  16.     # only_primary_port_devices - devices with primary port
  17.     # device_primary - pairs of dataframes with devices available for redundancy
  18.     only_primary_port_devices, device_primary = get_devices_info(vlan_csv)
  19.    
  20.     for request_data in requests_csv.itertuples():
  21.         # processing of non redundant requests
  22.         if request_data.redundant == 0:
  23.                 # from primary devices get minimal vlan value
  24.                 minimal_vlan_id = only_primary_port_devices[only_primary_port_devices.vlan_id == only_primary_port_devices.vlan_id.min()]
  25.  
  26.                 # from minimal vlan for id is chosen a minimal device id
  27.                 minimal_device_id = minimal_vlan_id[minimal_vlan_id.device_id == minimal_vlan_id.device_id.min()]
  28.                
  29.                 # drop
  30.                 only_primary_port_devices = only_primary_port_devices.drop(minimal_device_id.index)
  31.                 try:
  32.                     device_primary = device_primary.drop(minimal_device_id.index)
  33.                 except ValueError:
  34.                     pass
  35.                
  36.                 # adding data in dict
  37.                 out_list[0][1].append(request_data.request_id)
  38.                 out_list[1][1].append(int(minimal_device_id.device_id.values[0]))
  39.                 out_list[2][1].append(1)
  40.                 out_list[3][1].append(int(minimal_device_id.vlan_id.values[0]))
  41.                
  42.         # processing of redundant requests
  43.         elif request_data.redundant == 1:
  44.             # if we have available pair vlan IDs
  45.             if not device_primary.empty:
  46.                 # getiing minimal ids vlan value
  47.                 minimal_primary_vlan_id = device_primary[device_primary.vlan_id == device_primary.vlan_id.min()]
  48.  
  49.                 #  device id is gotten from the number of minimal vlan ids
  50.                 minimal_primary_device_id = minimal_primary_vlan_id[minimal_primary_vlan_id.device_id == minimal_primary_vlan_id.device_id.min()]
  51.                
  52.                 # drop
  53.                 only_primary_port_devices = only_primary_port_devices.drop(minimal_primary_device_id.index)
  54.                 device_primary = device_primary.drop(minimal_primary_device_id.index)
  55.  
  56.                 # adding in dict data about minimal_primary_vlan_id
  57.                 out_list[0][1].append(request_data.request_id)
  58.                 out_list[1][1].append(int(minimal_primary_device_id.device_id.values[0]))
  59.                 out_list[2][1].append(1)
  60.                 out_list[3][1].append(int(minimal_primary_device_id.vlan_id.values[0]))
  61.  
  62.                 # adding in dict data about minimal_secondary_vlan_id
  63.                 out_list[0][1].append(request_data.request_id)
  64.                 out_list[1][1].append(int(minimal_primary_device_id.device_id.values[0]))
  65.                 out_list[2][1].append(0)
  66.                 out_list[3][1].append(int(minimal_primary_device_id.vlan_id.values[0]))
  67.  
  68.     # create DataFrame from dict and write it into a file
  69.     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'])
  70.  
  71.  
  72. # returning of the redundancy devices list and list of devices with primary port
  73. def get_devices_info(vlan_csv):
  74.     primary_results = DataFrame()
  75.  
  76.     # creating of three lists: a list with devices primary ports and devices secondary ports
  77.     primary_port_devices = vlan_csv[vlan_csv.primary_port == 1]
  78.     only_primary_port_devices = primary_port_devices
  79.     secondary_port_devices = vlan_csv[vlan_csv.primary_port == 0]
  80.  
  81.     for devices in vlan_csv.device_id.unique():
  82.         primary_port_device = primary_port_devices[(primary_port_devices.device_id == devices)]
  83.         secondary_port_device = secondary_port_devices[(secondary_port_devices.device_id == devices)]
  84.  
  85.         primary_port_devices['redundancy_able'] = primary_port_device.vlan_id.isin(secondary_port_device.vlan_id)
  86.  
  87.         primary_results = primary_results.append(primary_port_devices[(primary_port_devices.redundancy_able == True)])
  88.  
  89.     return only_primary_port_devices[['device_id', 'vlan_id']], primary_results[['device_id', 'vlan_id']]
  90.  
  91.  
  92. # reading data from files and cleaning it
  93. def read_data(vlan_file = 'vlans.csv', requests_file = 'requests.csv'):
  94.     vlan_csv = DataFrame(pd.read_csv(vlan_file)).dropna(how='any')
  95.     requests_csv = DataFrame(pd.read_csv(requests_file)).dropna(how='any')
  96.  
  97.     return vlan_csv, requests_csv
  98.  
  99. if __name__ == '__main__':
  100.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement