NumPy、Pandas、Matplotlib基础与案例

阅读: 评论:0

NumPy、Pandas、Matplotlib基础与案例

NumPy、Pandas、Matplotlib基础与案例

安装链接

链接:=p5yo
此链接已包含Anaconda等开发工具与相应的安装教程;Anaconda也可在官网中下载,速;官网:。
Anaconda中集成了数据分析和机器学习的所有环境。Jupyter为Anaconda提供的基于浏览器的可视化开发工具。

源码链接

 链接:=6gnv
此链接已包含Numpy、Pandas、Matplotlib基础与案例源码。

Jupyter

启动:Win + R输入cmd;输入D:;输入jupyter notebook。
新建:Python3:Anaconda中的一个源文件。Cell两种模式:Code:编写代码;Markdowm:编写笔记。
快捷键:插入Cell:a或b;        删除Cell:x;        修改模式:y(Code模式),m(Markdowm模式);        执行Cell:shift + enter;        自动补全:tab;        打开帮助文档:shift + tab。

NumPy库

NumPy是Python语言中做科学计算的基础库。重在数值计算,也是大部分Python科学计算库中的基础,多用在大型、多维数组上执行的数值运算。

a.Numpy数组元素数据类型相同,列表元素数据类型可以不同。
b.数据类型优先级:字符串 > 浮点型 > 整型;转为优先级更高的数据类型。
c.索引类似于坐标,但每行每列从零开始。
d.级联维度相同,行列数分别相等。
e.sum()、max()、min()、mean()操作相同;std()、var()操作相同;sin()、cos()、tan()操作相同。
f.方差var()的数值是标准差std()数值的平方。

import numpy as np# 创建Numpy数组    Numpy数组属性    索引    切片
# 一维Numpy数组    dtype参数修改Numpy数组元素数据类型
np.array([1, 2, 3], dtype='int32')
# 二维Numpy数组    多维数组修改Numpy数组元素数据类型
np.array([[1, 2, 3], ['4', '5', '6']])
# 创建二维五行六列Numpy数组元素都是0的Numpy数组
np.zeros(shape=(5, 6))
# 创建二维五行六列Numpy数组元素都是1的Numpy数组
np.ones(shape=(5, 6))
# 创建一维从0到100的20个Numpy数组元素的Numpy数组
np.linspace(0, 100, num=20)
# 创建一维从0到100的步长为2不含100的Numpy数组
np.arange(0, 100, step=2)
# 创建二维五行六列从0到100随机整数的Numpy数组
arr = np.random.randint(0, 100, size=(5, 6))
# 返回Numpy数组维度
arr.ndim
# 返回Numpy数组行列数
arr.shape
# 返回Numpy数组数据类型
type(arr)
# 返回Numpy数组元素个数
arr.size
# 修改Numpy数组元素数据类型
arr.dtype = 'int32'
# 获取Numpy数组第零一二行元素
arr[[0, 1, 2]]
# 获取Numpy数组第零一二列元素
arr[:, [0, 1, 2]]
# 获取Numpy数组第零一二行第零一二列对角线元素
arr[[0, 1, 2], [0, 1, 2]]
# 获取Numpy数组第零一二行元素
arr[0:3]
# 获取Numpy数组第零一二列元素
arr[:, 0:3]
# 获取Numpy数组第零一二行第零一二列元素
arr[0:3, 0:3]
# Numpy数组元素行列倒置
arr[::-1, ::-1]# 变形    级联    聚合    矩阵
# 转为一维三十行Numpy数组
arr_one = shape((30, ))
# 转为二维五行六列Numpy数组
arr_two = shape((5, 6))
# Numpy数组元素纵向拼接求和axis为零
np.concatenate((arr_two, arr), axis=0)
# Numpy数组元素横向拼接求和axis为一
np.concatenate((arr_two, arr), axis=1)
# Numpy数组元素纵向拼接求和axis为零
arr_two.sum(axis=0)
# Numpy数组元素横向拼接求和axis为一
arr_two.sum(axis=1)
# 第一行Numpy数组元素求标准差
arr_two[1].std()
# 第一行Numpy数组元素求方差
arr_two[1].var()
# 四舍五入
np.around(2.87, 1)
# sin求值
np.sin(arr_two)
# 单位矩阵转置
np.eye(5).T
# 矩阵相乘
np.dot(shape((6, 5)), arr_two)import matplotlib.pyplot as plt# matplotlib方法创建Numpy数组
# imread读取图片数据加载到Numpy数组中
img_arr = plt.imread('D:SoftWareWallPaper霍亨索伦城堡.jpg')
# 每个Numpy数组元素加10
img_arr = img_arr + 10
# imshow读取图片数据展示在坐标系中
plt.imshow(img_arr[0:1001, 0:1001, :])
# 左右翻转列倒置
plt.imshow(img_arr[:, ::-1, :])
# 上下翻转行倒置
plt.imshow(img_arr[::-1, :, :])# numpy库
# 方法:1.array()、zeros()、ones()、linspace()、arange()、random.randint()创建Numpy数组
#      2.around()四舍五入    3.sin()、cos()、tan()求值    4.eye().T单位矩阵转置    5.dot()矩阵相乘
#      6.concatenate()级联# matplotlib.pyplot模块
# 方法:1.imread()读取图片数据加载到Numpy数组中    2.imshow()读取图片数据展示在坐标系中# Numpy数组
# 属性:1.ndim(Numpy数组维度)    2.shape(Numpy数组行列数)    3.size(Numpy数组元素个数)    
#      4.dtype(Numpy数组元素数据类型)
# 方法:1.索引切片    2.reshape()变形    3.sum()、max()、min()、mean()数学计算    4.std()、var()标准差方差

Pandas库

numpy能够处理数值型数据,在数据分析中除了数值型数据还有其他类型数据等(字符串,时间序列),pandas就可以处理除了数值型的其他数据。

Series

a.Series对象由索引(index)与元素(values)构成,元素数据类型相同。
b.显式索引可通过Series对象.索引获取元素。
c.数据类型O表示Object(字符串类型)。
d.索引一致的元素可以进行算术运算,否则补空。
e.isnull()、notnull()操作相同;head()、tail()操作相同;add() 、sub()、 mul()、 div()加减乘除。

import numpy as np
from pandas import Series, DataFrame
import pandas as pd# 创建Series对象    Series对象属性    索引切片
# 一维三十行Numpy数组作为Series对象元素    隐式索引
arr = np.random.randint(0, 100, size=(5, 6))
Series(data&#shape((30, )))
# 字典作为Series对象元素    显示索引
Series(data={'a': 100, 'b': 100, 'c': 100})
# 列表作为Series对象元素    显式索引
s = Series(data=[1, 2, 'three'], index=['a', 'b', 'c'])
# 返回Series对象行数
s.shape
# 返回Series对象元素
s.values
# 返回Series对象元素索引
s.index
# 返回Series对象元素个数
s.size
# 返回Series对象元素数据类型
s.dtype
# 获取Series对象第零一二行元素
s[[0, 1, 2]]
# 获取Series对象索引a的元素
s.a
# 获取Series对象第零一二行元素
s[0:3]# 数学运算
# 索引a、c的Series对象元素相加,索引b、d的Series对象元素补空
s_one = Series(data=[1, 2, 3], index=['a', 'b', 'c'])
s_two = Series(data=[1, 2, 3], index=['a', 'd', 'c'])
s = s_one + s_two
# 判断每个Series对象元素是否为空    空返回True,非空返回False
s.isnull()
# 显示前三个Series对象元素
s.head(3)
# 去重
s.unique()

DataFrame

a.DataFrame由行索引(index)、列索引(columns)与元素(values)构成,元素数据类型相同。
b.DataFrame对象设置显式索引后,隐式索引存在。
c.用df.loc[:, ['name']]获取的是DataFrame对象,用df.loc[:, 'name']获取的是Series对象。
d.loc[]进行索引切片时包含左右边界;iloc[]进行索引切片时包含左边界,不含右边界。
d.DataFrame对象的数学运算与Series对象的数学运算操作相同。
e.使用np.random.pernutation()生成乱序随机序列时,只能使用隐式索引。
f.匹配级联:行列索引一致;不匹配级联:行列索引不一致,外连接补空,内连接连接匹配项。
g.transform()返回字典映射合并,apply()返回字典。

import numpy as np
from pandas import Series, DataFrame
import pandas as pd
import sqlite3# 创建DataFrame对象    DataFreme对象属性    索引    切片
# 二维五行六列Numpy数组作为DataFrame对象元素    显示列索引隐式行索引
arr = np.random.randint(0, 100, size=(5, 6))
DataFrame(data=arr, columns=['a', 'b', 'c', 'd', 'e', 'f'])
# 嵌套列表作为DataFrame对象元素    隐式行列索引
DataFrame(data=[[1, 2, 'three'], [1, 2, 'three']])
# 嵌套字典作为DataFrame对象元素    显式行列索引
dict = {'name': ['a', 'b', 'c'], 'mark': [100, 100, 100]}
df = DataFrame(data=dict, index=['a', 'b', 'c'])
# 返回DataFrame对象行列数
df.shape
# 返回DataFrame对象元素
df.values
# 返回DataFrame对象元素列索引
df.columns
# 返回DataFrame对象元素行索引
df.index
# 获取DataFrame对象第a、b、c行第name、mark列元素
df.loc[['a', 'b', 'c'], ['name', 'mark']]
# 获取DataFrame对象第a、b、c行元素
df.loc[['a', 'b', 'c']]
# 获取DataFrame对象第name、mark列元素
df.loc[:, ['name', 'mark']]
# 获取DataFrame对象第零一二行元素
df.iloc[0:3]
# 获取DataFrame对象第零一列元素
df.iloc[:, 0:2]# 映射    替换    重排    级联
dict = {'a': 'yqy', 'b': 'hcy', 'c': 'jds'}
# 指定列DataFrame对象元素映射合并
df.loc[:, 'realname'] = df.loc[:, 'name'].map(dict)
def figure(mark):return 0.75*mark
# 指定列DataFrame对象元素映射计算
df.loc[:, 'aftermark'] = df.loc[:, 'mark'].map(figure)
arr = np.random.randint(0, 100, size=(5, 6))
df_one = DataFrame(data=arr, columns=['a', 'b', 'c', 'd', 'e', 'f'])
df_two = DataFrame(data=arr, columns=['a', 'b', 'c', 'd', 'g', 'h'])
# DataFrame对象元素全部替换
place(to_replace=1, value='one')
place(to_replace={1:'one'})
# 指定列DataFrame对象元素全部替换
place(to_replace={'f':1}, value='one')
# DataFrmae对象行列索引重排
df_one.take(np.random.permutation(5), axis=0).take(np.random.permutation(6), axis=1).iloc[0:2]
# DataFrame对象元素纵向拼接axis为零
pd.concat((df_one, df_one), axis=0)
# DataFrame对象元素纵向拼接axis为零
pd.concat((df_one, df_one), axis=1)
# DataFrame对象元素纵向拼接不匹配补空
pd.concat((df_one, df_two), axis=0, join='outer')
# DataFrame对象元素纵向拼接连接匹配项
pd.concat((df_one, df_two), axis=0, join='inner')# 合并    分组    透视/交叉表
df_one = DataFrame(data={'name': ['yqy', 'hcy', 'jds'], 'date': [2023, 2023, 2023]})
df_two = DataFrame(data={'name': ['yqy', 'hcy', 'jds'], 'group': ['a', 'b', 'b']})
pd.merge(df_one, df_two)
df_three = DataFrame(data={'name': ['yqy', 'hcy'], 'date': [2023, 2023], 'group': ['a', 'b']})
df_four = DataFrame(data={'group': ['a', 'b', 'b'], 'lead': ['aa', 'ab', 'ac']})
pd.merge(df_three, df_four)
df_five = DataFrame(data={'group': ['b', 'b', 'c'], 'lead': ['ab', 'ac', 'ad']})
pd.merge(df_two, df_five, how='outer')
df = pd.read_csv(r'D:CodeKitProjectea.WPSProjectaa.fruit.csv')
df.drop(labels='Unnamed: 0', axis=1, inplace=True)
# 颜色分组获取DataFrameGroupBy对象元素
df.groupby(by='color').groups
# 类别分组获取DataFrameGroupBy对象元素价格均值
df.groupby(by='item')['price'].mean()
# 类别分组获取DataFrameGroupBy对象元素重量均值字典
dict = df.groupby(by='item')['weight'].mean().to_dict()
# 指定列DataFrame对象元素映射合并
df.loc[:, 'meanweight'] = df.loc[:, 'item'].map(dict)
def mean(price):sum = 0for i in price:sum += ireturn sum/len(price)
# 类别分组获取DataFrameGroupBy对象元素价格均值字典映射合并
df.loc[:, 'meanprice'] = df.groupby(by='item')['price'].transform(mean)
# header指定某行作为列名,sep指定某字符串作为分隔符
df = pd.read_csv(r'D:CodeKitProjectea.pe-.txt', header=None, sep='-')
# 创建Sqlite数据库连接对象    可连接.db、.sqlite、.sqlite3文件
conn = t(r'D:CodeKitProjectea.WPSProjectweather_2012.sqlite')
# 读取Sqlite数据文件数据
df = pd.read_sql('select * from weather_2012', conn)
df = pd.read_csv(r'D:CodeKitProjectea.WPSProjectaa.basketballgame.csv', encoding='utf-8')
# 对手主客场作为分类汇总条件索引获取DataFrame对象元素得分篮板助攻
df.pivot_table(index=['对手', '主客场'], values=['得分', '篮板', '助攻'])
# 胜负主客场作为分类汇总条件索引获取DataFrame对象元素得分篮板助攻总和    aggfunc默认为mean
df.pivot_table(index=['胜负', '主客场'], values=['得分', '篮板', '助攻'], aggfunc='sum')
# 对手主客场作为分类汇总条件行列索引获取DataFrame对象元素得分总和空值补零
df.pivot_table(index='对手', columns='主客场', values='得分', aggfunc='sum', fill_value=0)
df = pd.read_csv(r'D:CodeKitProjectea.WPSProjectaa.smoke.csv')
df.drop(labels='Unnamed: 0', axis=1, inplace=True)
pd.crosstab(df.sex, df.smoke)
pd.crosstab(df.age, df.smoke)from pandas import Series, DataFrame
import pandas as pddict = {'time': ['2023-06', '2023-06', '2023-06'], 'temp': [31, 32, 33]}
df = DataFrame(data=dict)
# to_datetime将time数据类型转为时间序列类型
df.loc[:, 'time'] = pd.to_datetime(df.loc[:, 'time'], format='%Y-%m')
# set_index将DataFrame对象隐式索引转为指定索引,作用在原DataFrame对象中
df.set_index('time', inplace=True)

数据清洗

import numpy as np
from pandas import Series, DataFrame
import pandas as pd# 缺失值    重复值    异常值
# NoneType数据类型的None不可参与运算
type(None)
# float数据类型的nan可参与运算
type(np.nan)
arr=np.random.randint(0, 100, size=(5, 6))
df = DataFrame(data=arr, columns=['a', 'b', 'c', 'd', 'e', 'f'])
# 第a列DataFrame对象元素设为None
df.loc[:, 'a'] = None
# 第b列DataFrame对象元素设为nan
df.loc[:, 'b'] = np.nan
# isnull判空为True,any有True则True
drop_index = df.loc[df.isnull().any(axis=1)].index
df.drop(labels=drop_index, axis=0)
# notnull判空为False,all有False则False
df.ull().all(axis=1)]
# 行drop、take系列axis为零
df.dropna(axis=0)
# 行非drop、take系列axis为一
df.fillna(method='bfill', axis=1)
df.drop_duplicates(keep='first', subset='a')
df.loc[~(df.loc[:, 'f']>2*df.loc[:, 'f'].std())]# pandas库
# 方法:1.Series()创建Series对象    2.DataFrame()创建DataFrame对象
#      3.concat()级联    4.merge()合并
#      5.read_csv()、read_excel()、read_json()、read_sql()、read_table()、read_html()、
#      read_hdf()、read_feather()、read_sas()读取csv、excel、json、sql、文本、
#      html(表格数据/excel样式的html数据)、hdf5、feather、sas文件
#      6.to_datetime()将time数据类型转为时间序列类型# Series对象
# 属性:1.shape(Series对象行数)    2.values(Series对象元素)    3.index(Series对象元素索引)
#      4.size(Series对象元素个数)    5.dtype(Series对象元素数据类型)
# 方法:1.索引切片    2.isnull()、notnull()判断Series对象元素是否为空/非空
#      3.head()、tail()显示前/后五个Series对象元素    4.unique()、nunique()去重/去重计数
#      5.add()、sub()、mul()、div()数学运算# DataFrame对象
# 属性:1.shape(DataFrame对象行列数)    2.alues(DataFrame对象元素)
#      3.columns(DataFrame对象列索引)    4.index(DataFrame对象行索引)    5.info()(列索引信息)
# 方法:1.索引切片    2.map()映射    3.replace()替换    4.take()重排
#      5.drop()删除指定行/列DataFrame对象元素    6.groupby()分组    7.to_dict()转为字典
#      8.transform()映射合并/计算    9.pivot_table()透视表    10.crosstab()交叉表
#      11.set_index()将DataFrame对象隐式索引转为指定索引    
#      12.any()、all()有True/False则True/False
#      13.dropna()删除DataFrame对象元素缺失值    
#      14.fillna()覆盖/填充指定行/列DataFrame对象元素缺失值
#      14.drop_duplicates()保留指定行/列DataFrame对象元素重复值
#      15.to_csv()、to_excel()、to_json()、to_sql()、to_hdf()、to_feather()保存为csv、excel、
#      json、sql、hdf、feather文件

