【Pandas操作1】Series(索引、切片、常用方法)、DataFrame(常用属性、索引操作、切片操作、数据查看、数据保存与加载、操作excel、把数据写入到数据库)、股票分析案例

1 pandas数据分析库

Pandas 提供了两种数据结构,分别是 Series(一维数组结构)与 DataFrame(二维数组结构),
这两种数据结构极大地增强的了 Pandas 的数据分析能力。

## Series

### 概述

Series是一种类似与一维数组的对象,由下面两个部分组成:

- values:一组数据
- index:相关的数据索引标签

### 常见操作

- 创建方式
  - 由列表创建
  - 由字典创建
import pandas as pd
from pandas import Series, DataFrame
s1 = Series(data=[3,3,6,6,8,8,9,9])
s1

在这里插入图片描述

s2 = Series(data={'name': 'lin', 'salary': '15000', 'age': 30})
s2

在这里插入图片描述

1.1 Series的索引

- 隐式索引:默认形式的索引(0,1,2....)
- 显示索引:自定义的索引,可以通过index参数设置显示索引
  - 显示索引的作用:增加了数据的可读性
# 通过隐式索引访问元素
s1[0] # 3
# 通过隐式索引访问元素
s1[[0, 2, 4]]

在这里插入图片描述

# 显示索引
s2['name']  # 'lin'

1.2 Series的切片

# Series的切片
s1[0:3]

在这里插入图片描述

# Series的切片
s2['name': 'age']

在这里插入图片描述

1.3 Series的常用方法

- head() 显示前几个元素
- tail()  显示后几个元素
- unique()  显示后几个元素
- nunique()  统计去重后的元素的个数
- value_counts()  统计元素出现的次数
- isnull(),notnull()
# Series的运算
s1 + 100  # 让s1的每个元素都加100

在这里插入图片描述

# NaN就是None
s3 + s4
# 在Series的运算中只有索引一致的元素可以进行算术运算,否则补空

在这里插入图片描述

2 DataFrame(重要)

#### 概述

- DataFrame是一个【表格型】的数据结构。DataFrame由按一定顺序排列的多列数据组成。
- 设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。
  - 行索引:index
  - 列索引:columns
  - 值:values

#### DataFrame的创建
- 字典创建
dic = {
    'name': ['Tom', 'Jerry', 'Jay'],
    'age': [10, 20, 30],
    'salary': [2000, 3000, 4000]
}
table = DataFrame(data=dic)
table

在这里插入图片描述

2.1 DataFrame的常用属性

  • values 返回表格所有的值
  • columns 返回列索引
  • index 返回行索引
  • shape 返回表格的维数,形状,是一个元组

2.2 索引操作(重点)

  • 对行进行索引
  • 队列进行索引
  • 对元素进行索引
dic = {
    'name': ['Tom', 'Jerry', 'Jay'],
    'salary': [2000, 3000, 4000],
    'age': [30, 40, 50]
}
df = DataFrame(data=dic, index=['a', 'b', 'c'])
df
# 索引取单列 df[col]
df['age']
# 索引取多列  df[[col1, col2]]
df[['age', 'name']]
# 索引取单行 df.loc/iloc[index]
df.loc['a']
# iloc后面跟的是隐式索引,loc后面跟显示索引
df.iloc[0]
# 索引取多行 df.loc/iloc[[index1, index2]]
df.loc[['a', 'b']]
# 索引取元素, 逗号左边是行,右边是列
df.loc['b', 'name']

2.3 切片操作

  • 批量切行 df[‘a’: ‘c’]
  • 批量切列 df.loc[:, ‘name’: ‘salary’]
# 切行
df['a': 'c']
# 切列
df.loc[:, 'name': 'salary']

2.4 数据查看

  • 查看DataFrame的概览和统计信息
    • head() 查看前几行
    • tail() 查看后几行
    • info() 查看表格的基本信息
    • describe() 对数据表格进行统计描述
# 对数据表格进行统计描述
df.describe()

在这里插入图片描述

2.5 数据保存与加载

### csv
- to_csv() & read_csv()
dic = {
    'name': ['Tom', 'Jerry', 'Jay'],
    'salary': [2000, 3000, 4000],
    'age': [30, 40, 50]
}
df = DataFrame(data=dic, index=['a', 'b', 'c'])
df

在这里插入图片描述

# 将df数据写入到文件中存储
df.to_csv('./df.txt')
# 读取外部文件, ./data/透视表-篮球赛.csv 的数据到df表格中
ball = pd.read_csv('./data/透视表-篮球赛.csv')
ball

在这里插入图片描述

2.6 DataFrame操作Excel

环境安装:

pip install xlrd -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install xlwt -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple

  • to_excel(filaPath,sheet_name) & read_excel(filaPath,sheet_name)
    • sheet_name工作表名称
# 读取execl数据  data/运营商数据.xlsx
opt = pd.read_excel('./data/运营商数据.xlsx')
opt
# 将数据写到excel中
dic = {
    'name': ['Tom', 'Jerry', 'Jay'],
    'salary': [2000, 3000, 4000],
    'age': [30, 40, 50]
}
df = DataFrame(data=dic, index=['a', 'b', 'c'])

在这里插入图片描述

df.to_excel('dic.xlsx')
  • 为什么需要将外部文件的数据读取加载到DataFrame表格中呢?
    • 将外部文件读取到DataFrame中,我们就可以基于DataFrame自身的特性对数据进行不同维度的运算和处理

2.8 把数据写入到数据库

sql

环境安装:

pip install sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple

  • 写入数据到数据库
    • from sqlalchemy import create_engine
    • 创建链接对象:
      • conn = create_engine(‘mysql+pymysql://用户名:密码@ip:port/dbName?charset=UTF8MB4’)
import pandas as pd

from pandas import Series, DataFrame
dic = {
    'name': ['Tom', 'Jerry', 'Jay'],
    'salary': [2000, 3000, 4000],
    'age': [30, 40, 50]
}
df = DataFrame(data=dic)
df

在这里插入图片描述

from sqlalchemy import create_engine

# 创建一个链接对象
# mysql+pymysql://用户名:密码@ip:port/dbName?charset=utf8mb4
conn = create_engine('mysql+pymysql://root:root@127.0.0.1:3306/new_spider?charset=utf8mb4')
df.to_sql(name='tf_df', con=conn)
  • 读取数据库中的数据
import pymysql

conn = pymysql.Connect(
    host = '127.0.0.1', # 数据库服务器地址
    port = 3306, # 数据库端口
    user = 'root',  # 数据库的用户名
    password = 'root', # 密码
    db = 'blog'  # 数据库名字
)
ret = pd.read_sql('select * from blog_article', conn)
ret

3 股票分析案例

import pandas as pd

# 可以将本地的文件数据读取到df  ./data/600519.xlsx
df = pd.read_excel('./data/600519.xlsx')
df.head()

在这里插入图片描述

# 删除无用的一列, inplace=True将删除操作作用在原始数据中
df.drop(columns='Unnamed: 0', inplace=True)

df.head()

在这里插入图片描述

# 查看表格的基本信息
df.info()

在这里插入图片描述

# 转换 'date' 列为 datetime64[ns] 类型
df['date'] = pd.to_datetime(df['date'])

# 转换为按月的 Period 类型  月M 天D
df['date'] = df['date'].dt.to_period('D')

# 将date列转换成时间类型  astype()做类型转
df['date'].astype('datetime64')

在这里插入图片描述

#显示索引优势:可以增加数据的可读性
#将date列作为表格的行索引
df.set_index('date',inplace=True)

df.head()

在这里插入图片描述

  • 计算股票的每日收益率和7日波动率:通过计算收益率和波动率,我们可以评估股票的风险和收益情况。

    • 每日收益率:(当日收盘价 - 前一日的收盘价)/ 前一日的收盘价
      • shift():将一组数据向前或者前后进行移动
    • 7日波动率:对每日收益率数据进行每7日滚动的方差计算
      • rolling():设置滚动窗口
df['close'].shift(1)

在这里插入图片描述

# 前一日收盘
df['close'].shift(1)

在这里插入图片描述

# 每日收益率 (当日收盘价 - 前一日的收盘价) / 前一日的收盘价
day_rate = (df['close'] - df['close'].shift(1)) / df['close'].shift(1)
day_rate

在这里插入图片描述

# 7日波动率 
# 对每7个数据框起来显示一个窗口,var求一组数据的方差
day_7_rolling_rate = day_rate.rolling(7).var()
day_7_rolling_rate

在这里插入图片描述

  • 查找股票的市值最大和最小日
    • 市值 = 收盘价 * 成交量
    • 找出市值数据中最大最小值下标(市值最大和最小日期)
      • idxmax() & idxmin()
# 每日市值  = 收盘价 * 成交量
day_valus = df['close'] * df['volume']
day_valus

在这里插入图片描述

# 找出市值数据中最大最小值下标(市值最大和最小日期)
day_valus.idxmax() # 求最大元素下标
day_valus.idxmin()  # 最小元素下标
# 求最大元素下标 对应的最大值
day_valus.idxmax(), day_valus.max()
  • 输出该股票所有收盘比开盘上涨3%以上的日期
    • (收盘 - 开盘) / 开盘 > 0.03
ex = (df['close'] - df['open']) / df['open'] > 0.03
ex  

在这里插入图片描述

# 想获取多有True对应的索引
# 在DataFrame中,可以使用布尔值作为表格的行索引:
# 就会保留True对应的行数据,忽略False对应的行数据
df.loc[['2015-01-05', '2015-01-06']]

在这里插入图片描述

df.loc[ex]  # 获取了True对应的行数据(满足要求的行数据)

在这里插入图片描述

# 输出该股票所有收盘比开盘上涨3%以上的日期
df.loc[ex].index  # 获取了满足要求的行数据的行索引

在这里插入图片描述

  • 假如张三从2015年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天为止,我的收益如何?

    • 分析:
      • 买入股票
        • 一个完整的年,需要买入12手1200支股票。以购买当期的开盘价进行股票的买卖。
      • 卖出股票
        • 一个完整的年,需要卖出1200支股票(收盘价为单价)
      • 特殊情况:
        • 最后一年就是一个特殊的年(因为没有到该年最后一个交易日),只可以买不可以卖,但是手里剩余的股票是需要计算到总收益中。
    • resample函数介绍:pandas库中的resample函数主要用于将时间序列数据重新采样到不同的时间频率,例如从按天采样重新采样为按周或按月采样。resample函数的常用语法如下:
      • df.resample(rule, …).func()
      • 其中,df是一个时间序列数据的DataFrame,rule是指定重采样频率的规则字符串(H小时、W星期、M月、A年等),func是用于聚合数据的函数(例如求和、平均值等)。例如:
        • df.resample(‘H’).mean()
        • df.resample(‘W’).sum()
        • df.resample(‘M’).max()
df

在这里插入图片描述

# 找出每个月的第一个交易日的开盘价
# resample("M")对时间序列数据进行重新采样
monthly = df.resample("M").first()  # 取出了每个月第一个交易日对应的行数据
monthly.head(5)

在这里插入图片描述

# 买入股票的总花费
total_cost = monthly['open'].sum() * 100
total_cost
# 卖出股票到手多少钱  A表示年份
yearly = df.resample('A').last()
yearly
# 卖出收盘价
recv = yearly['close'].sum() * 1200
recv
# 计算宗收益
recv - total_cost
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值