相关疑难解决方法(0)

Matrix上的Python PCA太大而无法融入内存

我有一个100,000行×27,000列的csv,我试图在PCA上生成100,000行X 300列矩阵.csv大9GB.这是我正在做的事情:

from sklearn.decomposition import PCA as RandomizedPCA
import csv
import sys
import numpy as np
import pandas as pd

dataset = sys.argv[1]
X = pd.DataFrame.from_csv(dataset)
Y = X.pop("Y_Level")
X = (X - X.mean()) / (X.max() - X.min())
Y = list(Y)
dimensions = 300
sklearn_pca = RandomizedPCA(n_components=dimensions)
X_final = sklearn_pca.fit_transform(X)
Run Code Online (Sandbox Code Playgroud)

当我运行上面的代码时,我的程序在执行.from_csv步骤时被杀死.我已经能够通过将csv分成10,000组来解决这个问题; 逐个读取它们,然后调用pd.concat.这允许我在被杀之前进入标准化步骤(X-X.mean()).... 我的数据对我的macbook空间来说太大了吗?或者有更好的方法来做到这一点.我真的很想将我拥有的所有数据用于我的机器学习应用程序.


如果我想按照下面的答案建议使用增量PCA,我会这样做吗?:

from sklearn.decomposition import IncrementalPCA
import csv
import sys
import numpy as np
import pandas as pd

dataset = sys.argv[1]
chunksize_ = 10000
#total_size is 100000
dimensions …
Run Code Online (Sandbox Code Playgroud)

python machine-learning pca pandas scikit-learn

7
推荐指数
1
解决办法
3425
查看次数

处理点击流以在Pandas中创建功能的最佳方式

我正在使用点击流处理数据框,并且我在点击流中为每个用户提取要在机器学习项目中使用的功能.

数据框是这样的:

data = pd.DataFrame({'id':['A01','B01','A01','C01','A01','B01','A01'],
                     'event':['search','search','buy','home','cancel','home','search'],
                     'date':['2018-01-01','2018-01-01','2018-01-02','2018-01-03','2018-01-04','2018-01-04','2018-01-06'],
                     'product':['tablet','dvd','tablet','tablet','tablet','book','book'],
                     'price': [103,2,203,103,203,21,21]})
data['date'] = pd.to_datetime(data['date'])
Run Code Online (Sandbox Code Playgroud)

因为我必须为每个用户创建功能,所以我使用groupby/apply使用自定义函数,例如:

featurized = data.groupby('id').apply(featurize)
Run Code Online (Sandbox Code Playgroud)

创建用户功能将占用数据帧的一大块并创建许多(数百个)功能.整个过程太慢了,所以我正在寻找一个更有效地做到这一点的建议.

用于创建功能的函数示例:

def featurize(group):
    features = dict()

    # Userid
    features['id'] = group['id'].max()
    # Feature 1: Number of search events
    features['number_of_search_events'] = (group['event']=='search').sum()
    # Feature 2: Number of tablets
    features['number_of_tablets'] = (group['product']=='tablet').sum()
    # Feature 3: Total time
    features['total_time'] = (group['date'].max() - group['date'].min()) / np.timedelta64(1,'D')
    # Feature 4: Total number of events
    features['events'] = len(group)
    # Histogram of products examined
    product_counts = group['product'].value_counts()
    # Feature …
Run Code Online (Sandbox Code Playgroud)

python pandas

7
推荐指数
1
解决办法
266
查看次数

为什么numpy narray从文件中读取消耗如此多的内存?

该文件包含2000000行:每行包含208列,以逗号分隔,如下所示:

0.0863314058048,0.0208767447842,0.03358010485,0.0,1.0,0.0,0.314285714286,0.336293217457,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0

该程序将这个文件读成一个numpy叙述,我预计它将消耗大约(2000000 * 208 * 8B) = 3.2GB内存.但是,当程序读取此文件时,我发现该程序消耗大约20GB的内存.

我很困惑为什么我的程序会消耗如此多的内存而不符合预期?

python arrays file-io numpy

6
推荐指数
1
解决办法
369
查看次数

蟒蛇.大熊猫.大数据.凌乱的TSV文件.如何纠缠数据?

所以.我们有一个混乱的数据存储在我需要分析的TSV文件中.这是它的外观

