【问题标题】:Returning active or inactive based on payment data from other columns根据其他列的付款数据返回活动或非活动
【发布时间】:2021-05-07 09:27:43
【问题描述】:

我是python的初学者,希望你能帮我解决我的问题。

我有以下数据框:

 account_id contract_id date_activated  term_months 2020-08-01 00:00:00 2020-09-01 00:00:00 2020-10-01 00:00:00 2020-11-01 00:00:00 2020-12-01 00:00:00 2021-01-01 00:00:00 2021-02-01 00:00:00 2021-03-01 00:00:00 2021-04-02 00:00:00
0   12454545    ADD 2020-08-24  11  620.984848  620.984848  620.984848  620.984848  0.0 0.0 0.00    0.00    0.00
1   12454545    ADFGG   2021-02-01  12  0.000000    0.000000    0.000000    0.000000    0.0 0.0 687.94  687.94  687.94
2   1646468 ASDADGAD    2020-08-03  7   1504.700000 1504.700000 1504.700000 1504.700000 1504.7  1504.7  1504.70 0.00    0.00
3   5454555 ADGA    2020-08-10  8   528.000000  528.000000  528.000000  528.000000  528.0   528.0   0.00    0.00    528.00
4   48654   GHDG    2018-10-18  6   100.000000  100.000000  100.000000  0.000000    0.0 0.0 0.00    0.00    0.00

我想要以下输出:

 account_id contract_id date_activated  term_months status  2020-08-01 00:00:00 2020-09-01 00:00:00 2020-10-01 00:00:00 2020-11-01 00:00:00 2020-12-01 00:00:00 2021-01-01 00:00:00 2021-02-01 00:00:00 2021-03-01 00:00:00 2021-04-02 00:00:00
0   12454545    ADD 2020-08-24  11  Active  620.984848  620.984848  620.984848  620.984848  0.0 0.0 0.00    0.00    0.00
1   12454545    ADFGG   2021-02-01  12  Active  0.000000    0.000000    0.000000    0.000000    0.0 0.0 687.94  687.94  687.94
2   1646468 ASDADGAD    2020-08-03  7   Inactive    1504.700000 1504.700000 1504.700000 1504.700000 1504.7  1504.7  1504.70 0.00    0.00
3   5454555 ADGA    2020-08-10  8   Active  528.000000  528.000000  528.000000  528.000000  528.0   528.0   0.00    0.00    528.00
4   48654   GHDG    2018-10-18  6   Inactive    100.000000  100.000000  100.000000  0.000000    0.0 0.0 0.00    0.00    0.00

每个帐户可以有一份或多份合同。我有一个外部数据,应手动设置以确定当前日期,在本例中为“2021 年 5 月 1 日”。

我需要根据付款(带有日期的标题)和以月为单位的期限将每份合同标识为“有效”或“无效”。这将在一个新的列“状态”中。停止付款的人有 4 个月的宽限期。

如果合同每月支付(没有未付款)等于其期限,并且已经在当前日期之前结束其期限(基于 term_months),它将被视为“无效”。请参阅contract_id "ASDADGAD"。

如果合同一直在定期付款并且截至当前日期尚未到期,则该合同将被视为“有效”。参考contract_id“ADFGG”。

如果合同尚未到期(基于期限)并且在当前日期及之前没有付款但仍在四个月内,则仍将其视为“有效”。参考contract_id“ADD”和“ADGA”。

但是,如果合同的未付款超过四个月,则将被视为“无效”。参考contract_id“GHDG”。

这是结果的字典:

