numpy

数组中的轴:

99-1.jpg
99-1.jpg

其实很好理解,越外面循环的 axis 值越小。

一些值得注意的特性:

import numpy as np

t = np.arange(24, dtype=float).reshape(4, 6)

t[2, 4] = np.nan
t[3, 4] = np.nan

print(t)
print(np.count_nonzero(t))
print(np.nan == np.nan)
print(t!=t)
print(np.count_nonzero(t != t))

# 将 nan 换成 0
# t[np.isnan(t)] = 0
t[t!=t] = 0
print(t)

'''
[[ 0.  1.  2.  3.  4.  5.]
 [ 6.  7.  8.  9. 10. 11.]
 [12. 13. 14. 15. nan 17.]
 [18. 19. 20. 21. nan 23.]]
23
False
[[False False False False False False]
 [False False False False False False]
 [False False False False  True False]
 [False False False False  True False]]
2
[[ 0.  1.  2.  3.  4.  5.]
 [ 6.  7.  8.  9. 10. 11.]
 [12. 13. 14. 15.  0. 17.]
 [18. 19. 20. 21.  0. 23.]]
'''

改变多维数组的形状(具体细节谷歌搜索):

np.swapaxes()  # 可用作二维矩阵的转置
np.rollaxis()

一个常用的数据集网站: https://www.kaggle.com/

一个英国和美国 youtube 一千多个视频的点击、喜欢、不喜欢、评论数量的 csv : https://www.kaggle.com/datasets/datasnaek/youtube/data

numpy 读取数据 np.loadtxt(),需要关注的参数:

  • dtype
  • delimiter, 分隔符
  • skiprows, 跳过行
  • usecols, 读取指定的列、索引、元组类型
  • unpack

Pandas

numpy 能够处理数值型数据,但是很多时候,除了数值之外,还有字符串、时间序列等。

Pandas 可以处理 CSV 和文本文件、Microsoft Excel、SQL 数据库和快速 HDF 5 等格式。

Series

Pandas 两个主要的数据结构: Series 和 DataFrame .

Series 是一种类似于一维数组的对象,由一组数据(各种 NumPy 数据类型)及一组与之对应的索引(数据标签)组成。

import pandas as pd

ser_obj = pd.Series(range(10, 20))
print(ser_obj)
print('-' * 50)

# 获取数据
print(ser_obj.values)

# 获取索引
print(ser_obj.index)
print(ser_obj.dtype)

print('-' * 50)

# 一些简单的计算,和 numpy 类似
print(ser_obj * 2)
print(ser_obj > 15)

'''
0    10
1    11
2    12
3    13
4    14
5    15
6    16
7    17
8    18
9    19
dtype: int64
--------------------------------------------------
[10 11 12 13 14 15 16 17 18 19]
RangeIndex(start=0, stop=10, step=1)
int64
--------------------------------------------------
0    20
1    22
2    24
3    26
4    28
5    30
6    32
7    34
8    36
9    38
dtype: int64
0    False
1    False
2    False
3    False
4    False
5    False
6     True
7     True
8     True
9     True
dtype: bool
'''

字典也可以转换为 series, 且 key 和 value 分别对应。

索引建议用 loc, 效率更高。

DataFrame

类似于 excel.

较为灵活的日期功能:

import pandas as pd
import numpy as np

dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))

print(df)

'''
                   A         B         C         D
2013-01-01  0.056948  0.748347  0.158512  1.969863
2013-01-02  0.546564  0.625012 -0.331042 -0.343768
2013-01-03  1.013044  1.915540  0.895085  0.195473
2013-01-04 -0.848951 -0.155895 -2.426352  0.557494
2013-01-05  0.196745 -1.037885 -0.191365  1.632707
2013-01-06 -0.700018 -1.033878 -0.535214  1.476812
'''

pandas 中使用索引名取某一列:

print(df_obj['A']) # 取出来是 series

DataFrame 也可以方便地增加、删除列:

# just an example
df_obj['G'] = df_obj['D'] + 4
del(df_obj['G'])

常见的 Index 种类:

  • Index, 普通索引,例如 a, b, c, d, e
  • Int64Index, 整数索引
  • MultiIndex, 层级索引
  • DatetimeIndex, 时间戳类型

DataFrame 也可以用 loc 来拿:

# just an example
print(df_obj.loc['a']) # 拿的是 行

# 第一个参数索引行,第二个参数索引列
print(df_obj.loc['a':'c', 'd':'b'])

iloc 位置索引:

# DataFrame, iloc 是左闭右开
df_obj.iloc[0:2, 0:2]

对齐运算

对齐是数据清洗的重要过程,可以按索引对齐进行运算,如果没对齐的位置则补 NaN,最后也可以填充 NaN.

Series 的对齐运算:

import pandas as pd

