金融量化学习---Python, MySQL, Pandas

这里用来记录一些在金融领域,尤其是银行相关的资金、债券、票据中应用到的数据管理与分析, 编程等心得或笔记,以及个人的一点小小兴趣(易经八卦、藏密禅修)等

导航

遍历(Iterable) everything

简单的说,Python 中一个对象只要实现了__iter__() 或 getitem() 方法,就成为可迭代(Iterable)的对象,通俗的讲就是这个对象是可数的。常见的可迭代对象包括:列表(list)、元组(tuple)、字典(dict)、集合(set)、字符串(str)等。

前言:处理迭代对象(Iterable)的三种方法

1.zip

zip() 是把几个可迭代对象(Iterable)叠在一起,按照对应0,1,2...的顺序将各个对象的重新分组,组成一个个元组(tuple),最后返回包含这些元组的列表(list)。

在 Python 3.x 中 zip() 返回的是一个对象,如需展示列表,需手动 list() 转换。

a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9, 10]
zz = zip(a, b)
print(list(zz))
# 输出 [(1, 4), (2, 5), (3, 6)]

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同。

zz1 = zip(a, c)
print(list(zz1))
# 输出 [(1, 7), (2, 8), (3, 9)]

利用 * 号操作符,可以将元组解压为列表。

x,y = zip(*zz)
print(x)
print(y)
# 输出 
# (1, 2, 3)
# (4, 5, 6)

2.lambda

Python中 lambda 指的是匿名函数,通俗的讲就是我在某处需要处理一些问题,又不想为此去单独定义一个函数,因为用一次就完了,不再用第二次,这个时候就需要这个 Lambda 匿名函数了。
它的写法为:

lambda arguments(所给的参数) : expression(表达式)
比如参数 a 加 10 ,并返回结果

x = lambda a : a + 10
print(x(5))
# 输出 5

参数 a,b 相乘并返回结果

x = lambda a, b : a * b
print(x(5, 6))
# 输出 30

通常 lambda 与 map 结合来处理可迭代对象。

3. map

Python 中的 map 函数应用于可迭代对象的每一个元素,返回的是一个结果list。 如果有其他的可迭代参数传进来,map 函数则会把每一个参数都以相应的处理函数进行迭代处理。 map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。

例如:

a = [1, 2, 3, 4, 5]
print(list(map(str,a)))
# 输出 ['1', '2', '3', '4', '5']

str 是 python 的内置函数,这里是把列表的每个元素变成了str类型,然后以列表的形式返回。 当然也可以传入自定义函数:

def mul(x):
    return x*x
n = [1, 2, 3, 4, 5]
res = map(mul, n)
print(list(res))
# 输出 [1, 4, 9, 16, 25]

这里的自定义函数完全可以用上面提到的匿名函数代替:

res = map(lambda x: x*x, n)

其输出结果是一样的。

一,对dataframe的行和列进行遍历和修改**

首先先定一个这样的字典,然后我们用不同的方法对其遍历和修改

df=pd.DataFrame({"A":[1,2,3,4],"B":[5,6,7,8],"C":[1,1,1,1]})
   A  B  C
0  1  5  1
1  2  6  1
2  3  7  1
3  4  8  1

i.遍历列

1.ix函数(df.ix[条件,操作区域])
df.ix[df.A>1,'B']=-1
df
   A  B  C
0  1  5  1
1  2 **-1**  1
2  3 **-1**  1
3  4 **-1**  1
2.iterrows()函数。

这个函数一般跟index和row一起使用,应为他会返回两个值,一个就是index,一个是行

for index,row in df.iterrows():
	if row['A']>1:
		row['B']=-1
   A  B  C
0  1  5  1
1  2 **-1**  1
2  3 **-1**  1
3  4 **-1**  1
3.where函数,np.where(条件,then,else)
df["then"]=np.where(df.A<3,1,0)
df
   A  B  C  then
0  1  5  1     1
1  2  6  1     1
2  3  7  1     0
3  4  8  1     0
4.apply函数你可以对行或列每一个数值进行自己指定函数的操作
def judgeLevel(df):
    if df['A'] < 2:
        return 'C'
    elif df['A'] > 3:
        return 'A'
    else:
        return 'B'

 df['level']=df.apply(lambda r:judgeLevel(r),axis=1)
 df
   A  B  C   level
0  1  5  1    C
1  2  6  1    B
2  3  7  1    B
3  4  8  1    A

ii.遍历列 - iloc函数

for i in range(0, len(df)):
    print (df.iloc[i]['A'], df.iloc[i]['B'])
     1 5
     2 6
     3 7
     4 8

Pandas对象之间的基本迭代的行为取决于类型。当迭代一个系列时,它被视为数组式,基本迭代产生这些值。其他数据结构,如:DataFrame和Panel,遵循类似惯例迭代对象的键。简而言之,基本迭代(对于i在对象中)产生。

Series – 值
DataFrame – 列标签
Pannel – 项目标签

(一) 迭代DataFrame**

迭代DataFrame提供列名。现在来看看下面的例子来理解这个概念。

import pandas as pd
import numpy as np
N=20

df = pd.DataFrame({
    'A': pd.date_range(start='2016-01-01',periods=N,freq='D'),
    'x': np.linspace(0,stop=N-1,num=N),
    'y': np.random.rand(N),
    'C': np.random.choice(['Low','Medium','High'],N).tolist(),
    'D': np.random.normal(100, 10, size=(N)).tolist()
    })

for col in df:
   print (col)

执行上面示例代码,得到以下结果 –

A
C
D
x
y

要遍历数据帧(DataFrame)中的行,可以使用以下函数 –
• iteritems() – 迭代(key,value)对
• iterrows() – 将行迭代为(索引,系列)对
• itertuples() – 以namedtuples的形式迭代行

