【发布时间】:2021-04-07 12:32:16
【问题描述】:
我正在编写一个程序,它将时间序列 Excel 文件加载到数据框中,然后使用一些基本计算创建几个新列。我的程序有时会读取某些记录缺少几个月的 excel 文件。因此,在下面的示例中,我有两家不同商店的月度销售数据。这些商店在不同的月份营业,因此它们的第一个月底日期会有所不同。但两者都应该有截至 2020 年 9 月 30 日的月末数据。在我的文件中,Store BBB 没有 2020 年 8 月 31 日和 2020 年 9 月 30 日的记录,因为那几个月没有销售。
| Store | Month Opened | State | City | Month End Date | Sales |
|---|---|---|---|---|---|
| AAA | 5/31/2020 | NY | New York | 5/31/2020 | 1000 |
| AAA | 5/31/2020 | NY | New York | 6/30/2020 | 5000 |
| AAA | 5/31/2020 | NY | New York | 7/30/2020 | 3000 |
| AAA | 5/31/2020 | NY | New York | 8/31/2020 | 4000 |
| AAA | 5/31/2020 | NY | New York | 9/30/2020 | 2000 |
| BBB | 6/30/2020 | CT | Hartford | 6/30/2020 | 100 |
| BBB | 6/30/2020 | CT | Hartford | 7/30/2020 | 200 |
因此,对于这样的任何情况,我希望能够为 8/31 和 9/30 的 Store BBB 添加两行。新行应使用与最近月末日期相同的“开业月份”、“州”和“城市”。两个新行的销售额都应设置为 0。截至目前,我执行以下步骤:
- 使用商店名称和每个商店的最大月末日期以及整个时间序列数据框的最大月末日期创建数据框“MaxDateData”,我将此字段命名为“最近日期”。
| Store | Max Month End Date | Most Recent Date |
|---|---|---|
| AAA | 9/30/2020 | 9/30/2020 |
| BBB | 7/30/2020 | 9/30/2020 |
- 使用主要时间序列数据帧中的最新行创建数据帧“MostRecent”。为此,我在时间序列数据框和商店名称和最大月结束日期上的 MaxDateData 之间进行了内部连接。
| Store | Month Opened | State | City | Month End Date | Sales | Max Month End Date | Most Recent Date |
|---|---|---|---|---|---|---|---|
| AAA | 5/31/2020 | NY | New York | 9/30/2020 | 2000 | 9/30/2020 | 9/30/2020 |
| BBB | 6/30/2020 | CT | Hartford | 7/30/2020 | 200 | 7/30/2020 | 9/30/2020 |
- 使用 where 子句创建数据框“RequireBackfill_MostRecent”,以筛选最大月结束日期
RequireBackfill_Stores_MostRecent = MaxDateData.where(MaxDateData['Max Month End Date'] <MaxDateData['Most Recent Date'])
RequireBackfill_MostRecent = MostRecent.merge(RequireBackfill_Stores_MostRecent,how='inner')
- 然后,我使用两个嵌套的 for 循环循环遍历需要填写的日期。它利用仅包含 Store BBB 的 RequireBackfill_MostRecent 数据框。
X=[]
end = MaxDateData['Most Recent Date'][0]
for i in MonthlyData['Month End Date'].unique():
per1 = pd.date_range(start = i, end = end, freq ='M')
for val in per1:
Data=[]
Data = RequireBackfill_MostRecent[["Store"
,"Month Opened"
,"City"
,"State"
]].where(RequireBackfill_MostRecent['Max Month End date']==i).dropna()
Data["Month End Date"]= val
Data["Sales"]= 0
X.append(Data)
NewData = pd.concat(X)
- 然后我使用 concat 将 NewData 添加到我的时间序列数据框中
FullData_List = [MonthlyData,NewData]
FullData=pd.concat(FullData_List)
整个过程有效,但有没有更有效的方法来做到这一点?当我开始处理更大的数据时,这可能会变得很昂贵。
【问题讨论】: