Pandas与傅里叶公式应用

Pandas与傅里叶公式应用

# mysql中有没有丢失的数据
# 在mysql中null就是列中的丢失数据
# 在pandas中的丢失数据是NaN
import numpy as np
import pandas as pd
from pandas import Series, DataFrame

在python中有两种

  • np.NaN
  • None
df = DataFrame({'python':[100, 101, np.nan, None], 'java': [110, 120, 119, None]})
df
javapython
0110.0100.0
1120.0101.0
2119.0NaN
3NaNNaN
# 聚合, sum()求和
# NaN在运算的时候并没有干扰正常的计算
df.sum()

# 虽然没有干扰运算,但是降低了计算的效率
  • 输出

    java 349.0
    python 201.0
    dtype: float64

df.sum(axis=1)
  • 输出

    0 210.0
    1 221.0
    2 119.0
    3 0.0
    dtype: float64

# int->float->object->nan
%timeit np.random.randint(0, 10, size=10).sum()
  • 输出
    9.05 µs ± 85.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit np.random.random(10).sum()
  • 输出
    6.83 µs ± 76.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit np.arange(0, 1e6, dtype=np.float32).sum()
  • 输出
    2.76 ms ± 134 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit np.arange(0, 1e6, dtype='object').sum()
  • 输出
    74.5 ms ± 513 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
#python中None的类型本身就是object
#numpy中nan是float

pandas中对于空值的操作

- innull()
- notnull()
- dropna() # 过滤空值
- fillna() # 填充空值

isnull

df
javapython
0110.0100.0
1120.0101.0
2119.0NaN
3NaNNaN
cond = df.isnull()
# 返回Bool值, nan为true
cond
javapython
0FalseFalse
1FalseFalse
2FalseTrue
3FalseTrue
df[cond]
javapython
0NaNNaN
1NaNNaN
2NaNNaN
3NaNNaN

notnull

cond = df.notnull()
cond
javapython
0TrueTrue
1TrueTrue
2TrueFalse
3FalseFalse
df[cond]
javapython
0110.0100.0
1120.0101.0
2119.0NaN
3NaNNaN

any all

cond = df.isnull().any()
cond
# axis = 0 对列进行操作, 有一个值为NaN那么返回true
  • 输出

    java True
    python True
    dtype: bool

cond = df.isnull().any(axis=1)
cond
  • 输出

    0 False
    1 False
    2 True
    3 True
    dtype: bool

df[cond]
javapython
2119.0NaN
3NaNNaN
cond = df.isnull().all(axis=1)
cond

# all条件全部为真, 则返回true
  • 输出

    0 False
    1 False
    2 False
    3 True
    dtype: bool

df[cond]
javapython
3NaNNaN
cond1 = df.notnull().all(axis=1)
cond1
  • 输出

    0 True
    1 True
    2 False
    3 False
    dtype: bool

df[cond1]
javapython
0110.0100.0
1120.0101.0
cond1 = df.notnull().any(axis=1)
cond1
  • 输出

    0 True
    1 True
    2 True
    3 False
    dtype: bool

df[cond1]
javapython
0110.0100.0
1120.0101.0
2119.0NaN

dropna()
过滤NaN

df
javapython
0110.0100.0
1120.0101.0
2119.0NaN
3NaNNaN
df.dropna()

# dropna将有空值的行直接删除了
# 我们在做数据分析的时候不会删除列(一般连数据都不会删除)
# 列不可以被删除,?, 身高一直会变化,可能数据中这个值就是空值,有的人有身高值
# 行相对于列来说不那么重要
javapython
0110.0100.0
1120.0101.0
# how的作用是作为保留级别来使用的
df.dropna(how='all')
javapython
0110.0100.0
1120.0101.0
2119.0NaN

.add()

