1.数据分析能干什么
商场根据数据,采购商品;根据数据来预测比赛;根据数据来预测哪种物质能制成有效药物;推送新闻;恋爱匹配;发布研究论文…
2.数据分析过程
- 提出想要解决的问题
- 采集相关数据,研究数据
- 数据探索,找出数据模式
- 对结果进行总结或者预测
- 分享、讨论
2.1采集数据方法
下载数据、从网页中抓取、访问一些数据api,最后组合各种方式的数据
读取csv文档,
方法:1
import unicodecsv
with open(filename, 'rb') as f:
reader = unicodecsv.DictReader(f)
file_list = list(reader)
方法:2
import pandas as pd
file_list = pd.read_csv('filename')
2.2 numpy数组
一维数据结构:pandas是series类型,numpy是array类型
- numpy数组和python的list类似,可以a[0]这种访问,可以切片访问,可以for in循环;多维numpy数组和python中列表中的列表类似。
- 不同在于,numpy数组定义必须使用np.array([1,2,3]),而列表就直接[1,2,3]。
- numpy数组内部数据类型相同,而list内部可以包含多种类型;numpy数组可以使用mean()、medium()、max()、sum()、argmax()等统计函数.比如:数组.max() 取得最大值;数组.argmax() 取得最大值所在的index索引值。
- numpy可以使用数组.shape 、数组.ndim 、数组.dtype 、数组.itemsize ,这些属性来获得数组的维度、维数、类型、元素字节。
- numpy支持向量+、-、*、/、**、运算。[1,2,3]+[1,2,3],列表和列表相加,得到[1,2,3,1,2,3]。numpy中,([1,2,3])+([1,2,3]),得到([2,4,6])。
- numpy数组还可以支持布尔值向量的and、or、not,对应运算符号:& | ~ 。以及大小比较。
- numpy数组,在使用+=,和=的时候不一样,如果a=b=np.array()。a+=运算之后,b的值也会改变。当a作切片之后,改变切片的值,也会改变原来的数组,比如a=np.array([1,2,3,4,5,6]),slice = a[0:3],slice[0] = 5,那么a也被改变。
2.3 pandas类型
- 和numpy数组相比,pandas更加强大。定义时,使用pd.Series(),定义后print输出可以发现,比numpy数组多了索引值,如同列表和字典的合集。可以在定义的时候,pd.Series([1,1,2,g],index=[a,b,c,d]),指定索引值。
- pandas的series类型,进行索引时,使用loc(),iloc()
- pandas的向量相加,相同索引的相加,找不到索引的,结果用NaN代替。可以使用dropna()方法将NaN的结果删除掉。也可以使用,s1.add(s2, fill_value=0).
- pandas中额apply(函数名),可以代替一些循环调用函数;自动将series中的每一项去调用这个函数
2.4 numpy 分析二维数组
- numpy定义二位数组,可以使用a[0][:],a[:][0],a.sum(),a.sum(axis=0)计算列的和,返回一个一维数组;axis=1,计算行的和。
a = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
2.5 pandas分析二维数组
- 和numpy不同的是,numpy二维数组的每一列行的数据类型都必须一样,当出现字符串和数字时,就需要pandas的dataframe表格框。每一列的类型相同。
- dataframe和series类似,每一行都有个索引,每一列还有个名称。可以整体计算平均值,自动忽略无法计算的列。也可以用axis单独计算每一列的,但是行的类型不同,不适用。
- 定义类似为:
ridership_df = pd.DataFrame(
data=[[ 0, 0, 2, 5, 0],
[1478, 3877, 3674, 2328, 2539],
[1613, 4088, 3991, 6461, 2691],
[1560, 3392, 3826, 4787, 2613],
[1608, 4802, 3932, 4477, 2705],
[1576, 3933, 3909, 4979, 2685],
[ 95, 229, 255, 496, 201],
[ 2, 0, 1, 27, 0],
[1438, 3785, 3589, 4174, 2215],
[1342, 4043, 4009, 4665, 3033]],
index=['05-01-11', '05-02-11', '05-03-11', '05-04-11', '05-05-11',
'05-06-11', '05-07-11', '05-08-11', '05-09-11', '05-10-11'],
columns=['R003', 'R004', 'R005', 'R006', 'R007']
)
print ridership_df,就得到:
R003 R004 R005 R006 R007
05-01-11 0 0 2 5 0
05-02-11 1478 3877 3674 2328 2539
05-03-11 1613 4088 3991 6461 2691
05-04-11 1560 3392 3826 4787 2613
05-05-11 1608 4802 3932 4477 2705
05-06-11 1576 3933 3909 4979 2685
05-07-11 95 229 255 496 201
05-08-11 2 0 1 27 0
05-09-11 1438 3785 3589 4174 2215
05-10-11 1342 4043 4009 4665 3033
- 获取二维数组的值,ridership_df[‘R003’],获取这一列,ridership_df.loc[‘05-05-11’]获取行,print ridership_df.iloc[0]获取行,当觉得index太长,ridership_df.loc[‘05-05-11’]太长,可以用print ridership_df.iloc[0]获取行号,没有index,会默认给一组的,这里也可以这样用。
- 可以使用.describe()函数,获取统计信息的描述。df.values变回numpy数组,可以使用df.values.max(),求取最大值
- 没有内置函数时,使用.applymap(),对每一个元素使用。
- dataframe,也有apply函数,单独每列调用。比如,df.apply(np.max),使用apply将numpy的max函数传过去,获取df每一列的最大值,返回一个一维的数组。
- dataframe的group函数,merge合并函数。matpoltlib画图