如何为此列表列表的逻辑创建循环或函数

时间:2016-04-03 05:10:27

标签: python python-2.7 ipython

我有一个如下所示的数据集:

CustomerID  EventID EventType   EventTime
6           1        Facebook    42373.31586
6           2        Facebook    42373.316
6           3        Web         42374.32921
6           4        Twitter     42377.14913
6           5        Facebook    42377.40598
6           6        Web         42378.31245
  • CustomerID:与特定关联的唯一标识符 客户
  • EventID:有关特定在线活动的唯一标识符
  • EventType:与此记录关联的在线活动的类型 (网络,Facebook或Twitter)
  • EventTime:此在线活动的日期和时间 地点。该值以1900年1月1日以来的天数来衡量,其中分数表示一天中的特定时间。因此,例如,2016年1月1日午夜时段发生的事件将是事件时间为42370.00,而2016年1月1日中午发生的事件将具有42370.50的事件时间。

我已设法导入CSV并使用以下代码创建一个列表:

# Import Libraries & Set working directory
import csv

# STEP 1:  READING THE DATA INTO A PYTHON LIST OF LISTS
f = open('test1000.csv', "r") # Import CSV as file type
a = f.read() # Convert file type into string
split_list = a.split("\r") # Removes \r
split_list[0:5] # Viewing the list

# Convert from lists to 'list of lists'
final_list = []
for row in split_list:
    split_list = row.split(',') # Split list by comma delimiter
    final_list.append(split_list) 
print(final_list[0:5])

#CREATING INITIAL BLANK LISTS FOR OUTPUTTING DATA
legit = [] 
fraud = []

接下来我需要做的是将每条记录分类到欺诈或合法的列表列表中。根据以下参数,记录将被视为欺诈性记录。因此,该记录将被转至欺诈列表。

为欺诈列表分配行的逻辑:CustomerID在过去4小时内执行相同的EventType。

例如,上面的示例数据集中的第2行(事件2)将被移动到欺诈列表,因为事件1发生在最近4小时内。另一方面,事件4将进入合法列表,因为在过去4小时内没有发生Twitter记录。

数据集按时间顺序排列。

2 个答案:

答案 0 :(得分:1)

此解决方案按CustomerIDEventType进行分组,然后检查前一个事件时间是否发生在4小时前(lt)小于(4. / 24)。

df['possible_fraud'] = (
    df.groupby(['CustomerID', 'EventType'])
      .EventTime
      .transform(lambda group: group - group.shift())
      .lt(4. / 24))

>>> df
   CustomerID  EventID EventType    EventTime possible_fraud
0           6        1  Facebook  42373.31586          False
1           6        2  Facebook  42373.31600           True
2           6        3       Web  42374.32921          False
3           6        4   Twitter  42377.14913          False
4           6        5  Facebook  42377.40598          False
5           6        6       Web  42378.31245          False

>>> df[df.possible_fraud]
   CustomerID  EventID EventType  EventTime possible_fraud
1           6        2  Facebook  42373.316           True

答案 1 :(得分:0)

当然,基于熊猫的解决方案似乎更聪明,但这里只是使用插入字典的一个例子。

PS尝试自己执行输入和输出

#!/usr/bin/python2.7

sample ="""
6           1        Facebook    42373.31586
6           2        Facebook    42373.316
6           3        Web         42374.32921
6           4        Twitter     42377.14913
5           5        Web         42377.3541
6           6        Facebook    42377.40598
6           7        Web         42378.31245
"""

last = {} # This dict will contain recent time 
#values of events by client ID, for ex.: 
#{"6": {"Facebook": 42373.31586, "Web": 42374.32921}}

legit = []
fraud = []

for row in sample.split('\n')[1:-1:]:
    Cid, Eid, Type, Time = row.split()
    if Cid not in last.keys():
        legit.append(row)
        last[Cid] = {Type: Time}    
        row += '\tlegit'
    else:   
        if Type not in last[Cid].keys():
            legit.append(row)
            last[Cid][Type] = Time
            row += '\tlegit'
        else:
            if float(Time) - float(last[Cid][Type]) > (4. / 24):
                legit.append(row)
                last[Cid][Type] = Time
                row += '\tlegit'
            else:
                fraud.append(row)
                row += '\tfraud'
    print row