美文网首页
如何将NumPy数组写入CSV文件中

如何将NumPy数组写入CSV文件中

作者: Python_Camp | 来源:发表于2022-05-30 20:29 被阅读0次

在NumPy和Python中处理数组时,我们通常需要将它们转储到各种形式的输出文件中,包括逗号分隔的值(CSV)。

在今天的简短教程中,我们将讨论一些不同的方法,以便将NumPy数组写入此类文件。最后,我们将讨论一种在将NumPy数组写入文件时通常应该避免的方法。

首先,让我们创建一个Numpy数组样本,我们将在这个简短的教程中参考这个样本,以便演示一些概念。

import numpy as np
arr = np.asarray([ 
    [1, 150, 10.5], 
    [2, 220, 3.1], 
    [3, 121, 10.1],
    [4, 300, 3.2], 
    [5, 541, 6.7], 
    [6, 321, 9.9],
])print(arr)
array([[  1. , 150. ,  10.5],
       [  2. , 220. ,   3.1],
       [  3. , 121. ,  10.1], 
       [  4. , 300. ,   3.2],
       [  5. , 541. ,   6.7],
       [  6. , 321. ,   9.9]])
np.savetxt('output.csv', arr, delimiter=',')

使用numpy.savetxt()方法

当我们需要将NumPy数组转储到一个输出文件时,我们的第一个选择是numpy.savetxt()方法,该方法用于将数组保存到一个文本文件。该方法允许人们指定分隔符,在我们的例子中应该是逗号。
np.savetxt('output.csv', arr, delimiter=', ')
注意,输出将使用科学符号,如下图所示。

如果你想避免使用科学符号,那么你可以指定一个适当的fmt。比如说

np.savetxt('output.csv', arr, delimiter=', ', fmt='%f')

使用numpy.tofile()方法

第二个选项是numpy.ndarray.tofile()方法,用于将数组写成文本或二进制文件。再一次,我们可以指定分隔符(sep)和格式。

arr.tofile('output.csv', sep=', ', format='%f')

要避免什么

另一种流行的(但不是很聪明的)方法是首先将NumPy数组转换为pandas DataFrame,然后使用pandas.DataFrame.to_csv()方法,以便将生成的DataFrame写入输出的csv文件中。
然而,请注意,这并不是一个好的做法,因为它将消耗太多的内存--尤其是当你在处理相当大的数组时--完全没有理由。

最后的思考

在今天的简短教程中,我们展示了将NumPy数组写入CSV文件时的几种不同方法。更具体地说,我们讨论了如何使用numpy.savetxt()和numpy.tofile()方法来做到这一点。

最后,我们强调了在将NumPy数组转储到CSV文件的过程中避免涉及pandas的重要性,因为这将在内存方面付出相当大的代价。

import seaborn as sns
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd
from matplotlib.colors import rgb2hex
import matplotlib.cm as cm
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
%matplotlib inline
import scipy.cluster.hierarchy as ch
from scipy.stats import pearsonr# Set style and Color
cmap2 = cm.get_cmap('twilight',13)
colors1= []
for i in range(cmap2.N):
    rgb= cmap2(i)[:4]
    colors1.append(rgb2hex(rgb))
    #print(rgb2hex(rgb))
# Set style
sns.set(style='whitegrid')

df = pd.read_csv('D:/data_science/data_science_project/customer segment/Customer Data.csv',low_memory = False)#Display Customer Data 
df.head()
image.png
# Get more information about your data
df.info()
image.png

Pandas Profiling — Python 中的简单探索性数据分析

PyPiStats.org 下载 Pandas Profiling。
PyPistats 下载 pandas-profiling python 库。

image.png

如何在 Python 中为 EDA 使用 Pandas 分析
安装 Pandas 分析
要安装 Pandas Profiling,您可以使用以下命令:
如果使用画中画:
pip install pandas-profiling
如果使用 Anaconda 的 Conda 包管理器:

conda env create -n pandas-profiling 
conda activate pandas-profiling 
conda install -c conda-forge pandas-profiling

