【发布时间】:2020-10-01 20:41:58
【问题描述】:
我正在尝试通过aggregated_data 计算所有数据帧(以字典形式出现)中某些列的比率。
这里data 是一个字典,它包含级别名称作为键,其数据(作为数据框)作为值。
例如:
1)这就是数据的样子(只是一个例子)
data={'State':State_data,'District':District_data}
>>> State_data
Time level value 97E03K 90KFTO FXRDW9 1I4OX9 N6HO97
0 2017-04-01 State NY 15 7 8 19 17
1 2017-05-01 State NY 11 8 9 16 11
2 2017-06-01 State NY 17 16 6 12 17
3 2017-04-01 State WDC 6 17 19 8 20
4 2017-05-01 State WDC 19 9 20 11 17
5 2017-06-01 State WDC 10 11 6 20 11
>>> District_data
Time level value 97E03K 90KFTO FXRDW9 1I4OX9 N6HO97
0 2017-04-01 District Downtown 2 1 5 3 5
1 2017-05-01 District Downtown 4 3 2 4 3
2 2017-06-01 District Downtown 4 3 4 1 3
3 2017-04-01 District Central 3 4 3 5 5
4 2017-05-01 District Central 4 3 5 4 3
5 2017-06-01 District Central 4 3 5 5 3
2)这是聚合数据的样子:
Time level value 97E03K 90KFTO FXRDW9 1I4OX9 N6HO97
0 2017-04-01 Aggregated Aggregated 27 21 23 30 21
1 2017-05-01 Aggregated Aggregated 27 29 26 22 30
2 2017-06-01 Aggregated Aggregated 27 30 30 25 25
3 2017-04-01 Aggregated Aggregated 22 27 30 22 25
4 2017-05-01 Aggregated Aggregated 22 21 24 22 29
5 2017-06-01 Aggregated Aggregated 25 27 23 22 24
- 我必须对每个级别进行迭代,并根据此字典找到每个级别与相应级别的聚合的比率:
columns_to_work = {'97E03K': '97E03K', '90KFTO': '97E03K', 'FXRDW9': '97E03K', '1I4OX9': '1I4OX9', 'N6HO97': '97E03K'}
在这里,对于每个键,我会找到它的值 wrt 与同一值在同一日期的聚合级别的比率,并将列名替换为 key+'_rank'。
例如。对于键 90KFTO,当前级别的值 97E03K 必须除以同一时间点的聚合的 97E03K 列。并且这个比率以密钥的名称存储为90KFTO_rank。
同样,我正在为每个级别查找并将每个级别附加到一个列表中,我最终将其连接以获得一个包含所有输入级别的'_rank' 列的平面数据框
4) 最终输出数据看起来像这样(聚合数据的比率):
Time level value 97E03K_rank 90KFTO_rank FXRDW9_rank 1I4OX9_rank N6HO97_rank
0 2017-04-01 State NY 0.555556 0.555556 0.555556 0.633333 0.555556
1 2017-05-01 State NY 0.407407 0.407407 0.407407 0.727273 0.407407
2 2017-06-01 State NY 0.629630 0.629630 0.629630 0.480000 0.629630
3 2017-04-01 State WDC 0.272727 0.272727 0.272727 0.363636 0.272727
4 2017-05-01 State WDC 0.863636 0.863636 0.863636 0.500000 0.863636
5 2017-06-01 State WDC 0.400000 0.400000 0.400000 0.909091 0.400000
6 2017-04-01 District Downtown 0.074074 0.074074 0.074074 0.100000 0.074074
7 2017-05-01 District Downtown 0.148148 0.148148 0.148148 0.181818 0.148148
8 2017-06-01 District Downtown 0.148148 0.148148 0.148148 0.040000 0.148148
9 2017-04-01 District Central 0.136364 0.136364 0.136364 0.227273 0.136364
10 2017-05-01 District Central 0.181818 0.181818 0.181818 0.181818 0.181818
11 2017-06-01 District Central 0.160000 0.160000 0.160000 0.227273 0.160000
现在这是需要优化的方法:
samp_data=list()
level={}
for l,da in data.items(): #Here l is the key and da is the dataframe
level[l] = da.copy()
lev[l] = pd.DataFrame() #Just a copy to work with
lev[l] = pd.concat([lev[l],level[l][[tim,'level','value']]],sort=False)
for c,d in columns_to_work.items():
level[l] = level[l].join(aggregated_data[[d]], on = tim, rsuffix = '_rank1')
level[l].rename(columns = {d+'_rank1':c+'_rank'}, inplace=True)
level[l][c+'_rank'] = level[l][d]/level[l][c+'_rank']
lev[l] = pd.concat([lev[l],level[l][c+'_rank']],axis=1,sort=False)
samp_data.append(lev[l])
逻辑不清楚的代码说明:
在第一次迭代中,我对字典中存在的所有级别进行迭代,在第二次迭代中,我对列名进行迭代。但是在这里,`columns_to_work 是一个字典,键和值都是我数据框中的列。
我必须计算d 列与我当前级别的聚合数据的比率,并将列名重命名为c+"_rank"。
虽然上述代码适用于小型数据集,但在尝试扩展更大的数据集时却失败了。我正在寻找实现相同目标的优化方法。任何意见/建议将不胜感激:)
附:我尝试使用aggregated_data 作为列表字典来提高性能。但问题是aggregated_data 文件中存在的某些时间点可能不在level 数据中。因此,订单映射变得混乱。
【问题讨论】:
-
您能添加示例数据吗? (输入和期望的输出)
-
请检查更新后的问题。
-
感谢您更新问题。我不明白用于创建
aggregated_data的逻辑。你能添加那个代码吗? -
当然。
aggregated_data已经可用..我没有创建它。 -
tim == 'Time'?
标签: python-3.x pandas loops dictionary optimization