Python: самый эффективный способ классификации транзакций - PullRequest
1 голос
/ 18 января 2020

У меня большой список транзакций, которые я хочу классифицировать. Это выглядит так:

transactions: [
     {
        "id": "20200117-16045-0",
        "date": "2020-01-17",
        "creationTime": null,
        "text": "SuperB Vesterbro T 74637",
        "originalText": "SuperB Vesterbro T 74637",
        "details": null,
        "category": null,
        "amount": {
            "value": -160.45,
            "currency": "DKK"
        },
        "balance": {
            "value": 12572.68,
            "currency": "DKK"
        },
        "type": "Card",
        "state": "Booked"
    },
    {
        "id": "20200117-4800-0",
        "date": "2020-01-17",
        "creationTime": null,
        "text": "Rent        45228",
        "originalText": "Rent        45228",
        "details": null,
        "category": null,
        "amount": {
            "value": -48.00,
            "currency": "DKK"
        },
        "balance": {
            "value": 12733.13,
            "currency": "DKK"
        },
        "type": "Card",
        "state": "Booked"
    },
    {
        "id": "20200114-1200-0",
        "date": "2020-01-14",
        "creationTime": null,
        "text": "Superbest          86125",
        "originalText": "SUPERBEST          86125",
        "details": null,
        "category": null,
        "amount": {
            "value": -12.00,
            "currency": "DKK"
        },
        "balance": {
            "value": 12781.13,
            "currency": "DKK"
        },
        "type": "Card",
        "state": "Booked"
    }
]

Я загрузил данные следующим образом:

with open('transactions.json') as transactions:
    file = json.load(transactions)

data = json_normalize(file)['transactions'][0]
return pd.DataFrame(data)

И у меня пока есть следующие категории, я хочу сгруппировать транзакции по:

CATEGORIES = {
    'Groceries': ['SuperB', 'Superbest'],
    'Housing': ['Insurance', 'Rent']
}

Теперь я хотел бы провести l oop через каждую строку в DataFrame и сгруппировать каждую транзакцию. Я хотел бы сделать это, проверив, содержит ли text одно из значений из словаря CATEGORIES.

Если это так, эту транзакцию следует классифицировать как ключ словаря CATEGORIES - для экземпляр Groceries.

Как мне сделать это наиболее эффективно?

1 Ответ

1 голос
/ 18 января 2020

IIU C,

мы можем создать список с разделителями канала из вашего словаря и выполнить некоторое назначение с .loc

print(df)
for k,v in CATEGORIES.items():
    pat = '|'.join(v)
    df.loc[df['text'].str.contains(pat),'category'] = k
print(df[['text','category']])
                       text   category
0  SuperB Vesterbro T 74637  Groceries
1         Rent        45228    Housing
2  Superbest          86125  Groceries

более эффективным решением:

мы создаем единый список всех ваших значений и извлекаем их с помощью str.extract, в то же время мы воссоздаем ваш словарь, поэтому каждое значение теперь является ключом, который мы сопоставим с вашим целевым фреймом данных.

words = []
mapping_dict = {}
for k,v in CATEGORIES.items():
    for item in v:
        words.append(item)
        mapping_dict[item] = k


ext = df['text'].str.extract(f"({'|'.join(words)})")
df['category'] = ext[0].map(mapping_dict)
print(df)
                       text   category
0  SuperB Vesterbro T 74637  Groceries
1         Rent        45228    Housing
2  Superbest          86125  Groceries
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...