Python kaggle数据事务分析
kaggle数据事务分析部分答案 据我所知,您已经有了一个列Python kaggle数据事务分析,python,pandas,dataframe,data-analysis,Python,Pandas,Dataframe,Data Analysis,kaggle数据事务分析部分答案 据我所知,您已经有了一个列每日时间和一个列项目 因此,假设具有相同列的虚拟数据帧: In[]: df = pd.DataFrame({'Time_Of_Day': ['breakfast', 'breakfast', 'breakfast', 'lunch', 'lunch', 'lunch'], 'item': ['coffee', 'coffee', 'bread', 'pastry', 'pastry', 'coffee']}) In[]: df Out[
每日时间
和一个列项目
因此,假设具有相同列的虚拟数据帧:
In[]: df = pd.DataFrame({'Time_Of_Day': ['breakfast', 'breakfast', 'breakfast', 'lunch', 'lunch', 'lunch'], 'item': ['coffee', 'coffee', 'bread', 'pastry', 'pastry', 'coffee']})
In[]: df
Out[]:
Time_Of_Day item
0 breakfast coffee
1 breakfast coffee
2 breakfast bread
3 lunch pastry
4 lunch pastry
5 lunch coffee
在这种情况下,groupby会让您非常接近:
In[]: counts = df.groupby(['Time_Of_Day', 'item']).size()
In[]: counts
Out[]:
Time_Of_Day item
breakfast bread 1
coffee 2
lunch coffee 1
pastry 2
dtype: int64
现在您有了一个层次索引。您可以通过以下方式获得早餐时出售的面包数量:
In[]: counts['breakfast']['bread']
Out[]: 1
您现在可以找到早餐期间售出的前10种商品,例如:
In[]: counts['breakfast'].sort_values(ascending=False)
Out[]:
item
coffee 2
bread 1
Name: count, dtype: int64
但更有趣的是,您可以使用pandasrank
函数计算一天中每个计数的排名:
In[]: output = pd.DataFrame({'counts': counts})
In[]: output.reset_index(inplace=True)
In[]: output['rank'] = output.groupby('Time_Of_Day')['counts'].rank(method='first')
In[]: output
Out[]:
Time_Of_Day item counts rank
0 breakfast bread 1 1.0
1 breakfast coffee 2 2.0
2 lunch coffee 1 1.0
3 lunch pastry 2 2.0
rank
列现在为您提供一天中同一时间内项目的位置。所以在这里,面包
在早餐
(排名第一)期间销售最多,咖啡
在午餐
期间销售最多
您可以按排名进行排序,以获得最畅销的商品:
In[]: output.sort_values(by='rank')
Out[]:
Time_Of_Day item counts rank
0 breakfast bread 1 1.0
2 lunch coffee 1 1.0
1 breakfast coffee 2 2.0
3 lunch pastry 2 2.0
如前所述,这是一个部分答案。我无法将其完全转换为您要求的格式。它需要一些数据帧索引的技巧。但我希望这已经有所帮助。首先,请注意,您定义的时间范围并不涵盖整个域。其次,这里有一种方法可以做到这一点,而无需触及
pandas
,也无需将整个底层数据存储在内存中。根据口味调整输出的格式
导入heapq
导入系统
销售额={}
类别销售:
@静力学方法
定义每天的时间(tm):
hr=int(tm.split(“:”)[0])
如果hr在范围(6,11)内:
返回“早餐”
如果hr在范围(11,15)内:
返回“午餐”
如果hr在范围(15,20)内:
返回“晚餐”
返回“麦奇”
定义初始化(自身,行):
dt,tm,txn,item=line.rstrip().split(“,”)
self.dt=dt
self.tm=tm
self.txn=txn
self.item=item.lower()
self.time\u of_day=Sale.time\u of_day(self.tm)
def可跳过(项目):
返回(项目=='adjustment')或(项目=='none')
def加载单元销售(fh):
#箕斗式掘进机
fh.readline()
销售额={
“早餐”:{},
“午餐”:{},
‘晚餐’:{},
“麦奇”:{},
}
对于fh中的线路:
销售=销售(行)
如果可跳过(销售项目):
持续
项目=销售。项目
tod=每天的销售时间
销售[tod][item]=销售[tod]。获取(item,0)+1
退货
def main():
销售=加载\销售(系统标准)
sep=“==================================”
对于销售中的tod:
top10=heapq.nlargest(10,销售[tod].items(),key=lambda x:x[1])
打印(tod)
印刷(九月)
打印(“\n”.join(列表(映射(lambda x::\t).join([x[0],str(x[1])),top10)))
打印(sep,“\n\n”)
main()
样本输出:
breakfast
====================
coffee: 1615
bread: 1081
pastry: 453
medialuna: 294
tea: 280
toast: 149
hot chocolate: 141
farm house: 132
cake: 131
cookies: 128
====================
lunch
====================
coffee: 2929
bread: 1683
tea: 773
sandwich: 620
cake: 566
pastry: 345
soup: 281
hot chocolate: 266
cookies: 255
medialuna: 247
====================
dinner
====================
coffee: 926
bread: 560
tea: 382
cake: 328
hot chocolate: 181
cookies: 157
alfajores: 128
sandwich: 109
brownie: 99
juice: 84
====================
munchies
====================
postcard: 7
vegan feast: 7
tshirt: 5
pintxos: 4
hot chocolate: 2
valentine's card: 2
dulce de leche: 1
fudge: 1
vegan mincepie: 1
coke: 1
====================
是的,为了获得所需的输出格式,当每个具有相同索引的组排名为0~9时,可能会使用set_index、unstack和swaplevel。非常感谢您的关注和帮助,先生。我想显示我已经添加了我编写的代码,如表中所示。好的,一旦您获得了所需的信息,您可以按任何方式打印它。但是,我要注意的是,您的显示器显示前10名中的“无”项,并将整数显示为浮点数。