df1 = DataFrame({'python':[ np.nan, None, 100, 101], 'java': [110, 120, 119, None]})
df1
javapython
0110.0NaN
1120.0NaN
2119.0100.0
3NaN101.0
df.loc[3]['java'] = 0
df
javapython
0110.0100.0
1120.0101.0
2119.0NaN
30.0NaN
df2 = df.add(df1)
df2
javapython
0220.0NaN
1240.0NaN
2238.0NaN
3NaNNaN
df2 = df.add(df1, fill_value=0)
df2
javapython
0220.0100.0
1240.0101.0
2238.0100.0
30.0101.0

fillna() NaN过滤

df4 = df.fillna(value=0)
df4
javapython
0110.0100.0
1120.0101.0
2119.00.0
30.00.0
df1 = df1.fillna(value=0)
df1
javapython
0110.00.0
1120.00.0
2119.0100.0
30.0101.0
df4 + df1
javapython
0220.0100.0
1240.0101.0
2238.0100.0
30.0101.0
# method='ffill' 找前面合法的数据,向后填充,axis=0拿前一行的值向后填充,
# axis=1 拿前一列的值来填充
df4 = df.fillna(method='ffill', axis=0)
df4
df5 = DataFrame({'python': [100, 200, 101, 201], 'java':[300, 100, 400, 500], 'php':[3, 2, None, 0]})
df5

javaphppython
03003.0100
11002.0200
2400NaN101
35000.0201
df5.fillna(method='bfill', axis=1)

# 缺点,如果前后左右任意一方出现无值的情况,可能会报错
javaphppython
0300.03.0100.0
1100.02.0200.0
2400.0101.0101.0
3500.00.0201.0
# 电费
# 2017

我们要清缴 121     2     3     4     5     6     7     8      9     
120   120   100   50    60    65                 100


# 2018 你的数据丢失了
6   70

# 拉格朗日 插值法

傅里叶

import numpy as np
# fft 是傅里叶变换 
# ifft 是反傅里叶变换

from numpy.fft import fft, ifft
from PIL import Image

import matplotlib.pyplot as plt
# 上帝:内在 频率 波
# 人看世界,表象, 时域, 肉眼能识别的 音乐

# 平原 山丘 联想到平原和山丘的关系就是一种波动

# 波 原子-> 波 都是基础的物质
# 引入图片
cat = Image.open('./cat.jpg')
cat

这里写图片描述

# 转换二进制
# uint8 255

cat_data = np.fromstring(cat.tobytes(), np.int8)
C:\Users\Administrator\Anaconda3\lib\site-packages\ipykernel_launcher.py:4: DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs. Use frombuffer instead
  after removing the cwd from sys.path.
cat_data
  • 输出

    array([ -25, -70, -125, …, -68, 95, 62], dtype=int8)

cat_fft = fft(cat_data)

# 将时域转换成频域 傅里叶的变换
cat_fft
  • 输出

    array([-1569123. +0. j,
    -7005918.98362136+12604783.28030717j,
    -2819481.22749804 +8877463.78907501j, …,
    622731.5619853 -2775345.73593521j,
    -2819481.22749811 -8877463.78907499j,
    -7005918.98362145-12604783.28030712j])

# 最好求绝对值
cond = np.abs(cat_fft) < 1e5
# 将这些柔和的频率去除
cat_fft[cond] = 0
# 将频域转换成时域
cat_ifft = ifft(cat_fft)
cat_ifft
  • 输出

    array([-31.23561646+8.34668854e-13j, 39.44677252-4.52878489e-13j,
    -31.5575318 -3.39153475e-13j, …, -17.97882673+8.73942419e-13j,
    56.94689652-2.73174518e-13j, -4.95576222-8.42775705e-13j])

# 必须将虚数部分去除

cat_real = np.real(cat_ifft)
cat_real
  • 输出

    array([-31.23561646, 39.44677252, -31.5575318 , …, -17.97882673,
    56.94689652, -4.95576222])

# jpg, 不需要浮点数
cat_result = np.int8(cat_real)
cat_result
  • 输出

    array([-31, 39, -31, …, -17, 56, -4], dtype=int8)

cat.mode
  • 输出

    ‘RGB’

cat.size
  • 输出
    (730, 456)
c = Image.frombytes(mode='RGB', size=(730, 456), data=cat_result)
c

这里写图片描述

pandas层次化索引

import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt

1. 创建多层行索引

1) 隐式构造

最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组

  • Series也可以创建多层索引
s = Series(np.random.randint(0, 150, size=10), index = list('qwertyuiop'))
s
  • 输出

    q 50
    w 45
    e 14
    r 36
    t 126
    y 63
    u 122
    i 133
    o 48
    p 102
    dtype: int32

s = Series(np.random.randint(0, 150, size=6), index = [['a', 'a', 'b', 'b', 'c', 'c'],['期中', '期末','期中', '期末','期中', '期末',]])
s
  • 输出

    a 期中 113
    期末 105
    b 期中 27
    期末 65
    c 期中 111
    期末 11
    dtype: int32

df = DataFrame(s, columns=['python'])
df
python
a期中113
期末105
b期中27
期末65
c期中111
期末11

DataFrame建立2级列索引

df1 = DataFrame(np.random.randint(0,150, size=(4, 6)),
               index = list('东南西北'),
               columns=[['python', 'python', 'math', 'math', 'en', 'en'], ['期中', '期末','期中', '期末','期中', '期末']])
df1
pythonmathen
期中期末期中期末期中期末
491563237124
0491001053573
西6013483865273
12101101639112

2) 显示构造pd.MultiIndex

  • 使用数组
df2 = DataFrame(np.random.randint(0,150, size=(4, 6)),
               index = list('东南西北'),
               columns=[['python', 'python', 'math', 'math', 'en', 'en'], ['期中', '期末','期中', '期末','期中', '期末']])
d2
  • 使用tuple
df3 = DataFrame(np.random.randint(0,150, size=(4, 6)),
               index = list('东南西北'),
               columns=pd.MultiIndex.from_tuples([('python', '期中'),('python', '期末'),('math', '期中'),('math', '期末'),('en', '期中'),('en', '期末')]))
df3
pythonmathen
期中期末期中期末期中期末
111195112532147
35529781931
西18121256513640
1103413525615
  • 使用product

    最简单,推荐使用

df4 = DataFrame(np.random.randint(0,150, size=(4, 6)),
               index = list('东南西北'),
               columns=pd.MultiIndex.from_product([{'python', 'math', 'en'}, ['期中', '期末']]))
df4
enmathpython
期中期末期中期末期中期末
1281311121645
976012810587140
西12866120556187
1106469646177

============================================

  1. 创建一个DataFrame,表示出张三李四期中期末各科成绩

============================================

2. 多层列索引

除了行索引index,列索引columns也能用同样的方法创建多层索引

df5 = DataFrame(np.random.randint(0,150, size=(8, 12)),
               columns = pd.MultiIndex.from_product([['模拟考', '正式考'], ['数学', '语文', '英语', '物理', '化学', '生物']]),
               index = pd.MultiIndex.from_product([['期中', '期末'], ['雷军', '李斌'], ['测试一', '测试二']]))
df5
模拟考正式考
数学语文英语物理化学生物数学语文英语物理化学生物
期中雷军测试一6447145313116371321341236050
测试二147101251191485176511331488615
李斌测试一311326913410640781033136977
测试二6720871451367138851332811186
期末雷军测试一81441491341091441326749849383
测试二3177732246787214411914412743
李斌测试一90101111134143121249815836633
测试二3037159825833533108412864

3. 多层索引对象的索引与切片操作

1)Series的操作

【重要】对于Series来说,直接中括号[]与使用.loc()完全一样,因此,推荐使用中括号索引和切片。

(1) 索引

s
  • 输出

    a 期中 113
    期末 105
    b 期中 27
    期末 65
    c 期中 111
    期末 11
    dtype: int32

s['a', '期中']
  • 输出

    113

# 取多层的外层索引时,内层索引不可用
s[['a', 'b']]
  • 输出

    a 期中 113
    期末 105
    b 期中 27
    期末 65
    dtype: int32

s.a.期中
  • 输出

    113

s['a'][['期中','期末']]
  • 输出

    期中 113
    期末 105
    dtype: int32

# iloc计算的是最内层的索引
s.iloc[0]
  • 输出

    113

(2) 切片

#iloc计算的事最内层索引
s.iloc[:5]
  • 输出

    a 期中 113
    期末 105
    b 期中 27
    期末 65
    c 期中 111
    dtype: int32

2)DataFrame的操作

(1) 可以直接使用列名称来进行列索引

(2) 使用行索引需要用ix(),loc()等函数

【极其重要】推荐使用loc()函数

注意在对行索引的时候,若一级行索引还有多个,对二级行索引会遇到问题!也就是说,无法直接对二级索引进行索引,必须让二级索引变成一级索引后才能对其进行索引!

df5
模拟考正式考
数学语文英语物理化学生物数学语文英语物理化学生物
期中雷军测试一6447145313116371321341236050
测试二147101251191485176511331488615
李斌测试一311326913410640781033136977
测试二6720871451367138851332811186
期末雷军测试一81441491341091441326749849383
测试二3177732246787214411914412743
李斌测试一90101111134143121249815836633
测试二3037159825833533108412864
df5['模拟考'][['语文', '数学']]
语文数学
期中雷军测试一4764
测试二101147
李斌测试一13231
测试二2067
期末雷军测试一1448
测试二7731
李斌测试一10190
测试二3730
df5.loc['期中', '雷军', '测试一']['模拟考', '数学']
  • 输出

    64

# iloc是只取最内层索引的
df5.iloc[0]
  • 输出

    模拟考 数学 64
    语文 47
    英语 145
    物理 31
    化学 31
    生物 16
    正式考 数学 37
    语文 132
    英语 134
    物理 123
    化学 60
    生物 50
    Name: (期中, 雷军, 测试一), dtype: int32

df5.loc['期中', '雷军', '测试一']
  • 输出

    模拟考 数学 64
    语文 47
    英语 145
    物理 31
    化学 31
    生物 16
    正式考 数学 37
    语文 132
    英语 134
    物理 123
    化学 60
    生物 50
    Name: (期中, 雷军, 测试一), dtype: int32

# 列。索引从列开始取, 必须一层层取, 取完列索引,才可以取行索引
# 先取行索引同理
df5.模拟考.数学.期中.雷军.测试一
  • 输出

    64

a=df5['正式考']
a
数学语文英语物理化学生物
期中雷军测试一371321341236050
测试二76511331488615
李斌测试一781033136977
测试二138851332811186
期末雷军测试一1326749849383
测试二7214411914412743
李斌测试一1249815836633
测试二3533108412864

============================================

  1. 分析比较Series和DataFrame各种索引的方式,熟练掌握.loc()方法

  2. 假设张三再一次在期中考试的时候因为特殊原因放弃英语考试,如何实现?

============================================

4. 索引的堆(stack)

  • stack()
  • unstack()

小技巧】使用stack()的时候,level等于哪一个,哪一个就消失,出现在行里。

【小技巧】使用unstack()的时候,level等于哪一个,哪一个就消失,出现在列里。