{'account_id': {0: 12454545, 1: 12454545, 2: 1646468, 3: 5454555, 4: 48654},
 'contract_id': {0: 'ADD', 1: 'ADFGG', 2: 'ASDADGAD', 3: 'ADGA', 4: 'GHDG'},
 'date_activated': {0: Timestamp('2020-08-24 00:00:00'),
  1: Timestamp('2021-02-01 00:00:00'),
  2: Timestamp('2020-08-03 00:00:00'),
  3: Timestamp('2020-08-10 00:00:00'),
  4: Timestamp('2018-10-18 00:00:00')},
 'term_months': {0: 11, 1: 12, 2: 7, 3: 8, 4: 6},
 'status': {0: 'Active',
  1: 'Active',
  2: 'Inactive',
  3: 'Active',
  4: 'Inactive'},
 datetime.datetime(2020, 8, 1, 0, 0): {0: 620.984848484848,
  1: 0.0,
  2: 1504.69999999999,
  3: 528.0,
  4: 100.0},
 datetime.datetime(2020, 9, 1, 0, 0): {0: 620.984848484848,
  1: 0.0,
  2: 1504.69999999999,
  3: 528.0,
  4: 100.0},
 datetime.datetime(2020, 10, 1, 0, 0): {0: 620.984848484848,
  1: 0.0,
  2: 1504.69999999999,
  3: 528.0,
  4: 100.0},
 datetime.datetime(2020, 11, 1, 0, 0): {0: 620.984848484848,
  1: 0.0,
  2: 1504.69999999999,
  3: 528.0,
  4: 0.0},
 datetime.datetime(2020, 12, 1, 0, 0): {0: 0.0,
  1: 0.0,
  2: 1504.69999999999,
  3: 528.0,
  4: 0.0},
 datetime.datetime(2021, 1, 1, 0, 0): {0: 0.0,
  1: 0.0,
  2: 1504.69999999999,
  3: 528.0,
  4: 0.0},
 datetime.datetime(2021, 2, 1, 0, 0): {0: 0.0,
  1: 687.94,
  2: 1504.69999999999,
  3: 0.0,
  4: 0.0},
 datetime.datetime(2021, 3, 1, 0, 0): {0: 0.0,
  1: 687.94,
  2: 0.0,
  3: 0.0,
  4: 0.0},
 datetime.datetime(2021, 4, 2, 0, 0): {0: 0.0,
  1: 687.94,
  2: 0.0,
  3: 528.0,
  4: 0.0}}

【问题讨论】:

  • 如果当前日期距离最后一列的日期(从 df.比如如果是 2021 年 7 月 1 日,我应该考虑 4 月 2 日(最后一列)和 2021 年 7 月 1 日之间的日期?
  • 根据我目前的数据,它永远不会发生。当前日期始终在可用列中。
  • 12454545 在 5 个月未付款后处于活动状态。输出应该是这样的吗?
  • 非常抱歉。我的意思是将当前日期设置为“2021 年 3 月 1 日”。这可能让你感到困惑。基于此,12454545 仍然处于活动状态。但是,如果将当前日期设置为“2021 年 4 月 1 日”,它将处于非活动状态。
  • 当前日期逻辑不是很清楚。因此,如果 current_date 设置为 2021 年 3 月 1 日,我们将忽略 2021 年 3 月 1 日之后的所有列,是吗?

标签: python pandas dataframe numpy


【解决方案1】:

这是处理您在问题中提供的字典的导入 - 我们将变量称为 dicti

import pandas as pd
import numpy as np
import datetime

让我们将其转换为数据框,并在开始时将所有内容设置为“活动”以用于新的状态列

df = pd.DataFrame.from_dict(dicti, orient='index').T
df["status"] = 'Active'

然后我们遍历行以找出谁的条款已经结束。 after_start_date_indices 给出每一行的 date_activate 之后的列

all_date_columns = df.columns[5:]
for index, row in df.iterrows():
    start_date = row[2]
    after_start_date_indices = all_date_columns>=start_date
    start_date_index = np.where(after_start_date_indices==True)[0][0]
#     if your going to calculate from the first time he pays
#     start_date_index = df.columns.get_loc(row[5:][row[5:]>0].index[0])-5
    if row['term_months'] < df.shape[1]-5-start_date_index:
        df.loc[index, ['status']] = 'Inactive'

最后是没有通过宽限期付款的人 - 过去 4 个月

df.loc[df.iloc[:,df.shape[1]-4:].sum(axis=1)==0, ['status']]='Inactive'

【讨论】:

    猜你喜欢
    • 2015-07-26
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多