首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为此列表的逻辑创建循环或函数

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

Stack Overflow用户
提问于 2016-04-03 05:10:27
回答 2查看 166关注 0票数 0

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

代码语言:javascript
复制
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日午夜钟点发生的事件,EventTime为42370.00,而2016年1月1日中午发生的事件,EventTime为42370.50。

我成功地导入了CSV,并使用以下代码创建了一个列表:

代码语言:javascript
复制
# 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记录。

数据集按时间顺序排列。

EN

回答 2

Stack Overflow用户

发布于 2016-04-03 05:26:59

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-04-05 14:05:40

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

PS试图自己执行输入和输出。

代码语言:javascript
复制
#!/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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36381847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档