Невозможно выполнить скользящее окно, основанное на времени Всегда дает окно должно быть целым числом - PullRequest
1 голос
/ 18 февраля 2020

Мои данные имеют вид

{'transaction': {'merchant': 'merchantA', 'amount': 20, 'time': '2019-02-13T10:00:00.000Z'}}
{'transaction': {'merchant': 'merchantA', 'amount': 90, 'time': '2019-02-13T11:00:00.000Z'}}
.
.
.

, и я хочу выполнить некоторые операции прокрутки в зависимости от времени. например, количество транзакций, которые произошли за последние 'X' минут и c.

Я пробовал несколько способов, но не могу понять. Первоначально я дал len (df.index) в качестве индекса. (не знаю, насколько эффективно это делать)

Позже я также попытался указать в качестве индекса data ['транзакция'] ['время'] . Тем не менее, не работает.

Всегда выдает, что в окне ошибки должно быть целое число.

df = pd.DataFrame()
    df2 = pd.DataFrame()
    for line in sys.stdin:
        data = json.loads(line)
        # df1 = pd.DataFrame(data["transaction"], index=[len(df.index)])
        df1 = pd.DataFrame(data["transaction"], index=[data['transaction']['time']])
        # df1 = pd.DataFrame.from_dict(data, orient='index')
        df = df.append(df1)
        ro = df.rolling('2min', on='time').count()
        # ro = pd.get_dummies(df).rolling('2M').count()
        print(ro)
        # df2 = df.merge(ro)

    # print(df2)
    print(df)

Что мне здесь не хватает?

Спасибо

1 Ответ

0 голосов
/ 18 февраля 2020

Я думаю, что вы можете сначала создать список словарей и перейти к конструктору DataFrame, преобразовать столбец time в datetime, а затем использовать rolling:

out = [json.loads(line)["transaction"] for line in sys.stdin]
df = pd.DataFrame(out)
df['time'] = pd.to_datetime(df['time'])

И затем:

df['new'] = df.rolling('2min', on='time')['amount'].count()
print (df)
    merchant  amount                      time  new
0  merchantA      90 2019-02-13 11:00:00+00:00  1.0
1  merchantA      90 2019-02-13 11:00:00+00:00  2.0

РЕДАКТИРОВАТЬ:

Ваше решение должно быть изменено:

out = []
for line in sys.stdin:
    data = json.loads(line)
    out.append(data["transaction"])

df = pd.DataFrame(out)
df['time'] = pd.to_datetime(df['time'])

df['new'] = df.rolling('2min', on='time')['amount'].count()
...