status=200  protocol=http   region_name=Podolsk datetime=2016-03-10 15:51:58    user_ip=0.120.81.243    user_agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36    user_id=7885299833141807155 user_vhost=tindex.ru    method=GET  page=/search/
Run Code Online (Sandbox Code Playgroud)

问题是一些行具有不同的列顺序/其中一些缺少值,我需要摆脱高性能(因为我正在使用的数据集高达100千兆字节).

Data = pd.read_table('data/data.tsv', sep='\t+',header=None,names=['status', 'protocol',\
                                                     'region_name', 'datetime',\
                                                     'user_ip', 'user_agent',\
                                                     'user_id', 'user_vhost',\
                                                     'method', 'page'], engine='python')
Clean_Data = (Data.dropna()).reset_index(drop=True)
Run Code Online (Sandbox Code Playgroud)

现在我摆脱了缺失值,但仍然存在一个问题!这是数据的外观: 在此输入图像描述

这就是问题的出现: 在此输入图像描述

正如您所看到的,一些列是偏移的.我做了一个非常低性能的解决方案

ids = Clean_Data.index.tolist()
for column in Clean_Data.columns:
    for row, i in zip(Clean_Data[column], ids):
        if np.logical_not(str(column) in row):
            Clean_Data.drop([i], inplace=True)
            ids.remove(i)
Run Code Online (Sandbox Code Playgroud)

所以现在数据看起来不错......至少我可以使用它! 但是我上面提到的方法的高性能替代方案是什么?

更新unutbu代码:traceback错误

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-52c9d76f9744> in <module>() …
Run Code Online (Sandbox Code Playgroud)

python numpy data-analysis bigdata pandas

6
推荐指数
1
解决办法
884
查看次数

如何在特定模式的pandas/python中加载大于10gb的json文件