Matplotlib库

import numpy as np
from pandas import Series, DataFrame
import pandas as pd
import matplotlib.pyplot as plt# 线形图    柱状图    直方图    饼图    散点图
x = np.array([1, 2, 3, 4, 5])
# 设置线形图坐标系大小比例
fig = plt.figure(figsize=(3, 3))
# 绘制x轴为x,y轴为x+3的线形图
plt.plot(x, x+3, label='x, x+3')
# 绘制x轴为x,y轴为x+4的线形图
plt.plot(x, x+4, label='x, x+4')
# 线形图图例生效
plt.legend()
# 设置线形图坐标系x轴
plt.xlabel('x')
# 设置线形图坐标系y轴
plt.ylabel('y')
# 设置线形图坐标系标题
plt.title('function')
# 线形图保存
fig.savefig(r'D:CodeKitProjectea.WPSProjectaa.image.png')
# 绘制x轴为x,y轴为x+3的柱状图
plt.bar(x, x+3)
# 绘制x轴三十划分从0到10的30个随机整数的直方图
plt.hist(np.random.randint(0, 10, size=((30, ))), bins=30)
# 绘制图例圆心距为0.3,元素圆心距为0.1、0.2、0.3、0.4、0.5,元素占比六位小数的饼图
plt.pie(x, labels=['a', 'b', 'c', 'd', 'e'], labeldistance=0.3, explode=[0.1, 0.2, 0.3, 0.4, 0.5], autopct='%.6f')
# 绘制x轴为x,y轴为x**2-3的散点图
plt.scatter(x, x**2-3)# matplotlib.pyplot模块
# 方法:1.figure()创建图表对象    2.plot()绘制现形图    3.legend()图例生效    
#      4.xlabel()设置x轴    5.ylabel()设置y轴    6.title()设置标题    7.savefig()图表对象保存
#      8.bar()绘制柱状图    9.hist()绘制直方图    10.pie()绘制饼图    11.scatter()绘制散点图

