读取csv文件
数据分析的第一步是要利用程序读取csv文件:
例子1:
import csv
with open('a.csv') as csvfile:
mpg = list(csv.DictReader(csvfile))
mpg[:3]
例子2:
ds_file = "/home"
with open(ds_file, 'w') as csvfile:
fout = csv.writer(csvfile, delimiter='|')
for airport in airports:
fout.writerow(airport)
Pandas
Panda库是处理dataframe的强有力工具, 我们可以处理两种类型的数据:
- Series: one-dimensional, 一维数据
values = pd.Series(data, index=idx)
series = pd.Series(range(5), index=['a','b','c','d','e'])
- DataFrame: two-dimensional,二维数据
dt = {
'A': [0,2,3,45],
'B': [1,2,3,4]
}
df = pd.DataFrame(dt, index=list('qwert'))
df.head() #查看头部几行数据
df.tail(2) # 查看尾部2行数据
df.describe() #查看统计数据
df.columns # 查看所有列名
对于数据中有一些空数据,可以使用以下这些方法进行处理:
df.dropna()
df.dropna(axis=1)
df.fillna(0)
df.fillna(df.mean())
另外,更加高级的一些数据处理操作:
Numpy
NumPy(Numerical Python) 是Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。它也是数据分析中常用的一个库。
基础操作
最基础的操作就是数据的加减乘除,都可以给予数组的形式进行:
a = np.array([1,2,3,4])
b = np.array([2,3,4,5])
a + b
a / b
a-b
a > b
a*b
A.dot(B)
np.dot(A, B)
a *= 3
另外,可以使用统计方法获取数组的统计信息:
ages.sum()
ages.min()
ages.max()
ages.sum(axis=0)
切片和高级索引
数据的切片和其他Python数据结构类似:
a[2] # 获取第二个
a[-2] # 获取倒数第二个
a[2:7] # 从索引 2 开始到索引 7 停止
a[:11:2] # 从最开头到索引11停止,间隔为2
a[::-1] # 获得反转的数据结构
numpy中提供了多种分割数组的方式:
np.split(x, 3) # 通用函数,将一个数组分割成多个子数组
np.split(x, [4,7])
np.hsplit(y, 2) # 按列分割
np.vsplit(y, 2) # 按行分割
数学函数
numpy库还提供了很多数学函数操作:
angels = np.array([0, 30, 45])
np.radians(angles) # 角度计算
np.cos(angels_radians) # cos
np.degrees(inv)
np.mean()
np.median()
np.genfromtxt('data/s.csv', delimiter=',')
np.std()
np.var()
数组变形
另外,可以借助以下这些方法实现数组的翻转,变换等操作:
a.ravel() # 展开数组
a.T # 置换数组
a.T.ravel()
a.shape # 返回数组的形状
a.reshape(4,2) # 修改维度
遍历元素
在python程序中有很多种方式可以遍历numpy 生成的数据:
for i in a:
print(i)
for element in students.flatten():
print(element)
for element in students.flatten(order='F'):
print(element)
numpy.*nditer*
方法提供了一种更加灵活的方式访问一个或者多个数组元素。
for i in np.nditer(x):
print(i)
我们可以使用参数order来决定遍历的顺序,order='F'
表示Fortran order,即是列序优先.反之,order='C'
表示行序优先:
for i in np.nditer(x, order = 'F', flags = ['external_loop']):
print(i)
数组的浅拷贝
一般的引用拷贝都是浅拷贝,这也意味着引用数据被修改,原有数据源也会被修改
frunits.view()
深拷贝
fruits = np.array(3)
basket = fruits.copy()
高级数组索引
借助原生操作,我们还能实现更加高级地过滤处理数组:
import numpy as np
a = np.arange(12)**2
indx_1 = [2,6,8]
a[inx_1]
indx+2 = np.array([[2,4],[8,10]])
a[indx_2]
food[row, col]
返回所有非0的数组:
np.count_nonzero(gdp_16[gdp_16 > 1000])
Scipy
SciPy以NumPy为基础,与NumPy一样,SciPy有着稳定,成熟,且应用广泛的数值运算库。要学习相关技术,可以参考其 SciPy官方教程
图片操作
借助scipy,可以基于像素层面处理一些图片数据:
# rgb values r,g,b: 值从0-255
# 灰度值grayscale范围从0到-1
from scipy import ndimage
from scipy import misc
import matplotlib.pyplot as plt
f = misc.face()
f.shape
plt.imshow(f)
plt.show()
其中misc模块中,提供一些基本的图像相关的读写函数,可以轻松读写图像数据。misc模块自带一些灰度图像ascent和彩色的face图,可以供我们学习使用。
可视化
数据的可视化,通常我们会借助matplotlib这个库,如果你使用Jupyter的话,可以使用如下语句开启自动画图功能:
%matplotlib inline
下面是一些简单的例子:
import matplotlib.pyplot as plt
# 1. 画图
fig = plt.figure()
# 2.添加axis
ax = fig.add_subplot()
# 或者使用快速步骤
fig, ax = plt.subplots()
plt.show()
或者画一个子图:
import numpy as np
fig, ax = plt.subplots(figsize=(10,5))
m = -2
b = 5
x = np.linspace(0, 10)
y = m * x + b
# 把数据带上
ax.plot(x, y)
plt.show()
我们还可以在图片上添加文本信息:
ax.set_xlabel("X Axis")
ax.set_ylabel("Y Axis")
ax.set_title("Test Title")
控制显示范围:
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
控制数轴上显示的数字逻辑:
ax.set_xticks(np.arange(0, 15, 5))
ax.set_yticks(np.arange(-15, 10, 5))
如果需要画多条线的话,可以参考如下例子:
x1 = np.linspace(0, 10)
y1 = m * x1 + b
x2 = x1
y2 = -1 * y1
ax.plot(x1, y1)
ax.plot(x2, y2)
*参考资料*
共同学习,写下你的评论
评论加载中...
作者其他优质文章