s1 = pd.Series(range(10, 20), index = range(10))
s2 = pd.Series(range(20, 25), index = range(5))
print('s1+s2: ' )
s3 = s1 + s2
print(s3)
print(s3[6])

print('--'*10)
print(s1.add(s2, fill_value=0))

'''
s1+s2: 
0    30.0
1    32.0
2    34.0
3    36.0
4    38.0
5     NaN
6     NaN
7     NaN
8     NaN
9     NaN
dtype: float64
nan
--------------------
0    30.0
1    32.0
2    34.0
3    36.0
4    38.0
5    15.0
6    16.0
7    17.0
8    18.0
9    19.0
dtype: float64
'''

DataFrame 的对齐运算:

import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.ones((2,2)), columns=['A', 'B'])
df2 = pd.DataFrame(np.ones((3,3)), columns=['A', 'B', 'C'])
print(df1 - df2)
print(df1.sub(df2, fill_value=2))

'''
     A    B   C
0  0.0  0.0 NaN
1  0.0  0.0 NaN
2  NaN  NaN NaN
     A    B    C
0  0.0  0.0  1.0
1  0.0  0.0  1.0
2  1.0  1.0  1.0
'''

函数应用

关注 applyapplymap 相关资料。

通过 apply 将函数(例如 lambda 函数)应用到列或行上。

通过 applymap 将函数应用到每个数据上。

索引排序

排序默认使用升序排序,ascending=False 为降序排序。

import pandas as pd
import numpy as np
s4 = pd.Series(range(10, 15), index = np.random.randint(5, size=5))
print(s4)
# 索引排序
print(s4.sort_index())

'''
3    10
4    11
2    12
3    13
4    14
dtype: int64
2    12
3    10
3    13
4    11
4    14
dtype: int64
'''

上面代码可以简单地拓展到二维的情形。

按值排序

sort_values() .

处理缺失数据

import pandas as pd
import numpy as np

df_data = pd.DataFrame([np.random.randn(3), [1., 2., np.nan],
                       [np.nan, 4., np.nan], [1., 2., 3.]])
print(df_data.head())

print(df_data.isnull())
print(df_data.dropna())
print(df_data.dropna(axis=1))  # 不常用

# 给零列的空值填为 -100
print(df_data.iloc[:,0].fillna(-100.))

'''
         0         1         2
0  0.43007  0.800597 -0.128422
1  1.00000  2.000000       NaN
2      NaN  4.000000       NaN
3  1.00000  2.000000  3.000000
       0      1      2
0  False  False  False
1  False  False   True
2   True  False   True
3  False  False  False
         0         1         2
0  0.43007  0.800597 -0.128422
3  1.00000  2.000000  3.000000
          1
0  0.800597
1  2.000000
2  4.000000
3  2.000000
0      0.43007
1      1.00000
2   -100.00000
3      1.00000
Name: 0, dtype: float64
'''

层级索引(hierarchical indexing)

import pandas as pd
import numpy as np

index1 = pd.MultiIndex.from_arrays([['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
                                    [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]], names=['cloth', 'size'])

ser_obj = pd.Series(np.random.randn(12), index=index1)
print(ser_obj)
print(type(ser_obj))
print(type(ser_obj.index))
print(ser_obj.index)
print(ser_obj.index.levels)

'''
cloth  size
a      0      -0.641816
       1       1.454813
       2      -0.348024
b      0       1.984779
       1      -1.063528
       2       0.136670
c      0       0.707680
       1       1.110020
       2      -0.358702
d      0       1.234463
       1       0.369818
       2      -0.294201
dtype: float64
<class 'pandas.core.series.Series'>
<class 'pandas.core.indexes.multi.MultiIndex'>
MultiIndex([('a', 0),
            ('a', 1),
            ('a', 2),
            ('b', 0),
            ('b', 1),
            ('b', 2),
            ('c', 0),
            ('c', 1),
            ('c', 2),
            ('d', 0),
            ('d', 1),
            ('d', 2)],
           names=['cloth', 'size'])
[['a', 'b', 'c', 'd'], [0, 1, 2]]
'''

层级索引可以交换层级。

unstack 操作:

99-2.png
99-2.png

统计计算和描述

sum, mean, max, min, describe:

99-3.png
99-3.png

describe 可以用于观察数据分布,是否有异常值等。

其他 pandas 的操作

下面将使用 Jupyter Notebook .

在 Debian 12 上安装 ipykernel :

sudo apt update
sudo apt install python3-ipykernel

关于在 vscode 中使用 Jupyter Notebook,选择虚拟环境时可能遇到的问题: https://stackoverflow.com/questions/66869413/visual-studio-code-does-not-detect-virtual-environments

建议使用虚拟环境管理所有数据分析需要的包。

https://github.com/dropsong/ipynb-examples/blob/master/pandas_basic/pandas_basic.ipynb

电商数据分析

一般的数据分析流程:

电商平台数据分析:

淘宝用户行为模式分析