簡體   English   中英

如何為此列表列表的邏輯創建循環或函數

[英]How to create a loop or function for the logic for this list of lists

我有一個數據集,看起來像這樣:

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
  • 客戶ID:與特定客戶相關聯的唯一標識符
  • EventID:關於特定在線活動的唯一標識符
  • EventType:與此記錄相關聯的在線活動的類型(Web,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記錄發生。

數據集按時間順序排列。

該解決方案按CustomerIDEventType分組,然后檢查前一個事件時間是否少於4小時( 4. / 24 )之前( lt )。

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

當然,基於熊貓的解決方案似乎更聰明,但這是使用僅插入詞典的示例。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM