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

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

导航

python常用操作之代码操作大全

列表操作大全(list operations)

列表分割x等分

#设计一个函数,用来分解列表为x等分,再以字典形式返回
def slice_list(lista, x):
    dicta = {}
    n = len(lista)
    group_size = n // x
    random.shuffle(lista)

    for i in range(x - 1):
        start = i * group_size
        end = (i + 1) * group_size
        dicta[i] = lista[start:end]

    dicta[x - 1] = lista[(x - 1) * group_size:]

    return dicta

两个列表取交集

A = list(set(mm_list_concat.成交编号) & set(df_mm.deal_no)) #取交集

字符串列表转数字型

def strlist2float(strlist):
    list=[]
    for i in strlist:
        list.append(float(i))
    return list

字典操作大全(dictionary operations)

用dict2更新dict1

dict1 = {'a': 1, 'b': 2,'c': 2}
dict2 = {'c': 3, 'd': 4}

dict1.update(dict2)
print(dict1)

对比两个字典相同的键名

dict1 = {'a': 1, 'b': 2, 'c': 3}
dict2 = {'b': 2, 'c': 4, 'd': 5}

common_keys = dict1.keys() & dict2.keys()
different_keys = dict1.keys() ^ dict2.keys()

print("共同的键:", common_keys)
print("不同的键:", different_keys)

对比两个字典相同的键值对

common_items = dict1.items() & dict2.items()
different_items = [(k, v1, v2) for k, v1 in dict1.items() for k2, v2 in dict2.items() if k == k2 and v1 != v2]

print("共同的键值对:", common_items)
print("不同的键值对:", different_items)

将字典中的键按大小排序并生成一个新的字典

可以使用以下方法:

original_dict = {'b': 2, 'a': 1, 'c': 3}

sorted_keys = sorted(original_dict.keys())
sorted_dict = {key: original_dict[key] for key in sorted_keys}

print(sorted_dict)

输出:{'a': 1, 'b': 2, 'c': 3}
在上述代码中,我们使用sorted()函数对原始字典的键进行排序,并将排序后的键按顺序构建新的字典sorted_dict。最终输出的结果就是按照键的大小排序的新字典。
请注意,字典是无序的数据结构,因此排序只会影响键的顺序,而不会改变字典中键值对的存储方式。

表格操作大全( DataFrame operations)

表格中某一列:成交编号中不在列表A中的值组成的新表

df_new = df[~df.成交编号.isin(A)]

将只有两列a,b的dataframe转换成dictionary

df_dict = df.set_index('a')['b'].to_dict()

修改一列的列名

df.rename(columns={'A': 'New_A'}, inplace=True)

修改所有列的列名

# 创建列名映射字典,将旧列名映射到新列名
column_mapping = {'A': 'New_A', 'B': 'New_B'}
# 使用rename()方法修改列名
df = df.rename(columns=column_mapping)

创建多重索引/多行标题的表格

df = pd.DataFrame(np.random.randint(50, 100, size=(4, 4)),
                 columns=pd.MultiIndex.from_product(
                 [['math', 'physics'], ['term1', 'term2']]),
                 index=pd.MultiIndex.from_tuples(
                 [('class1', 'LiLei'), ('class2', 'HanMeiMei'),
                 ('class2', 'LiLei'), ('class2', 'HanMeiMei')]))
df.index.names = ['class', 'name']

print:

                  math       physics      
                 term1 term2   term1 term2
class  name                               
class1 LiLei        94    58      92    53
class2 HanMeiMei    82    90      63    54
       LiLei        87    68      91    55
       HanMeiMei    70    57      52    81

案例二:

data = {
    ('Group1', 'Subgroup1'): [1, 2, 3],
    ('Group1', 'Subgroup2'): [4, 5, 6],
    ('Group2', 'Subgroup1'): [7, 8, 9],
    ('Group2', 'Subgroup2'): [10, 11, 12]
}

# 创建多级列索引
columns = pd.MultiIndex.from_tuples(data.keys(), names=['Group', 'Subgroup'])

# 创建DataFrame
df = pd.DataFrame(data, columns=columns)

Group       Group1              Group2          
Subgroup Subgroup1 Subgroup2 Subgroup1 Subgroup2
0                1         4         7        10
1                2         5         8        11
2                3         6         9        12

MySQL操作大全 (MySQL operations)

python连接数据库

连接数据库后读取表格信息

自建查询表格函数

#自定义函数query_table,用来查询指定数据库的指定表格
def query_table(database,table):
    host='localhost'
    user='root'
    password= password
    port=3306
    conn=create_engine('mysql+pymysql://{}:{}@{}:{}/{}'.format(user,password,host,port,database))
    sql='select * from '+str(database)+'.'+str(table)
    results=pd.read_sql(sql,conn)
    return results

列出数据库所有的表格名称

import pymysql

# 列出所有的表
def list_table(localhost, username, password, database):
    db = pymysql.connect(localhost, username, password, database, charset="utf8")
    cursor = db.cursor()
    cursor.execute("show tables")
    table_list = [tuple[0] for tuple in cursor.fetchall()]
    db.close()
    return table_list

查询表格的所有字段

def list_col(localhost, username, password, database, tabls_name):
    db = pymysql.connect(localhost, username, password, database, charset="utf8")
    cursor = db.cursor()
    cursor.execute("select * from %s" % tabls_name)
    col_name_list = [tuple[0] for tuple in cursor.description]
    db.close()
    return col_name_list

根据DataFrame生成MySQL数据表

import pandas as pd
from sqlalchemy import create_engine
import pymysql as py

def create_mysql_table(df, table_name):
    # 获取DataFrame的列名和数据类型
    columns = df.dtypes.index.tolist()
    dtypes = df.dtypes.values.tolist()

    # 创建表的SQL语句
    create_table_query = f"CREATE TABLE {table_name} ("

    # 构建列的定义
    for col, dtype in zip(columns, dtypes):
        if 'object' in str(dtype):
            max_length = df[col].astype(str).apply(len).max()  # 获取列数据的最大长度
            varchar_length = min(max_length, 255)  # 限制VARCHAR长度最大为255
            create_table_query += f"{col} VARCHAR({varchar_length}), "
        elif 'datetime' in str(dtype):
            create_table_query += f"{col} DATE, "
        elif 'float' in str(dtype):
            max_decimals = df[col].apply(lambda x: len(str(x).split('.')[-1])).max()  # 获取浮点数小数点后的最大位数
            float_length = min(max_decimals + 4, 38)  # 限制FLOAT小数点后数据长度最大为38
            create_table_query += f"{col} FLOAT({float_length}), "
        elif 'int' in str(dtype):
            create_table_query += f"{col} INT, "
        elif 'bool' in str(dtype):
            create_table_query += f"{col} TINYINT, "
        else:
            create_table_query += f"{col} TEXT, "

    create_table_query = create_table_query.rstrip(', ') + ")"

    # 返回创建表的SQL语句
    return create_table_query

posted on 2023-06-18 18:25  chengjon  阅读(80)  评论(0编辑  收藏  举报