我有一个json11gb 的文件,我无法在熊猫中加载它.(来源:http://jmcauley.ucsd.edu/data/amazon/)上述链接中的元数据是我正在使用的文件.

元数据:元数据包括描述,价格,销售排名,品牌信息和共同购买链接:

它有以下模式 -

{ "asin": "0000031852", "title": "Girls Ballet Tutu Zebra Hot Pink", "price": 3.17, "imUrl": "http://ecx.images-amazon.com/images/I/51fAmVkTbyL._SY300_.jpg", "related": { "also_bought": ["B00JHONN1S", "B002BZX8Z6", "B00D2K1M3O", "0000031909", "B00613WDTQ", "B00D0WDS9A", "B00D0GCI8S", "0000031895", "B003AVKOP2", "B003AVEU6G", "B003IEDM9Q", "B002R0FA24", "B00D23MC6W", "B00D2K0PA0", "B00538F5OK", "B00CEV86I6", "B002R0FABA", "B00D10CLVW", "B003AVNY6I", "B002GZGI4E", "B001T9NUFS", "B002R0F7FE", "B00E1YRI4C", "B008UBQZKU", "B00D103F8U", "B007R2RM8W"], "also_viewed": ["B002BZX8Z6", "B00JHONN1S", "B008F0SU0Y", "B00D23MC6W", "B00AFDOPDA", "B00E1YRI4C", "B002GZGI4E", "B003AVKOP2", "B00D9C1WBM", "B00CEV8366", "B00CEUX0D8", "B0079ME3KU", "B00CEUWY8K", "B004FOEEHC", "0000031895", "B00BC4GY9Y", "B003XRKA7A", "B00K18LKX2", "B00EM7KAG6", "B00AMQ17JA", "B00D9C32NI", "B002C3Y6WG", "B00JLL4L5Y", "B003AVNY6I", "B008UBQZKU", …
Run Code Online (Sandbox Code Playgroud)

python bigdata pandas

6
推荐指数
1
解决办法
1098
查看次数

处理非常大的数组 - Numpy

我的情况是这样的:

  1. 我有大约 7000 万个整数值分布在大约 10 个数据类别的各个文件中(确切数量未知)

  2. 我读取了这几个文件,并用这些数据创建了一些 python 对象。这显然包括逐行读取每个文件并附加到 python 对象。因此,我将拥有一个包含 7000 万个子数组的数组,每个子数组有 10 个值。

  3. 我对这些数据做了一些统计处理。这将涉及将几个值(例如,百分位数排名)附加到数据的每“行”。

  4. 我将此对象存储在数据库中

现在我从未处理过这种规模的数据。我的第一反应是使用 Numpy 来提高内存数组的效率。但后来我听说在 Numpy 数组中,不鼓励使用“追加”,因为它效率不高。

那么你建议我选择什么?处理这种大小的数据有什么一般技巧吗?如果需要,我可以通过随机抽样将数据大小减少到 20%。

编辑:为了清楚地了解数据的大小和类型而进行编辑。

python numpy

5
推荐指数
1
解决办法
3938
查看次数

如何对大字典进行排序

我有一个使用大型(~14gb)文本文件的 python 脚本。我最终得到了一个键和值字典,但是当我尝试按值对字典进行排序时出现内存错误。

我知道字典太大而无法加载到内存中然后进行排序,但是我怎么能做到这一点呢?

python

5
推荐指数
1
解决办法
1066
查看次数

查找每行具有前3个最大值的列名称

例如,数据如下所示:

df={'a1':[5,6,3,2,5],'a2':[23,43,56,2,6], 'a3':[4,2,3,6,7], 'a4':[1,2,1,3,2],'a5':[4,98,23,5,7],'a6':[5,43,3,2,5]}
x=pd.DataFrame(df)
Out[260]: 
    a1  a2  a3  a4  a5  a6
0   5  23   4   1   4   5
1   6  43   2   2   98   43
2   3  56   3   1  23   3
3   2   2   6   3   5   2
4   5   6   7   2   7   5
Run Code Online (Sandbox Code Playgroud)

我需要结果看起来像:

top1 top2 top3
a2   a1   a6
a5   a2   a6
....
Run Code Online (Sandbox Code Playgroud)

我已经看到了建议idxmax的先前问题的答案(见下文)。但是如何处理前n个值(n> 1)?

查找具有每一行最大值的列名

更新:

我发现答案非常有用,但唯一的问题是我的数据很长,因此必须找出一种绕过该问题的方法。我最终将数据保存到一个csv文件中,然后分块读取。这是我使用的代码:

data = pd.read_csv('xxx.csv', chunksize=1000)
rslt = pd.DataFrame(np.zeros((0,3)), columns=['top1','top2','top3'])
for chunk in data:
    x=pd.DataFrame(chunk).T
    for i in x.columns: …
Run Code Online (Sandbox Code Playgroud)

python

5
推荐指数
2
解决办法
2089
查看次数

如何在 Python 数据帧中分块读取数据?

我想将文件 f 分块读取到数据帧中。这是我使用的代码的一部分。

for i in range(0, maxline, chunksize):
df = pandas.read_csv(f,sep=',', nrows=chunksize, skiprows=i)
df.to_sql(member, engine, if_exists='append',index= False, index_label=None, chunksize=chunksize)
Run Code Online (Sandbox Code Playgroud)

我收到错误:

pandas.io.common.EmptyDataError:没有要从文件中解析的列

该代码仅在 chunksize >= maxline(即文件 f 中的总行数)时有效。但是,就我而言,chunksize<=maxline。

请建议修复。

python csv chunks dataframe pandas

5
推荐指数
1
解决办法
8393
查看次数

选择 pandas 数据帧的 160 万行

我有一个包含约 230 万行的 csv 文件。我想保存数据帧内两列中具有非 nan 值的行的子集(~1.6M)。我想继续使用 pandas 来做到这一点。现在,我的代码如下所示:

import pandas as pd
catalog = pd.read_csv('catalog.txt')
slim_list = []
for i in range(len(catalog)):
    if (pd.isna(catalog['z'][i]) == False and pd.isna(catalog['B'][i]) == False):
        slim_list.append(i)
Run Code Online (Sandbox Code Playgroud)

catalog它保存具有非 nan 值的行。然后我用这些行作为条目创建一个新目录

slim_catalog = pd.DataFrame(columns = catalog.columns)
for j in range(len(slim_list)):
    data = (catalog.iloc[j]).to_dict()
    slim_catalog = slim_catalog.append(data, ignore_index = True)
pd.to_csv('slim_catalog.csv')
Run Code Online (Sandbox Code Playgroud)

原则上这应该可行。通过将每一行读入字典中,速度会加快一些。然而,执行所有 230 万行的时间太长了。有什么更好的方法来解决这个问题?

python dataframe pandas

5
推荐指数
1
解决办法
315
查看次数