import pandas as pd
import tushare as ts
import matplotlib.pyplot as plt
#获取某值股票的历史行情
#code是股票代码
df = ts.get_k_data(code='600519',start= '2000-09-01')
#将互联网中数据存储到本地
df.to_csv('./maotai.csv')#使用to_xxx将 df中的数据写到本地进行存储
#将本地数据读取到df当中
df=pd.read_csv('./maotai.csv')
#删除指定的列
df.drop(labels='Unnamed: 0',axis=1,inplace=True)
print(df.head())
#查看数据类型
#print(df.info())
#将date列转换为时间序列
df['date'] = pd.to_datetime(df['date'])
print(df.head())
#将date作为原索引
df.set_index('date',inplace=True)
print(df.head())
#收盘价比开盘价高0.03
#df.loc取布尔值为true的行
date_rise = df.loc[((df['close'] -df['open'])/df['open'])>0.03].index
print(date_rise)
#输出开盘价比前日收盘价低2个点的日期
#series中向上/下移位df['close'].shift(1)是将colse列下移1行 -1是上移一行
date_decrease = df.loc[((df['open']-df['close'].shift(1))/df['close'].shift(1))<-0.02]
print(date_decrease)
#计算每个月看盘第一天买入1手股票年底最后一天卖出所有股票的收益
#计算买入总额度
#切片日期
df_b = df['2010-01':'2021-10']
#每个月取样
#resample()函数按照参数取样.first()取每次取样的第一个 last()取每次取样的最后一个
df_b = df_b.resample('M').first()
df_bo = df_b['open']
pay = df_bo.sum()*100
#print(pay)
#卖出收益
#按年重新取样是‘A’ 月是’M‘
df_r = df.resample('A').last()
df_r = df_r['open'][:-1]
rec = df_r.sum()*1200
last_month = df['close'][-1]*1000
rec_sum = rec +last_month
#print(rec_sum)
profit = rec_sum - pay
print('profit is ', profit)
#均线计算
#rolling().mean()计算移动窗口的均值
#import matplot.pyplot 中的plot()函数是制图
#plt.show()是显示出来图形
ma5 = df['close'].rolling(5).mean()
ma30 = df['close'].rolling(30).mean()
plt.plot(ma5)
plt.plot(ma30)
#plt.show()
#计算金叉和死叉的日期
a1 = ma5>ma30
a2 = ma5<ma30
#将a2向下平移一列
a2 = a2.shift(1)
death_ex = a1&a2
death_ex_date = df.loc[death_ex].index
print(death_ex_date)
gold_ex = a1|a2
gold_ex_date = df.loc[gold_ex].index
print('gold_ex_date are',gold_ex_date)
Dateframe格式中写入函数to_csv() ,读取函数 read_csv()。
查看数据类型info(),shift() 函数将dateframe中的列上移或下移一行下移是1 上移是-1,resample()函数进行重取样.first()取第一个 .last()取最后一个。
rolling().mean()函数计算移动窗口的均值。
Pandas中to_datetime()函数将日期转换为时间序列,参数format用来确定时间的格式format=’%Y%m%d’。
import pandas as pd
import numpy as np
from pandas import DataFrame
abb = pd.read_csv('./state-abbrevs.csv')#state(州的全称) abbreviation(州的简称)
areas = pd.read_csv('./state-areas.csv')#state(州的全程)area (sq.mi)州的面积
population = pd.read_csv('./state-population.csv')#state/region简称,ages年龄,year时间,population人口
#将人口数据和各州简称进行合并,如果想保留所有数据一定要用外连接 内连接只合并可以合并的数据
abb_pop = pd.merge(abb,population,left_on='abbreviation',right_on='state/region',how='outer')
#将合并数据中重复的列abbreviation删除
abb_pop = abb_pop.drop(labels='abbreviation',axis=1)
#查看存在缺失数据的列
#方式1:isnull,notll,any,all
print(abb_pop.isnull().any(axis=0))
#找到有哪些s'tate/region使得state的值为Nan并进行去重操作
#思路 先将state为Nan的数据取出来 再找state/region的值
#将state为Nan的数据取出
a = abb_pop.loc[abb_pop['state'].isnull()]
#将简称取出
b = a['state/region']
#series中去重操作是unique()
print(b.unique())
#未找到的这些state/region的state项补上正确的值,从而去除掉state这一列的所有Nan
#先将state/region是usa和pr的行的索引取出来
index_usa = abb_pop.loc[abb_pop['state/region'] == 'USA'].index
index_pr = abb_pop.loc[abb_pop['state/region'] == 'PR'].index
#进行赋值
#.iloc函数获得行索引的数字
abb_pop.loc[index_usa,'state'] = 'United state'
abb_pop.loc[index_pr,'state'] = 'ppprrr'
print(abb_pop.loc[abb_pop['state/region'] == 'USA'])
#合并各州面积数据areas
abb_pop_areas = pd.merge(abb_pop,areas,how='outer')
print(abb_pop_areas.head())
#我们会发现area(sq.mi)这一列有缺失数据,找出是那行
index_null_area = abb_pop_areas.loc[abb_pop_areas['area (sq. mi)'].isnull()].index
#print(index_null_area)
#去除含有缺失数据的行
#删除行 axis=0 删除列axis = 1
#inplace 参数表明可对原数组作出修改并返回一个新数组。不管参数默认为False还是设置为True,原数组的内存值是不会改变的,区别在于原数组的内容是否直接被修改。默认为False,表明原数组内容并不改变,如果我们需要得到改变后的内容,需要将新结果赋给一个新的数组,即data = data.drop(['test','test2'],1)。如果将inplace值设定为True,则原数组内容直接被改变。
abb_pop_areas.drop(labels=index_null_area,axis=0,inplace=True)
#找出2010年的全民人口数据
#series中的查询函数query
pop_2010 = abb_pop_areas.query('ages == "total" & year == 2010')
print(pop_2010.head())
#计算各州的人口密度
abb_pop_areas['midu'] = abb_pop_areas['population']/abb_pop_areas['area (sq. mi)']
print(abb_pop_areas.head())
#排序找出人口密度最高的州
#根据值排序sort_values() 参数ascending = True表示升序 False 表示降序
abb_pop_areas = abb_pop_areas.sort_values(by='midu',axis=0,ascending=True)
print(abb_pop_areas.head())
pandas中的合并函数merge()其中参数how=‘outer’表示外连接,外连接会保留所有数据,内连接只会合并可以合并的数据.
dateframe中查看缺失的数据isnull().
series中的去重操作是unique().
dateframe中drop()函数的nplace 参数表明可对原数组作出修改并返回一个新数组。不管参数默认为False还是设置为True,原数组的内存值是不会改变的,区别在于原数组的内容是否直接被修改。默认为False,表明原数组内容并不改变,如果我们需要得到改变后的内容,需要将新结果赋给一个新的数组,即data = data.drop([‘test’,‘test2’],1)。如果将inplace值设定为True,则原数组内容直接被改变。
series中的查询函数query()。根据值排序函数sort_values(by=’’,axis=,ascending=True),ascending = True表示升序False表示降序。
import pandas as pd
parties = {
'Bachmann, Michelle':'Republican',
'Romney, Mitt':'Republican',
'Obama, Barack':'Demorat',
"Roemer, Charles E. 'Buddy' III": 'Reform',
'Pawlenty, Timothy': 'Republican',
'Johnson, Gary Earl': 'Libertarian',
'Paul, Ron': 'Republican',
'Santorum, Risk':'Republican',
'Cain, Herman' : 'Republican',
'Gingrich, Newt':'Republican',
'MoCotter, 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}
of_interest = ['Obama, Barack','Romney, Mitt','Santorum, Risk','Paul, Ron','Gingrich, Newt']
df = pd.read_csv('./usa_election.txt')
print(df.head())
#对数据进行总览
print(df.info())
#用统计学指标快速描述数值型属性的概要 *数值型属性
#print(df.describe())
#空值处理。 可能因为忘记填写或者保密等等原因,相关字段出现了空值,将其填充为NOT PROVIDE
#空值填充函数fillna
df.fillna(value = 'Not Provide',inplace = True)
#异常值处理。将捐款金额<=0的数据删除
drop_index = df.loc[df['contb_receipt_amt']<=0].index
df = df.drop(labels=drop_index,axis=0)
print(df.info())
#新建一列为各个候选人所在党派的party
df['party'] = df['cand_nm'].map(parties)
print(df.head())
#查看party这一列中有哪些不同的元素
print(df['party'].unique())
#统计party列中各个元素出现的次数
print(df['party'].value_counts())
#查看各个党派收到的政治现金总数contb_receipt_amt
#分组函数groupby()
print(df.groupby('party')['contb_receipt_amt'].sum())
#将表中日期格式转换为‘yyyy-mm-dd'
def transform(d):
day,month,year = d.split('-')
month = months[month]
return '20'+year+'-'+str(month)+'-'+day
df['contb_receipt_dt'] = df['contb_receipt_dt'].map(transform)
print(df['contb_receipt_dt'])
#查看老兵(捐献者职业)Disabled veteran主要支持谁
#取出老兵的行数据
df_old = df.loc[df['contbr_occupation'] == 'DISABLED VETERAN']
#根据候选人分组
print(df_old.groupby(by = 'cand_nm')['contb_receipt_amt'].sum())
Dataframe函数中的空值填充函数.fillna(),计算某个值出现的次数函数value_counts().
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
#数据预处理
#参数header = None表示没有列索引
#参数sep = ’\s+'表示以n个空格为分割
#参数names 给列的名字赋值
df = pd.read_csv('./CDNOW_master.txt',header=None,sep='\s+',names = ['user_id','order_dt','order_product','order_amount'])
print(df.head())
#将order_dt转换为时间类型
#参数format用来确定时间的格式
df['order_dt'] = pd.to_datetime(df['order_dt'],format='%Y%m%d')
print(df.head())
#print(df.describe())
#基于order_dt 取出其中的月份
df['month'] = df['order_dt'].astype('datetime64[M]')
#将原始数据中添加一列表示月份:astype('datetime64[M]')
print(df.head())
#用户每月花费的总金额
# 绘制曲线图展示
amount_sum = df.groupby('month')['order_amount'].sum()
print(amount_sum)
#plt.plot(amount_sum)
#plt.show()
#所有用户每月的产品购买量
product_sum = df.groupby(by ='month')['order_product'].sum()
print(product_sum)
#所有用户的的每月消费总次数
times_sum = df.groupby(by = 'month')['order_amount'].sum()
print(times_sum)
#统计每月的消费人数
people_sum = df.groupby(by = 'month')['user_id'].count()
print(people_sum)
#用户消费总金额和消费总次数的统计描述
user_amount = df.groupby(by = 'user_id')['order_amount'].sum()
user_times = df.groupby(by='user_id').count()['order_dt']
#用户消费金额和消费产品数量的散点图
user_product = df.groupby(by = 'user_id')['order_product'].sum()
#散点图函数scatter()
#plt.scatter(user_product,user_amount)
#各个用户消费总金额的直方分布图(消费金额在1000之内的分布)
#直方图函数hist()
user_amount = df.groupby(by = 'user_id').sum().query('order_amount <= 1000')['order_amount']
#plt.hist(user_amount)
#各个用户消费的总数量的直方分布图(消费商品的数量在100次之内的分布)
user_product = df.groupby(by = 'user_id').sum().query('order_product<100')['order_product']
plt.hist(user_product)
plt.show()
#用户消费行为分析
#用户第一次消费的月份分布和人数统计 绘制线型图
#数目统计函数value。counts()
user_first = df.groupby(by = 'user_id')['month'].min()
user_first.value_counts().plot()
#用户最后一次消费的时间分布,和人数统计 绘制线型图
user_last = df.groupby(by='user_id')['month'].max()
user_last.value_counts().plot()
plt.show()
#新老客户的占比 消费一次为新客户 消费多次为老用户
user_judge = df.groupby(by = 'user_id')['month'].agg(['min','max'])
#分析出每一个用户的第一次消费和最后一次消费的时间
#agg([func1,func2]):对分组后的结果进行指定聚合
new_num = (user_judge['min'] ==user_judge['max']).value_counts()
#分析出新老客户的消费比例
print(new_num)
#用户分层 分析得出 每个用户的总购买量和总消费金额and最后一次消费的时间的表格rfm
#dateframe中的透视表函数pivot_table()中的参数aggfunc()聚合方式 默认是求均值
rfm = df.pivot_table(index='user_id',aggfunc={'order_product':'sum','order_amount':'sum','order_dt':'min'})
#RFM模型设计 R表示客户最近一次交易时间的间隔 /np.timedelta64(1,'D'):去除days
#最近的日期
date_max = df['order_dt'].max()
rfm['R'] = (date_max - rfm['order_dt'])/ np.timedelta64(1,'D')
#更改rfm表格中的列索引名称 使用函数columns
rfm.drop(labels = 'order_dt',axis=1,inplace = True)
rfm.columns = ['M','F','R']
#F表示客户购买商品的总数量,F值越大,表示客户交易越频繁,反之则表示客户交易不够活跃
#M表示客户交易的金额,M越大表示客户价值越高 将rfm作用到rfm表中
def rfm_func(x):
level = x.map(lambda x:'1'if x>=0 else '0')
label = level.R + level.F +level.M
dict1 = {'111':'重要保证客户','011':'重要保持客户','101':'重要挽留客户','001':'重要发展客户','110':'一般价值客户','010':'一般保持客户'
,'100':'一般挽留客户','000':'一般发展客户'}
return dict1[label]
#dateframe中的df.apply(func)可以对df中的行或者列进行(func)形式的运算 默认进行列运算
rfm['label'] = rfm.apply(lambda x: x- x.mean()).apply(rfm_func,axis = 1)
print(rfm)
#转置函数.T
#Dataframe中 apply和applymap中的区别 apply应用与datafrme中的每一行或者一列作为输入 applymap用每一个元素进行输入
#applymap返回 dataframe apply返回 series
pandas中的pd.read_csv()函数的参数header=None表示没有列索引,sep=’\s+’ 表示以n个空格为分割,参数names给列的名字赋值。
matplotlib.pyplot中的散点图函数scatter(),直方图函数hist()。
agg([func1,func2]):对分组后的结果进行指定聚合。
dateframe中的透视表函数pivot_table()中的参数aggfunc()聚合方式 默认是求均值。
更改rfm表格中的列索引名称 使用函数columns。dateframe中的df.apply(func)可以对df中的行或者列进行(func)形式的运算 默认进行列运算。
转置函数.T。
Dataframe中 apply和applymap中的区别 apply应用与datafrme中的每一行或者一列作为输入 applymap用每一个元素进行输入。
applymap返回 dataframe apply返回 series。