案例

金融量化

1.利用tushare获取茅台股票历史行情数据。
2.查询茅台股票收盘比开盘上涨3%以上的日期。
3.查询茅台股票开盘比前日收盘跌幅超过2%的日期。
4.假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天为止,我的收益如何?

# 财经数据接口包
import tushare as ts
import numpy as np
from pandas import Series, DataFrame
import pandas as pd# 设置token、初始化pro接口
pro = ts.pro_api('394b81aff32117a630ae1acd0807773537423cdc5beaaa1f0ded129c')
# 获取倒序2001年1月1日茅台股票日线数据
df = pro.daily(ts_code='600519.SH', start='2001-01-01')[::-1]
# 茅台股票日线数据保存为csv文件
df.to_csv(r'D:CodeKitProjectea.WPSProjectaa.maotai.csv')
# 读取茅台股票日线数据csv文件
df = pd.read_csv(r'D:CodeKitProjectea.WPSProjectaa.maotai.csv')# 删除茅台股票DataFrame对象的Unnamed: 0、pre_close、change、pct_chg、amount列索引元素,作用在原DataFrame对象中
df.drop(labels=['Unnamed: 0', 'pre_close', 'change', 'pct_chg', 'amount'], axis=1, inplace=True)
# 查看茅台股票DataFrame对象trade_date列索引元素数据类型
df.loc[:, 'trade_date'].dtype
# 茅台股票DataFrame对象trade_date列索引元素转为时间序列类型,格式化输出
df.loc[:, 'trade_date'] = pd.to_datetime(df.loc[:, 'trade_date'], format='%Y%m%d')
# 茅台股票DataFrame对象trade_date列索引设为行索引
df.set_index('trade_date', inplace=True)# (收盘-开盘)/开盘>0.03
df.loc[(df.loc[:, 'close']-df.loc[:, 'open'])/df.loc[:, 'open']>0.03].index
# (开盘-前日收盘)/前日收盘<-0.02
df.loc[(df.loc[:, 'open']-df.loc[:, 'close'].shift(1))/df.loc[:, 'close'].shift(1)<-0.02].index
# 获取每月第一个交易日DataFrame对象
month_df = df.loc['2010-01':'2023-10'].resample('M').first()
# 获取每年最后一个交易日DataFrame对象
year_df = df.loc['2010-01':'2023-10'].resample('A').last()[:-1]
# 每月第一个交易日DataFrame对象开盘价求和乘100
cost = month_df.loc[:, 'open'].sum(axis=0)*100
# 每年最后一个交易日DataFrame对象开盘价求和乘1200
resv = year_df.loc[:, 'open'].sum(axis=0)*1200
# 最后一天收盘价乘1000
re_resv = df.loc[:, 'close'][-1]*1000
# 收入+剩余股票价值-花销
(resv+re_resv-cost)

thshare设置token并初始化pro接口的三种方式

import tushare as ts# 方式一
pro = ts.pro_api('89c82d7314f4d858e4b2275d986fe0a020a9e83a2eeba0cb35759a63')# 方式二
ts.set_token('89c82d7314f4d858e4b2275d986fe0a020a9e83a2eeba0cb35759a63')
pro = ts.pro_api()# 方式三
# 从命令行或配置文件获取token    第一次调用需输入token并保存在~/.tushare/token中
ts.set_token(ts._token())
pro = ts.pro_api()

1.使用tushare包获取某股票的历史行情数据。
2.计算该股票历史数据的5日均线和60日均线。
3.分析输出所有金叉日期和死叉日期。
4.如果我从假如我从2010年1月1日开始,初始资金为100000元,金叉尽量买入,死叉全部卖出,则到今天为止,我的炒股收益率如何? 

import numpy as np
from pandas import Series, DataFrame
import pandas as pd
import matplotlib.pyplot as plt
# 图形输出嵌入在notebook或控制台中
%matplotlib inline# 读取茅台股票日线数据csv文件
df = pd.read_csv(r'D:CodeKitProjectea.WPSProjectaa.maotai.csv')
# 删除茅台股票DataFrame对象的Unnamed: 0、pre_close、change、pct_chg、amount列索引元素,作用在原DataFrame对象中
df.drop(labels=['Unnamed: 0', 'pre_close', 'change', 'pct_chg', 'amount'], axis=1, inplace=True)
# 茅台股票DataFrame对象trade_date列索引元素转为时间序列类型,格式化输出
df.loc[:, 'trade_date'] = pd.to_datetime(df.loc[:, 'trade_date'], format='%Y%m%d')
# 茅台股票DataFrame对象trade_date列索引设为行索引
df.set_index('trade_date', inplace=True)# 计算茅台股票收盘价五日移动平均值
ma5 = df.loc[:, 'close'].rolling(5).mean()
ma60 = df.loc[:, 'close'].rolling(60).mean()
# 绘制茅台股票收盘价五日移动平均线
plt.plot(ma5[60:261])
plt.plot(ma60[60:261])# 获取非空茅台股票收盘价移动平均值
df = df.iloc[60:]
ma5 = ma5.iloc[60:]
ma60 = ma60.iloc[60:]
# 茅台股票收盘价五日移动平均值先小后大于茅台股票收盘价六十日移动平均值
s_one = ma5<ma60
s_two = ma5>ma60
# 获取金叉死叉日期
golden_date = df.loc[~(s_one|s_two.shift(1))].index
death_date = df.loc[s_one&s_two.shift(1)].index# 本金、可变资金、持股数,创建金叉死叉标志Series对象并排序确定时间
capital = 100000
money = capital
shares = 0
s_one = Series(data=1, index=golden_date)
s_two = Series(data=0, index=death_date)
s = s_one._append(s_two)
s = s.sort_index()['2010-01':'2023-10']for i in range(0, len(s)):if s[i]==1:# 单价price = df.loc[s.index[i], 'open']# 手数hands = money//(price*100)# 持股数shares = hands*100# 剩余资金money -= price*shareselse:# 单价price = df.loc[s.index[i], 'open']# 获取资金money += price*sharesshares = 0
# 剩余股票价值
re_money = df.loc[:, 'close'][-1]*shares
# 总收益
(money+re_money-capital)

​​

​​

人口密度

1.导入文件,查看原始数据。
2.将人口数据和各州简称数据进行合并。
3.将合并的数据中重复的abbreviation列进行删除。
4.查看存在缺失数据的列。
5.找到有哪些state/region使得state的值为NaN,进行去重操作。
6.为找到的这些state/region的state项补上正确的值,从而去除掉state这一列的所有NaN。
7.合并各州面积数据areas。
8.我们会发现area(sq.mi)这一列有缺失数据,找出是哪些行。
9.去除含有缺失数据的行。
10.找出2010年的全民人口数据。
11.计算各州的人口密度。
12.排序,并找出人口密度最高的州。

import numpy as np
from pandas import Series, DataFrame
import pandas as pd# 读取csv文件    字段:state(州全称)    abbreviation(州简称)
abb = pd.read_csv(r'D:CodeKitProjectea.WPSProjectaa.state-abbrevs.csv')
# 读取csv文件    字段:state(州全称)    area (sq. mi)(州面积)
area = pd.read_csv(r'D:CodeKitProjectea.WPSProjectaa.state-areas.csv')
# 读取csv文件    字段:state/region(州简称)    ages(年龄)    year(年份)    population(人口)
pop = pd.read_csv(r'D:CodeKitProjectea.WPSProjectaa.state-population.csv')# 通过abb的abbreviation与pop的state/region进行state、ages、year、population数据的合并
abb_pop = pd.merge(abb, pop, left_on='abbreviation', right_on='state/region', how='outer')
# 删除abb_pop的abbreviation列索引元素,直接作用在abb_pop中
abb_pop.drop(labels='abbreviation', axis=1, inplace=True)
# 查看abb_pop含缺失值的列
abb_pop.loc[:, abb_pop.isnull().any(axis=0)]
# 对使得state为NaN的state/region进行去重
abb_pop.loc[abb_pop.loc[:, 'state'].isnull()].loc[:, 'state/region'].unique()
# 找到元素为PR的state/region索引,为其state索引添加Puerto Rico元素
abb_pop.loc[abb_pop.loc[abb_pop.loc[:, 'state/region']=='PR'].index, 'state'] = 'Puerto Rico'
# 找到元素为USA的state/region索引,为其state索引添加United States元素
abb_pop.loc[abb_pop.loc[abb_pop.loc[:, 'state/region']=='USA'].index, 'state'] = 'United States'# 通过abb_pop与area进行state、state/region、ages、year、population、area (sq. mi)数据的合并
abb_pop_area = pd.merge(abb_pop, area, how='outer')
# 获取area (sq. mi)含缺失值的行索引
drop_index = abb_pop_area.loc[abb_pop_area.loc[:, 'area (sq. mi)'].isnull()].index
# 删除area (sq. mi)缺失值索引元素
abb_pop_area.drop(labels=drop_index, axis=0, inplace=True)
# 查询ages为total且year为2010的人口数据
abb_pop_area.query('ages=="total"&year==2010')
# 计算人口密度
abb_pop_area.loc[:, 'density'] = abb_pop_area.loc[:, 'population']/abb_pop_area.loc[:, 'area (sq. mi)']
# 查询人口密度最大的州
abb_pop_area.sort_values(by='density', axis=0, ascending=False).iloc[0]['state']