(二) iteritems()示例

将每个列作为键,将值与值作为键和列值迭代为Series对象。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(4,3),columns=['col1','col2','col3'])
for key,value in df.iteritems():
   print(key,value)

执行上面示例代码,得到以下结果 –

col1 0    0.459280
1    0.302563
2   -0.925297
3   -1.701360
Name: col1, dtype: float64
col2 0   -2.577661
1   -0.840329
2    0.277956
3    0.141397
Name: col2, dtype: float64
col3 0   -0.819635
1    0.826029
2   -0.038953
3    0.379977
Name: col3, dtype: float64

观察一下,单独迭代每个列作为系列中的键值对。

(三) iterrows()示例

iterrows()返回迭代器,产生每个索引值以及包含每行数据的序列。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])
for row_index,row in df.iterrows():
   print(row_index,row)

执行上面示例代码,得到以下结果 –

0 col1    0.589103
col2   -1.344540
col3   -0.273822
Name: 0, dtype: float64
1 col1   -1.799794
col2    0.191032
col3   -0.470350
Name: 1, dtype: float64
2 col1    1.538743
col2   -0.443371
col3   -1.234744
Name: 2, dtype: float64
3 col1   -1.700915
col2    0.637768
col3    0.320671
Name: 3, dtype: float64

注意 – 由于iterrows()遍历行,因此不会跨该行保留数据类型。0,1,2是行索引,col1,col2,col3是列索引。

(四) itertuples()示例

itertuples()方法将为DataFrame中的每一行返回一个产生一个命名元组的迭代器。元组的第一个元素将是行的相应索引值,而剩余的值是行值。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])
for row in df.itertuples():
    print(row)

执行上面示例代码,得到以下结果 –

Pandas(Index=0, col1=-0.459994067109029, col2=-1.3589032966943688, col3=-0.8378124266875753)
Pandas(Index=1, col1=-0.675609143041429, col2=0.9365900839103676, col3=0.16686318229869906)
Pandas(Index=2, col1=-0.32119668362802845, col2=0.31388056160597017, col3=1.3433307873076799)
Pandas(Index=3, col1=1.2368409605416566, col2=1.184780890409777, col3=-0.27277256974192443)

注意 – 不要尝试在迭代时修改任何对象。迭代是用于读取,迭代器返回原始对象(视图)的副本,因此更改将不会反映在原始对象上。

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])

for index, row in df.iterrows():
   row['a'] = 10
print(df)

执行上面示例代码,得到以下结果 –

       col1      col2      col3
0  0.534370  0.245170  0.247378
1 -0.375285 -0.370878 -0.258897
2  0.910811 -1.566585 -0.857689
3  0.468804 -1.407227 -0.791819

注意观察结果,修改变化并未反映出来。

二,遍历字典 ( Dict )**

d.items()将字典转换为可遍历的列表

d = {'a':1,'b':2,'c':3}
for key, val in d.items():
    print(key,val)

输出:
a 1
b 2
c 3

d.items()
dict_items([('a', 1), ('b', 2), ('c', 3)])
下面的写法会报错

In [180]: d = {'a':1,'b':2,'c':3}
In [181]: for key, val in d:
     ...:     print(key,val)
     ...: 
---------------------------------------------------------------------------
ValueError: not enough values to unpack (expected 2, got 1)

可以这样写,直接遍历所有的键

In [180]: d = {'a':1,'b':2,'c':3}
In [183]: for key in d:
     ...:     print(key)
     ...: 

字典遍历
.keys() 获取字典的所有键,生成一个列表,通过遍历key键来实现字典的遍历

>>> students={'姓名':'小明','年龄':'22','联系方式':'123456','邮箱':'sunyue2019@qq.com','住址':'地球村'}
>>> students
{'姓名': '小明', '年龄': '22', '联系方式': '123456', '邮箱': 'sunyue2019@qq.com', '住址': '地球村'}
>>> for key in students.keys():
	print('%s是%s'%(key,students[key]))
 
姓名是小明
年龄是22
联系方式是123456
邮箱是sunyue2019@qq.com
住址是地球村

.values() 获取字典的所有值,生成一个列表,可以来直接遍历value值

>>> for var in students.values():
	print('获取的值为:%s'%var)
 
	
获取的值为:小明
获取的值为:22
获取的值为:123456
获取的值为:sunyue2019@qq.com
获取的值为:地球村

.items() 获取所有键值对,生成一个具有键值对的复合元组,可以来遍历字典的键与值(元素)
( 通过两个变量进行一次性赋值,遍历key-value(键值对))

for key,var in students.items():
print('键为%s,值为%s'%(key,var))

键为姓名,值为小明
键为年龄,值为22
键为联系方式,值为123456
键为邮箱,值为sunyue2019@qq.com
键为住址,值为地球村

三,enumerate()的用法

Python enumerate() 函数, 该函数可用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
语法
enumerate(sequence, [start=0])
参数
sequence -- 一个序列、迭代器或其他支持迭代对象。
start -- 下标起始位置。
返回值
返回 enumerate(枚举) 对象。

实例
以下展示了使用 enumerate() 方法的实例:

>>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))       # 下标从 1 开始
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

普通的 for 循环
>>>i = 0
>>> seq = ['one', 'two', 'three']
>>> for element in seq:
...     print i, seq[i]
...     i +=1
... 
0 one
1 two
2 three

for 循环使用 enumerate
>>>seq = ['one', 'two', 'three']
>>> for i, element in enumerate(seq):
...     print i, element
... 
0 one
1 two
2 three

posted on 2020-10-14 20:20  chengjon  阅读(544)  评论(0编辑  收藏  举报