df2
pythonmathen
期中期末期中期末期中期末
14433108551695
3214057155470
西325838724554
13557663385105
df2.stack()
enmathpython
期中16108144
期末955533
期中545732
期末7015140
西期中453832
期末547258
期中8566135
期末1053357
# stack的作用是将列索引变成了行的最内层索引
# level 代表的是层级 -1代表最里层,
df2.stack(level=0)
期中期末
en1695
math10855
python14433
en5470
math5715
python32140
西en4554
math3872
python3258
en85105
math6633
python13557
# unstack是将行变成列的最内层索引
df2.unstack()
  • 输出

    python 期中 东 144
    南 32
    西 32
    北 135
    期末 东 33
    南 140
    西 58
    北 57
    math 期中 东 108
    南 57
    西 38
    北 66
    期末 东 55
    南 15
    西 72
    北 33
    en 期中 东 16
    南 54
    西 45
    北 85
    期末 东 95
    南 70
    西 54
    北 105
    dtype: int32

df5.unstack()
模拟考...正式考
数学语文英语物理化学...语文英语物理化学生物
测试一测试二测试一测试二测试一测试二测试一测试二测试一测试二...测试一测试二测试一测试二测试一测试二测试一测试二测试一测试二
期中李斌316713220698713414510613...1038531133362891117786
雷军6414747101145253111931148...1325113413312314860865015
期末李斌903010137111151349814325...983315108834661283364
雷军83114477149731342210946...671444911984144931278343

4 rows × 24 columns

#如果想把所有的行索引都转成列索引
# 给level一个list,可以解决
df5.unstack(level=[0, 1, 2])
  • 输出

    模拟考 数学 期中 李斌 测试一 31
    测试二 67
    雷军 测试一 64
    测试二 147
    期末 李斌 测试一 90
    测试二 30
    雷军 测试一 8
    测试二 31
    语文 期中 李斌 测试一 132
    测试二 20
    雷军 测试一 47
    测试二 101
    期末 李斌 测试一 101
    测试二 37
    雷军 测试一 144
    测试二 77
    英语 期中 李斌 测试一 69
    测试二 87
    雷军 测试一 145
    测试二 25
    期末 李斌 测试一 111
    测试二 15
    雷军 测试一 149
    测试二 73
    物理 期中 李斌 测试一 134
    测试二 145
    雷军 测试一 31
    测试二 119
    期末 李斌 测试一 134
    测试二 98

    正式考 英语 期中 雷军 测试一 134
    测试二 133
    期末 李斌 测试一 15
    测试二 108
    雷军 测试一 49
    测试二 119
    物理 期中 李斌 测试一 36
    测试二 28
    雷军 测试一 123
    测试二 148
    期末 李斌 测试一 83
    测试二 4
    雷军 测试一 84
    测试二 144
    化学 期中 李斌 测试一 9
    测试二 111
    雷军 测试一 60
    测试二 86
    期末 李斌 测试一 66
    测试二 128
    雷军 测试一 93
    测试二 127
    生物 期中 李斌 测试一 77
    测试二 86
    雷军 测试一 50
    测试二 15
    期末 李斌 测试一 33
    测试二 64
    雷军 测试一 83
    测试二 43
    Length: 96, dtype: int32

============================================

  1. 使用unstack()将ddd变为两行,分别为期中期末

  2. 使用unstack()将ddd变为四行,分别为四个科目

============================================

5. 聚合操作

【注意】

  • 需要指定axis

  • 【小技巧】和unstack()相反,聚合的时候,axis等于哪一个,哪一个就保留。

所谓的聚合操作:平均数,方差,最大值,最小值……

df2.sum(axis=1)
  • 输出

    东 451
    南 368
    西 299
    北 481
    dtype: int64

df2.mean(axis=1)
  • 输出

    东 75.166667
    南 61.333333
    西 49.833333
    北 80.166667
    dtype: float64

df2.std(axis=1)
# 方差代表的是数据的波动
  • 输出

    东 48.774652
    南 43.228077
    西 14.538455
    北 36.356109
    dtype: float64

df2.max(axis=1)
  • 输出

    东 144
    南 140
    西 72
    北 135
    dtype: int32

df2.min(axis=1)
  • 输出

    东 16
    南 15
    西 32
    北 33
    dtype: int32

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值