政治献金

1.加载数据。
2.查看数据的基本信息。
3.指定数据截取,将如下字段的数据进行提取,其他数据舍弃。
    cand_nm :候选人姓名
    contbr_nm : 捐赠人姓名
    contbr_st :捐赠人所在州
    contbr_employer : 捐赠人所在公司
    contbr_occupation : 捐赠人职业
    contb_receipt_amt :捐赠数额(美元)
    contb_receipt_dt : 捐款的日期
4.对新数据进行总览,查看是否存在缺失数据。
5.用统计学指标快速描述数值型属性的概要。
6.空值处理。可能因为忘记填写或者保密等等原因,相关字段出现了空值,将其填充为NOT PROVIDE。
7.异常值处理。将捐款金额<=0的数据删除。
8.新建一列为各个候选人所在党派party。
9.查看party这一列中有哪些不同的元素。
10.统计party列中各个元素出现次数。
11.查看各个党派收到的政治献金总数contb_receipt_amt。
12.查看具体每天各个党派收到的政治献金总数contb_receipt_amt。
13.将表中日期格式转换为'yyyy-mm-dd'。
14.查看老兵(捐献者职业)DISABLED VETERAN主要支持谁 。

parties = {'Bachmann, Michelle': 'Republican','Romney, Mitt': 'Republican','Obama, Barack': 'Democrat',"Roemer, Charles E. 'Buddy' III": 'Reform','Pawlenty, Timothy': 'Republican','Johnson, Gary Earl': 'Libertarian','Paul, Ron': 'Republican','Santorum, Rick': 'Republican','Cain, Herman': 'Republican','Gingrich, Newt': 'Republican','McCotter, Thaddeus G': 'Republican','Huntsman, Jon': 'Republican','Perry, Rick': 'Republican'           }
months = {'JAN' : '1', 'FEB' : '2', 'MAR' : '3', 'APR' : '4', 'MAY' : '5', 'JUN' : '6', 'JUL' : '7', 'AUG' : '8', 'SEP' : '9', 'OCT': '10', 'NOV': '11', 'DEC' : '12'}import numpy as np
from pandas import Series, DataFrame
import pandas as pd# 读取政治献金大选数据csv文件
df = pd.read_csv(r'D:CodeKitProjectea.WPSProjectaa.')
# 查看政治献金DataFrame对象元素信息,判断是否存在缺失值
df.info()
# 统计学指标快速描述数值型数据
df.describe()
# 填充政治献金DataFrame对象缺失值元素
df.fillna(value='NOT PROVIDE', inplace=True)
# 删除政治献金DataFrame对象小于等于零的元素
drop_index = df.loc[df.loc[:, 'contb_receipt_amt']<=0].index
df.drop(labels=drop_index, axis=0, inplace=True)
# 候选人姓名列DataFrame对象元素映射合并
df.loc[:, 'party'] = df.loc[:, 'cand_nm'].map(parties)
# 党派列DataFrame对象元素去重
df.loc[:, 'party'].unique()
# 党派列DataFrame对象元素计数
df.loc[:, 'party'].value_counts()
# 党派分组获取DataFrameGroupby对象元素捐赠数额总和
df.groupby(by='party')['contb_receipt_amt'].sum()
# 捐赠日期、党派分组获取DataFrameGroupby对象元素捐赠数额总和
df.groupby(by=['contb_receipt_dt', 'party'])['contb_receipt_amt'].sum()
def conversion(date):day, month, year = date.split('-')month = months[month]return '20'+year+'-'+month+'-'+day
# 捐赠日期列DataFrame对象元素映射计算
df.loc[:, 'contb_receipt_dt'] = df.loc[:, 'contb_receipt_dt'].map(conversion)
veteran_df = df.loc[df.loc[:, 'contbr_occupation']=='DISABLED VETERAN']
# 候选人姓名分组获取DataFrameGroupby对象元素捐赠数额总和
upby(by='cand_nm')['contb_receipt_amt'].sum()

本文发布于:2024-02-02 10:34:26,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170684126343227.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:案例   基础   NumPy   Pandas   Matplotlib
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23