最近在用pandas做一个机器学习的项目,训练集大概2G。我用的dataFrame来操作数据,对训练集做了一次groupby和mean的操作,速度还挺快的,但把得到的结果赋值给用户参数(也是一个dataframe表)的时候,速度缺特别慢,请问这是什么原因呢?
训练集大概有7000多万行,做groupby和mean操作大概十几分钟也就完成了,但赋值操作缺超级慢,每秒钟大概只能赋值50条左右,差距太大了。其中赋值语句大概是这样操作的:
dataframeA.loc[user,'']=dataframeB.loc[user,'']。两张dataFrame表都很大,都是百万级的,不知道是不是和量级较大有关,但千万级的训练集做groupby也没什么压力啊,而且这个机器学习项目,会经常使用和修改表中的参数,如果都这么慢的话,可能就无法正常使用了,哪位大神有什么好的解释或者建议吗?非常感谢了。部分代码如下,有什么细节没有说清楚的话可以问我,我再详细解释下。
def get_average_rating(self):
self.u = log_train['Result'].mean()
print 'u is ',self.u
i,j = 0,0
user_mean_rate = log_train.groupby('UserId').agg({'Result':np.mean})
item_mean_rate = log_train.groupby('ItemId').agg({'Result':np.mean})
#计算bias
print 'calc bias start'
start_time = time.time()
for user in train_users:
i += 1
if i%2000==0:
print '2000 used time',time.time()-start_time
start_time = time.time()
self.user_params.loc[user,'bias'] = user_mean_rate.loc[user,'Result']-self.u
for item in train_items:
self.item_params.loc[item,'bias'] = item_mean_rate.loc[item,'Result']-self.u
print 'bias total used time',time.time()-start_time
Panda mempunyai penjana df.iterrows() untuk menggelung melalui baris DataFrame, yang merupakan yang paling cekap.
Untuk butiran, sila lihat dokumentasi:
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.iterrows.html
Saya tidak pernah melakukan apa-apa magnitud ini, tetapi pengalaman saya adalah yang terbaik untuk tidak mengendalikan df satu demi satu Ia pada dasarnya perlahan, dan keseluruhan operasi lajur adalah lebih pantas
1 (tambah)
Sebaik-baiknya tulis semua nilai baharu dalam df kosong, dan kemudian gabungkan
, tetapi kadangkala tidak dapat dielakkan untuk ditambahkan secara langsung
2. Ia lebih pantas untuk dipadamkan dan gunakan pernyataan del secara langsung
3 .Menukar
juga menerima pakai idea menggabungkan, menimpa nilai asal
Saya tidak fikir tugasan itu lambat
self.user_params.loc[user,'bias'] adalah bersamaan dengan mengambil indeks peringkat kedua daripada indeks peringkat pertama, yang sepatutnya sangat perlahan
Bolehkah anda meletakkan item dan pengguna Bagaimana pula dengan membahagikannya kepada dua bingkai data?
loc adalah yang paling perlahan. Cuba gunakan ix sebaliknya. Lebih baik menggunakan iterrow untuk membina gelung.