Pandas

import numpy as np
import pandas as pd

# DataFrame是一个既有行索引又有列索引的二维数据结构
ones = np.ones((2, 3))
ones_df = pd.DataFrame(ones)
"""
[[1. 1. 1.]
 [1. 1. 1.]]

      0    1    2
0  1.0  1.0  1.0
1  1.0  1.0  1.0
"""
print(ones)
print("\n", ones_df)

# 局部展示
# a.head()  # 默认展示前5行,可在head()加入数字,展示前几行
# a.tail()  # 默认展示后5行,可在tail()加入数字,展示后几行
# 获取索引和值
# a.index     #获取行索引
# 返回一个类似列表的东西,也可以利用数字继续索引例:a.index[1]
# a.columns   #获取列索引
# a.values    #获取数据值(数组,不含索引)
# a.shape     #获取DataFrame的维度数据
# a.T         #获取转制后的dataframe

# 设置行列索引
# 创建一个符合正态分布的10个股票5天的涨跌幅数据
stock_change = np.random.normal(0, 1, (10, 5))
pd.DataFrame(stock_change)
# 设置行列索引
stock = ["股票{}".format(i) for i in range(10)]
date = pd.date_range(start="20220101", periods=5, freq="B")  # 这个是pandas中设置日期
# 添加行列索引
data = pd.DataFrame(stock_change, index=stock, columns=date)
"""
     2022-01-03  2022-01-04  2022-01-05  2022-01-06  2022-01-07
股票0   -1.112264   -0.561823   -2.087585    0.612472   -0.985394
股票1    1.830347   -1.897625   -1.113973   -1.812074    0.282228
"""
print(data.head(2))

# 修改索引
# 不能单独修改行列总某一个索引的值,可以替换整行或整列   例:b.index[2]='股票1'  错误
# data.index=新行索引
# 重设索引
data.reset_index(drop=False)
# drop参数默认为False,表示将原来的索引替换掉,换新索引为数字递增,原来的索引将变为数据的一部分。True表示,将原来的索引删除,更换为数字递增

# 设置新索引
df = pd.DataFrame({'month': [1, 4, 7, 10],
                   'year': [2012, 2014, 2013, 2014],
                   'sale': [55, 40, 84, 31]})
# 以月份设置新的索引
df.set_index("month", drop=True)
# 即将原本数据中的一列拿出来作为index
new_df = df.set_index(["year", "month"])  # 设置多个索引,以年和月份   多个索引其实就是MultiIndex
"""
   month  year  sale
0      1  2012    55
1      4  2014    40
2      7  2013    84
3     10  2014    31
            sale
year month      
2012 1        55
2014 4        40
2013 7        84
2014 10       31
"""
print(df)
print(new_df)

# Series
# 创建
# data = pd.Series(np.arange(3, 9, 2), index=["a", "b", "c"])
# 或
# data = pd.Series({'red': 100, 'blue': 200, 'green': 500, 'yellow': 1000})

# sr = data.iloc[1, :]
# print(sr.index)   # 索引
# print(sr.values)  # 值
# 就是从dataframe中抽出一行或一列来观察

# 索引操作
# data=pd.read_csv("./stock_day/stock_day.csv")#读入文件的前5行表示如下
# 利用drop删除某些行列,需要利用axis告知函数是行索引还是列索引
# data=data.drop(["ma5","ma10","ma20","v_ma5","v_ma10","v_ma20"], axis=1) # 去掉一些不要的列
# data["open"]["2018-02-26"] # 直接索引,但需要遵循先列后行
# 按名字索引利用.loc函数可以不遵循列行先后关系
# data.loc["2018-02-26"]["open"] # 按名字索引
# data.loc["2018-02-26", "open"]
# 利用.iloc函数可以只利用数字进行索引
# data.iloc[1][0] # 数字索引
# data.iloc[1,0]
# 组合索引
# 获取行第1天到第4天,['open', 'close', 'high', 'low']这个四个指标的结果
# 但仍可利用loc和iloc
# data.loc[data.index[0:4], ['open', 'close', 'high', 'low']]
# data.iloc[0:4, data.columns.get_indexer(['open', 'close', 'high', 'low'])]

# 赋值操作
# data.open=100
# data['open']=100
# 两种方式均可
# data.iloc[1,0]=100
# 找好索引即可

# 排序
# data.sort_values(by="high", ascending=False) # DataFrame内容排序,ascending表示升序还是降序,默认True升序
# data.sort_values(by=["high", "p_change"], ascending=False).head() # 多个列内容排序。给出的优先级进行排序
# data.sort_index(ascending=True)# 对行索引进行排序
# 这里是取出了一列 “price_change”列,为serise,用法同上
# sr = data["price_change"]
# sr.sort_values(ascending=False)
# sr.sort_index()

