【发布时间】:2020-04-23 21:10:55
【问题描述】:
背景: 我们有一个票务系统,每张票都有开放日期、关闭日期、类别、类型等字段。每张票在我的数据中由一行表示,并带有一个用于识别票的键。
单个记录可能如下所示:
Number, Type, Category, Opened, Closed
TICKET100, Database, Software, 2/1/2020 11:30 AM, 4/22/2020 4:40 PM
目标: 我的目标是创建一个函数,该函数采用输入数据框(熊猫)、某种类型的输入年龄参数和属性/维度列表。然后,该函数将返回一个数据框,其中包含基于该年龄参数、每个属性/维度、日期的特定年龄之后打开的票证数量。
输入示例:
ticket_age(input_dataframe, age=5, dimensions=['Type','Category'])
所需输出的示例 sn-p:
Date, Type, Category, Count
3/1/2020, Database, Software, 1
3/2/2020, Database, Software, 1
...
4/22/2020, Database, Software, 0
关于输出的一个重要说明...如果日期和维度的交集没有任何满足条件的票,它应该创建一个计数为 0 的行。
我被困在哪里: 我不知道如何接受未知大小列表的维度并遍历所有这些维度。
我尝试了什么?当我通过维度对循环进行硬编码时,我已经成功生成了符合年龄标准的票数。
我如何计算 type_list、first_date 和 total_days:
#Create function to find the minimum date
def date_minimum(input_dataframe, date_to_check):
return input_dataframe[date_to_check].min().date()
#Create function to find the maximum date
def date_maximum(input_dataframe,date_to_check):
return input_dataframe[date_to_check].max().date()
#setup min and max dates
min_date=date_minimum(df_aged_input,'Opened')
max_date=date_maximum(df_aged_input,'Closed')
#Get the first relevant date for the dataframe loop
first_date=min_date+datetime.timedelta(days=aged_window)
# Generate a list of unique assignment groups
type_list=df_aged_input['Type'].unique().tolist()
我的循环
aged_output_list=[]
for type_iterate in range(len(type_list)):
#filter by the type
aged_type=type_list[type_iterate]
df_aged_input=df_tkt_relevant[df_tkt_relevant['Type']==aged_type].copy()
for date_iterate in range(totalDays.days):
#generate the aged date iterator
aged_date=first_date+datetime.timedelta(days=date_iterate)
#Count the number of records in the data frame that match the input conditions
aged_frame=df_aged_input[(~(df_aged_input['Closed'].dt.date<aged_date))&(df_aged_input['Opened'].dt.date<(aged_date-datetime.timedelta(days=aged_window+1)))].copy()
aged_frame['aged_Date']=aged_date-datetime.timedelta(days=1)
aged_count=aged_frame.shape[0]
#Write the date from iterative date and the aged count to a new data source
aged_output_list.append([aged_date,aged_type or 'Error: Missing Type',aged_count])
接下来我该怎么做?是否有其他图书馆可以为我完成所有这些工作?
【问题讨论】:
-
这可以用pandas方法快速完成,你能解释一下
age参数,年龄和日期之间的关系是什么?count也是该特定日期数据框中的票数吗? -
@ChrisG 有未定义的变量...我不知道
first_date、totalDays或type_list是什么。 -
@ChrisG 谢谢。开始有了更好的理解。我仍然不清楚的一件事是
TotalDays和预期的输出。预期输出中的日期似乎是任意的[3/1/2020, 3/2/2020, 4/22/2020]你能提供更多关于预期输出的信息吗 -
@Yo_Chris:感谢您提出的好问题。我现在回想起来,我提供的日期相当随意。我添加了一个省略号,希望能建议两者之间的所有日期。从技术上讲,它应该是(包括)“第一个日期”和“最大日期”之间的所有天
-
@ChrisG 完美,我现在明白了。再问一个问题,能不能多行同一个
Number:['ticket100', 'ticket101', 'ticket100']
标签: python python-3.x pandas