- 股票分析
- 人口数据分析
- 美国大选
- 用户数据分析
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 = ma5Dateframe格式中写入函数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返回 seriespandas中的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。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)