# 算术运算
# 正常的加减乘除等的运算即可
# data["open"] + 3
# data["open"].add(3) # open统一加3
# data.sub(100)# 所有统一减100 data - 100
# (data["close"]-(data["open"])).head() # close减open

# 逻辑运算 :< ; > ; | ; & 利用逻辑符号或者函数query
# 例如筛选p_change > 2的日期数据
# data[data["p_change"] > 2].head()
# 完成一个多个逻辑判断, 筛选p_change > 2并且low > 15
# data[(data["p_change"] > 2) & (data["low"] > 15)].head()
# data.query("p_change > 2 & low > 15").head()  # 等效于上一行代码
# 判断'turnover'列索引中是否有4.19, 2.39,将返回一列布尔值
# data["turnover"].isin([4.19, 2.39])
# data[data["turnover"].isin([4.19, 2.39])]
# 这块就将返回turnover列布尔值为true的如下图,也就是筛选出turnover中值为4.19和2.39
# 布尔值索引是一个很方便的数据筛选操作,比如:
# data[data["turnover"]>0.1]
# 也将筛选出turnover列中大于0.1的整体data数据,并不是说只返回turnover相关数据,判断只是返回布尔索引,利用索引的是data数据

# 统计运算
# data.describe()
# 将返回关于列的最值,均值,方差等多种信息
# data.max(axis=0)#返回最值
# data.idxmax(axis=0) #返回最值索引

# 累计统计函数(累加,累乘等)
# cumsum 计算前1/2/3/…/n个数的和
# cummax 计算前1/2/3/…/n个数的最大值
# cummin 计算前1/2/3/…/n个数的最小值
# cumprod 计算前1/2/3/…/n个数的积

# 自定义运算
# data.apply(lambda x: x.max() - x.min())
# 这里的lambda x: x.max() - x.min()是lambda表达式,是函数的简单写法也可
# def fx(data):
# 	return	data.max()-data.min()

# 画图
from pandas import DataFrame

# DataFrame.plot
# 更简易用matplotlib
# data.plot(x="volume", y="turnover", kind="scatter")
# data.plot(x="high", y="low", kind="scatter")
# data['volume'].plot()

# 文件读取写入
# DataFrame.to_csv(path_or_buf=None,sep=','columns=None,header=True,index=True,index_label=None,mode='w',encoding=None)
# path_or_buf :string or file handle , default None
# sep : character, default ‘,’(分隔符)
# columns :sequence,optional
# mode:'w‘:重写,'a’追加
# index:是否写入 行索引
# header:boolean or list of string,default True,是否写进列索引值

# Series.to_csv (path=None,index=True,sep=',',na_rep='',float_format=None,header=False,index_label=None,mode='w',encoding=None,compression=None,date_format=None,decimal='.)

# pd.read_csv("./stock_day/stock_day.csv", usecols=["high", "low", "open", "close"]).head() # 读哪些列
# data = pd.read_csv("stock_day2.csv", names=["open", "high", "close", "low", "volume", "price_change", "p_change", "ma5", "ma10", "ma20", "v_ma5", "v_ma10", "v_ma20", "turnover"]) # 如果列没有列名,用names传入
# data[:10].to_csv("test.csv", columns=["open"]) # 保存open列数据
# data[:10].to_csv("test.csv", columns=["open"], index=False, mode="a", header=False) # 保存opend列数据,index=False不要行索引,mode="a"追加模式|mode="w"重写,header=False不要列索引

# read_csv()
# to_csv()
# read_hdf()
# to_hdf()
# read_json
# to_json

# 缺失值处理
# inplace实现数据替换(默认为False)
# dropna实现缺失值的删除(默认删除行)
# fillna实现缺失值的填充
# isnull或notnull判断是否有缺失数据NaN

# pd.isnull(df) 会返回整个dataframe的布尔框架,难以观察(bool为True代表那个位置是缺失值)
# pd.isnull(df).any() 表示只要有一个True就返回True
# pd.notnull(df)会返回整个dataframe的布尔框架,难以观察(bool为False代表那个位置是缺失值)
# pd.notnull(df).all() 表示只要有一个False就返回False

# df.dropna(inplace=True) 默认按行删除 inplace:True修改原数据,False返回新数据,默认False


# 实例
# import pandas as pd
# import numpy as np

# movie = pd.read_csv("./IMDB/IMDB-Movie-Data.csv")
# 1)判断是否存在NaN类型的缺失值
# np.any(pd.isnull(movie))   # 返回True,说明数据中存在缺失值
# np.all(pd.notnull(movie))  # 返回False,说明数据中存在缺失值
# pd.isnull(movie).any()
# pd.notnull(movie).all()
# 2)缺失值处理
# 方法1:删除含有缺失值的样本
# data1 = movie.dropna()
# pd.notnull(data1).all()
# 方法2:替换
# 含有缺失值的字段
# Revenue (Millions)
# Metascore
# movie["Revenue (Millions)"].fillna(movie["Revenue (Millions)"].mean(), inplace=True)
# movie["Metascore"].fillna(movie["Metascore"].mean(), inplace=True)
# 读取数据
# path = "wisconsin.data"
# name = ["Sample code number", "Normal Nucleoli", "Mitoses", "Class"]
# data = pd.read_csv(path, names=name)
# 这里的非nan标记值缺失值就是利用“?”表示的,因此利用参数to_replace,value=np.nan,将默认标记值替换为nan值,然后再利用签署方法处理nan缺失值
# 1)替换
# data_new = data.replace(to_replace="?", value=np.nan)