数据集
我们用于本教程的数据集来自澳大利亚政府的国家海上石油管理系统 (NOPIMS)。
澳大利亚 NOPIMS 网站,用于访问澳大利亚近海测井数据
NOPIMS — 澳大利亚测井数据网站。

它包含一系列测井测量结果,这些测量结果由科学仪器获得,用于评估和表征地下的地质和岩石物理性质。
不要担心数据的性质,因为下面描述的技术可以应用于任何数据集。
导入库
第一步是导入我们将要使用的库(Pandas 和 Pandas Profiling),如下所示:

# https://github.com/ydataai/pandas-profiling

import pandas as pd
from pandas_profiling import ProfileReport
df = pd.read_csv('data/NOPIMS_Australia/Ironbank-1.csv', na_values=-999)
report = ProfileReport(df)
report
image.png

加载数据集
接下来我们加载我们将要探索的数据。在这种情况下,我们的数据存储在 csv 文件中,需要使用 pd.read_csv 读取,如下所示:
df = pd.read_csv('data/NOPIMS_Australia/Ironbank-1.csv', na_values=-999)
由于我们的数据包含由 -999 表示的空值/缺失值,我们可以告诉 pandas 将这些值设置为Not a Number (NaN)。
运行 Pandas 分析
为了生成报告,我们首先创建一个名为 report 的变量并分配ProfileReport()给它。在括号内,我们传入数据框,在本例中为df.
然后我们可以调用报告并开始该过程。
报告 = ProfileReport(df)
报告
当我们运行此单元格时,将启动报告流程并分析数据框中的所有数据。
时间长度将取决于数据的大小,较大的数据集将需要更长的时间才能完成。
Pandas 分析 Python 库报告生成
在 Python 中使用 pandas-profiling 生成报告。
图片由作者提供。
了解 Pandas 分析结果
概述
概述部分包含三个选项卡:概述、警告和复制。
概述选项卡提供有关数据集的统计信息,包括变量数(数据框中的列)、观察数(总行数)、缺失值的数量以及百分比、重复的数量以及文件尺寸。

pandas-profiling 报告的概述部分。
图片由作者提供。
警报选项卡用于通知您数据中每个列的任何问题,例如变量之间的相关性、数据偏度、数据分布。

pandas-profiling 报告的警报部分。
图片由作者提供。
变量
在报告的变量部分,我们可以查看数据框中包含的每一列的详细统计信息。这包括有多少缺失值、数据的统计信息(平均值、最小值和最大值)等等。
在每个部分的右侧,我们可以看到数据分布的直方图。这为我们提供了数据的偏度以及分布情况的指示。

pandas-profiling 报告的变量部分。
图片由作者提供。
互动
报告的交互部分允许您将一个变量与另一个变量进行对比,以了解它们之间的关系。

pandas-profiling 报告的交互部分。
图片由作者提供。
相关性
相关部分使我们能够了解两个变量相互关联的程度。在 pandas_profile 报告中,我们可以查看不同的关联方法:
斯皮尔曼的 ρ
皮尔逊
肯德尔 τ
披克 (φk)
如果您不确定每种方法是什么,可以单击“切换关联描述”按钮,它将提供每种方法含义的详细信息。

pandas-profiling 报告的相关部分显示了可用的不同方法。
图片由作者提供。
缺失值
我们还可以很好地了解我们的数据集的完整性。这类似于missingno Python 库提供的功能。
我们可以使用 4 种类型的绘图查看数据:
计数图提供了存在的总值的计数。
矩阵图指示了缺失值在数据框中的位置。
热图为我们提供了变量之间空值如何相关的指示。
树状图是一个树状图,它显示了变量之间有多少空值相关。更接近的组表明无效性的强相关性。

使用 pandas-profiling 报告通过各种视图识别缺失值。
图片由作者提供。
样本
最后,示例部分允许我们查看数据集前 10 行和后 10 行的原始数字。这相当于运行df.head(10)and df.tail(10)。

数据集的前 10 行。
图片由作者提供。

