إنشاء نظام لمكافحة الاحتيال في سيارة أجرة من الصفر

طاب مسائك. اسمي نيكيتا باشون ، أعمل كمحلل بيانات في مجموعة شركات لاكي. ستتمحور قصتي حول كيفية قيامنا ، مع فريق مكون من ثلاثة أشخاص ، بإنشاء نظام لمكافحة الاحتيال من الصفر لخدمة حجز السفر.



صورة



المقدمة



من يعرف كيف يخدع مرة سيخدع عدة مرات.

لوبي دي فيجا

الاحتيال في حالتنا هو حالة يخدع فيها السائق الشركة. الاحتيال للحصول على المال.



, , 25, Delphi. . , . , . …





— MVP, .

, :



  • . ( «-» ), , . ;
  • . — , ( , ). -, 200 .
  • , — « »:

    • , (, 0% );
    • , -.


صورة



:



  • — , , , ;
  • - ( ) — , , ;
  • — , , , .








صورة



SQL- DWH, . . , , «»:



WHERE susp = 1 --   
  AND finished_orders >= 3 --        
  AND cancelled >= 3 --    ,        
  AND dist_fin_drivers <= 2 --      
  AND ok <= 2 --   2-     


, .



. « » . , ? -. , .



صورة



python. pandas, postgres, Google ( ). , , Apache Airflow.



API .

:



credentials = ServiceAccountCredentials.from_json_keyfile_dict(
    config.crd,
    ['https://www.googleapis.com/auth/spreadsheets',
     'https://www.googleapis.com/auth/drive'])

httpAuth = credentials.authorize(httplib2.Http())
service = googleapiclient.discovery.build('sheets', 'v4', http=httpAuth)
sheet = service.spreadsheets()


:



base_range = f'{city_name}!A{ss_row + 1}:Z{ss_row + reserved_rows}'
sheet.values().append(spreadsheetId=spreadsheetid,
                                 range=base_range,
                                 body={"values": df_pos.values.tolist()},
                                 valueInputOption='RAW').execute()


:



range_from_ss = f'{city_name}!A{ss_row}:S{ss_row + reserved_rows}'

data_from_ss = service.spreadsheets().values().get(
            spreadsheetId=spreadsheetid,
            range=range_from_ss).execute().get('values', [])

data_from_ss = pd.DataFrame(data_from_ss)
data_from_ss_cols = ['id', '', '']
data_from_ss = data_from_ss.loc[1:, data_from_ss_cols]


PG:



vls_ss = ','.join([f"""({', '.join([f(d[c]) for c in data_from_ss_cols])}
                    )""" for d in data_from_ss.to_dict('rows')])

sql_update = f"""
    WITH updated as (
        UPDATE fraud_billing
        SET resolution = tb.resolution,
            comment=tb.comment,
            dt = NOW()
        FROM (VALUES {vls_ss}) AS tb(fraud_billing_id, resolution, comment)
        WHERE fraud_billing.fraud_billing_id = CAST(tb.fraud_billing_id AS INTEGER)
            AND ((fraud_billing.resolution IS NULL AND tb.resolution IS NOT NULL)
                OR (fraud_billing.comment IS NULL AND tb.comment IS NOT NULL)
                OR (fraud_billing.comment IS NOT NULL AND tb.comment IS NOT NULL
                   AND fraud_billing.comment <> tb.comment)
                OR (fraud_billing.resolution IS NOT NULL AND tb.resolution IS NOT NULL
                    AND fraud_billing.resolution <> tb.resolution)
               )
        RETURNING {alias_cols_text_with_id}
        )
    INSERT INTO fraud_billing_history ({cols_text_with_id})
    SELECT {cols_text_with_id}
    FROM updated;
"""

crs_postgres.execute(sql_update)
con_postgres.commit()


postgres :



  • ;
  • .


:



صورة



( , ).



, :



صورة



— .



: , , .



.



, . , , — . «» .



صورة



FP- , .



— , , . .



« ». , , :



  • ;
  • ;
  • ;
  • — .


.



, . , , , , . - :



صورة



, , — .



Google Spreadsheets. . , :



  • , «» ;
  • API — ;
  • ;
  • , .




. , — :



  • . - , - , - . , . ;
  • . , , :

    • - , ;
    • - ;
    • - , ;
    • - .


, , . , «».



— , . — , . !




, ?



  • . . , «» , . ;
  • . , . , .


( ) 35%. — 25%. , — — , . : , , , . .



صورة



:



  • 15 ;
  • 6800 ;
  • 500 .


لكن أهم نجاح هو التخفيض التدريجي لقضايا الاشتباه في كثير من المدن. بعد كل شيء، من الناحية المثالية، نحن لا نريد للقبض أكثر ، ونحن نريد شيئا إلى الصيد .



خاتمة



حاولت أن أصف الوظائف والمبادئ الرئيسية لنظام مكافحة الاحتيال ، بالإضافة إلى الصعوبات التي واجهناها. تشمل الخطط: استخدام ML لتحسين البحث ، وإنشاء نظام مراقبة العقوبات (الآن في المرحلة الأولية) ، وتحسين واجهة عمل المديرين ، وإنشاء تقارير ديناميكية ، وتطوير أنماط جديدة ، وأكثر من ذلك بكثير.



بعد كل شيء ، نحن فقط في بداية الرحلة.




All Articles