# 离散化
# 1)准备数据
data = pd.Series([165, 174, 160, 180, 159, 163, 192, 184],
                 index=['No1:165', 'No2:174', 'No3:160', 'No4:180', 'No5:159', 'No6:163', 'No7:192', 'No8:184'])
# 2)分组
# 自动分组
sr = pd.qcut(data, 3)
# print(f'sr:\n{sr}')
# print(sr.value_counts())  # 看每一组有几个数据
# 3)转换成one-hot编码
sr_hot_a = pd.get_dummies(sr, prefix="height")
print(sr_hot_a)
# 自定义分组
bins = [150, 165, 180, 195]  # 这就表示有三组[150,165][165,180][180,195]
sr = pd.cut(data, bins)
# get_dummies
sr_hot_u = pd.get_dummies(sr, prefix="身高")
print(sr_hot_u)

# 合并
# 按照方向
# pd.concat([data1, data2], axis=1)
# axis:0为列索引;1为行索引
# 按照索引
# pd.merge(left, right, how="inner", on=["key1", "key2"])
# pd.merge(left, right, how="left", on=["key1", "key2"])
# pd.merge(left, right, how="outer", on=["key1", "key2"])
# 这里merge参数解释:
# left: 需要合并的一个表,合并后在左侧
# right:需要合并的一个表,合并后在右侧
# how: 合并方式
# on: 在哪些索引上进行合并

# 交叉表
# data = pd.crosstab(stock["week"], stock["pona"])
# data.div(data.sum(axis=1), axis=0).plot(kind="bar", stacked=True)

# 透视表
# 透视表操作
# stock.pivot_table(["pona"], index=["week"])

# 分组与聚合
# col =pd.DataFrame({'color': ['white','red','green','red','green'], 'object': ['pen','pencil','pencil','ashtray','pen'],'price1':[5.56,4.20,1.30,0.56,2.75],'price2':[4.75,4.12,1.60,0.75,3.15]})
# 进行分组,对颜色分组,price1进行聚合
# 用dataframe的方法进行分组
# col.groupby(by="color")
# 或者用Series的方法进行分组聚合
# col["price1"].groupby(col["color"])

# 实例
# # 1、准备数据
# movie = pd.read_csv("./IMDB/IMDB-Movie-Data.csv")
# # movie读入后如上图所示
# # 问题1:我们想知道这些电影数据中评分的平均分,导演的人数等信息,我们应该怎么获取?
# # 评分的平均分
# movie["Rating"].mean()
# # 导演的人数
# np.unique(movie["Director"]).size
# # 绘制直方图查看分布
# movie["Rating"].plot(kind="hist", figsize=(20, 8))
# # 利用matplotlib可更细致绘图
# import matplotlib.pyplot as plt
#
# # 1、创建画布
# plt.figure(figsize=(20, 8), dpi=80)
# # 2、绘制直方图
# plt.hist(movie["Rating"], 20)
# # 修改刻度
# plt.xticks(np.linspace(movie["Rating"].min(), movie["Rating"].max(), 21))
# # 添加网格
# plt.grid(linestyle="--", alpha=0.5)
# # 3、显示图像
# plt.show()
# # 如果我们希望统计电影分类(genre)的情况,应该如何处理数据?
# # 可以发现图中genre一列数据中每个电影都有多种标签,因此要先分割
# # 先统计电影类别都有哪些
# movie_genre = [i.split(",") for i in movie["Genre"]]
# # 这一块主要是把movie_genre的二维列表变为以为列表,然后利用unique函数去重
# movie_class = np.unique([j for i in movie_genre for j in i])
# len(movie_class)  # 这就得到了电影的类型标签种类数
# # 统计每个类别有几个电影
# count = pd.DataFrame(np.zeros(shape=[1000, 20], dtype="int32"), columns=movie_class)
# count.head()
# # 计数填表
# for i in range(1000):
#     count.ix[i, movie_genre[i]] = 1  # 注意ix现在不太能用了
#     # movie_genre[i]将返回字符索引列
# # 这就得到了下面第三张图片的数据处理效果,列表示电影类型种类,行表示不同电影
# # 因此只需逐列求和即可得到每类标签电影的数量
# count.sum(axis=0).sort_values(ascending=False).plot(kind="bar", figsize=(20, 9), fontsize=40, colormap="cool")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值