数据集的最后 10 行。
图片由作者提供。
概括
pandas-profiling Python 库是快速分析数据集的绝佳工具,无需花费大量时间使用 pandas 和 matplotlib 来记忆和编写代码。一定要为您的下一个项目检查一下。

一个元类是一个类,其实例是类。就像一个 "普通 "的类定义了该类实例的行为,一个元类定义了类和它们的实例的行为。

元类并不被每个面向对象的编程语言所支持。那些支持元类的编程语言,在实现它们的方式上有很大的不同。Python 正在支持它们。

一些程序员认为Python中的元类是 "等待或寻找问题的解决方案"。

元类的使用情况很多。仅举几个例子。

记录和分析

接口检查

在创建时注册类

自动添加新方法

自动创建属性

代理人

自动锁定/同步资源。

定义元类

基本上,元类的定义就像其他的 Python 类一样,但是它们是继承于 "类型" 的类。另一个区别是,当使用元类的类声明结束时,元类会被自动调用。换句话说。如果在类头的基类之后没有传递 "metaclass "关键字(也可能没有基类),type()(即type的call)将被调用。另一方面,如果使用了一个元类关键字,分配给它的类将被调用,而不是type。

现在我们创建一个非常简单的元类。除了它将在 new 方法中打印它的参数内容,并返回 type.new 调用的结果之外,它一无是处。

def foo(**kwargs):
    return kwargs

print(foo(a=1, b=2, c=3))
What is the type of the object below?
(x*x for x in range(3))

A generator
A list
A tuple
None of the above

print((x*x for x in range(3)))

Gini impurity| 基尼纯度
在我们的案例中,让我们使用基尼Gini不纯度。基尼不纯度越高,叶子就越不纯。所以我们希望这个值越低越好。我们先计算每片叶子的基尼系数,然后再计算分割后的总基尼系数。计算叶子的基尼不纯度的公式是

probablity Yes - No:probality
Gini impurity of leaf = 1 - yes2 - No2

分割的总基尼系数是各叶子的基尼系数的加权平均值。因为左边的叶子里有4个人,右边的叶子里有3个人。

同样,使用上述相同的公式,运动性心绞痛的总基尼不纯度为0.214。


left_leaf,right_leaf = {'Yes':3,'No':1},{'Yes':2,'No':1}
root = {'left':left_leaf,'right':right_leaf}

def Gini_impurity(root):
    ylft,nlft,yrgt,nrgt = 0,0,0,0
    lft,rgt = 0,0
    for key,leaf in root.items():
        if key == 'left':
            for k, v in leaf.items():
                ylft += leaf['Yes']
                nlft += leaf['No']
                lft += v
        elif key == 'right':
            for k, v in leaf.items():
                yrgt += leaf['Yes']
                nrgt += leaf['No']
                rgt += v

    gini_left = 1 - (ylft/(ylft+nlft))**2 - (nlft/(ylft+nlft))**2
    gini_right = 1 - (yrgt / (yrgt + nrgt)) ** 2 - (nrgt / (yrgt + nrgt)) ** 2
    l,r = round(gini_left,3),round(gini_right,3)
    gini_root = round(l * lft/(lft+rgt) + r * rgt/(lft+rgt),3)
    return l,r,gini_root

print(Gini_impurity(root))

# 加权平均 gini_left, gini_right
roots = {}
roots['left'] = Gini_impurity(root)[0]
roots['right'] = Gini_impurity(root)[0]

这些平均年龄将是我们的根节点阈值的候选人。最后,我们计算每个平均年龄的基尼杂质值。例如,计算年龄<39.5的基尼不纯度。

同样,其余的平均年龄分割的基尼系数是。

#age < 39.5
left_leaf,right_leaf = {'Yes':0,'No':1},{'Yes':3,'No':3}
root = {'left':left_leaf,'right':right_leaf}
print('age < 39.5 ',Gini_impurity(root))
image.png

相关文章

网友评论

      本文标题:如何将NumPy数组写入CSV文件中

      本文链接:https://www.haomeiwen.com/subject/spqoprtx.html