Guest User

Untitled

a guest
Jun 17th, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.05 KB | None | 0 0
  1. # Given a time ordered list of pageviews ("events"),
  2. # determine how many "visits" each user had,
  3. # how long each visit lasted and how many page views occurred during each visit.
  4. # A visit ends when the user has not had another page view for 1 hour,
  5. # a new pageview after 1 hours starts a new visit (the time between visits is 1 hour).
  6.  
  7. require 'enumerator'
  8.  
  9. class Array
  10. def to_event
  11. Event.new(self)
  12. end
  13. end
  14.  
  15. class Event < Array
  16. def user_id
  17. self[2]
  18. end
  19.  
  20. def when
  21. Time.at(self[3].to_i)
  22. end
  23.  
  24. def valid?
  25. self.user_id != "NULL"
  26. end
  27. end
  28.  
  29. class UserStadistics < Hash
  30. def <<(event)
  31. unless self.keys.include? event.user_id
  32. key = event.user_id
  33. self[key] = { :visits => [] }
  34. self[key][:visits] << { :count => 1, :begin => event.when , :end => event.when }
  35. else
  36. if ( event.when - self[event.user_id][:visits].last[:end] ) < 3600
  37. self[event.user_id][:visits].last[:count] = self[event.user_id][:visits].last[:count] + 1
  38. self[event.user_id][:visits].last[:end] = event.when
  39. else
  40. self[event.user_id][:visits] << { :count => 1, :begin => event.when, :end => event.when }
  41. end
  42. end
  43. end
  44.  
  45. def get_file_hash(filename)
  46. events = []
  47. lines = File.new(filename).readlines
  48. lines.each do |line|
  49. row = line.strip.split("\t").to_event
  50. events << row
  51. end
  52. events.select{|row| row.valid?}
  53. end
  54.  
  55. def get_visits(filename)
  56. events = get_file_hash(filename)
  57. events.each do |event|
  58. self << event
  59. end
  60. end
  61.  
  62. def print
  63. self.each do |user|
  64. p "-------------------------------------------------------------"
  65. p "User ID: #{user[0]}"
  66. p " Visits: #{user[1][:visits].count} "
  67. user[1][:visits].enum_for(:each_with_index).collect do |visit, index|
  68. p " Visit #{index + 1} - #{visit[:count]} pages views Duration: #{visit[:end] - visit[:begin]} secs"
  69. end
  70. end
  71. p "================================================================"
  72. end
  73. end
  74.  
  75. users = UserStadistics.new
  76. users.get_visits('./events.csv')
  77. users.print
Add Comment
Please, Sign In to add comment