pandas

pandas

#有許多數據結構,比python多python

0 .panda的導入 以及df,Series

導入pandas:數組

import pandas as pd
from pandas import DataFrame,Series
import numpy as np數據結構

一.Series

Series是一種相似與一維數組的對象,由下面兩個部分組成:dom

  • values:一組數據(ndarray類型)
  • index:相關的數據索引標籤

a.Series的建立

兩種建立方式:
(1) 由列表建立
默認索引爲0到N-1的整數型索引

使用列表建立Series

Series(data=[1,2,3])函數

1565615774441

自帶隱形索引設計

能夠經過設置index參數指定索引code

s = Series(data=[1,2,3],index=['a','b','c'])對象

(2) 由numpy數組建立

Series(data=np.random.randint(0,100,size=(3,)))索引

1565615834007

由numpy數組建立ip

b.Series的索引和切片

1565616135498

c.Series的基本概念

1查看去重相加

s.head() : 查看前n個

tail() : 查看後n個值

s.unique() : Series元素進行去重

當索引沒有對應的值時,可能出現缺失數據顯示NaN(not a number)的狀況

使得兩個Series進行相加

s1 = Series(data=[1,2,3,4],index=['a','b','c','d'])
s2 = Series(data=[1,2,3,4],index=['a','b','e','d'])
s = s1 + s2
1565619955813

2 使用函數檢測缺失數據

pd.isnull(),

pd.notnull(),

s.isnull(),

notnull()

1565620001583

s[[True,True,False,False,True]] #若是將布爾值做爲Serrise的索引,則只保留True對應的元素值 # 根據這一屬性 後面提取符合條件的值 當有判斷時, 做業裏用到

1565620021958

s[s.notnull()]

1565620096527

3 Series之間的運算
  • 在運算中自動對齊不一樣索引的數據
  • 若是索引不對應,則補NaN

2、DataFrame

DataFrame是一個【表格型】的數據結構。DataFrame由按必定順序排列的多列數據組成。設計初衷是將Series的使用場景從一維拓展到多維。DataFrame既有行索引,也有列索引。

  • 行索引:index
  • 列索引:columns
  • 值:values

a. DataFrame的建立

最經常使用的方法是傳遞一個字典來建立。DataFrame以字典的鍵做爲每一【列】的名稱,以字典的值(一個數組)做爲每一列。

此外,DataFrame會自動加上每一行的索引。

使用字典建立的DataFrame後,則columns參數將不可被使用。

同Series同樣,若傳入的列與字典的鍵不匹配,則相應的值爲NaN。

1 由numpy數組建立

DataFrame(data=np.random.randint(60,100,size=(3,4)))

1565620335701

多維的

(1) 自定義索引

df = DataFrame(data=np.random.randint(60,100,size=(3,4)),index=['A','B','C'],columns=['a','b','c','d'])

1565620409879

b.DataFrame屬性

values、columns、index、shape

values

array([[92, 67, 79, 68],
       [84, 66, 61, 66],
       [84, 79, 66, 82]])

columns Index(['A', 'B', 'C'], dtype='object')

index Index(['a', 'b', 'c', 'd'], dtype='object')

shape (3, 4)

c.字典格式

dic = {
'張三':[150,150,150,150],
'李四':[0,0,0,0]
}
df = DataFrame(data=dic,index=['語文','數學','英語','理綜'])
df

1565620565783

d.DataFrame的索引

1 對列進行索引
- 經過相似字典的方式  df['q']
- 經過屬性的方式     df.q

能夠將DataFrame的列獲取爲一個Series。返回的Series擁有原DataFrame相同的索引,且name屬性也已經設置好了,就是相應的列名。

df = DataFrame(data=np.random.randint(60,100,size=(3,4)),index=['A','B','C'],columns=['a','b','c','d'])
df

1565620709069

size(3,4) 必須和index 行 columns 列對應

獲取前兩列

df[['a','c']]

(1) 修改列索引

df.columns = ['a','c','b','d']
df

1565620721950

2 對行進行索引
- 使用.loc[]加index來進行行索引
- 使用.iloc[]加整數來進行行索引

一樣返回一個Series,index爲原來的columns。

對第一行的索引:

​ df.iloc[0]
​ df.loc['A']

1565620870046

對第一二行的索引:

​ df.loc[['A','B']]

1565620923891

3 對元素索引的方法
- 使用列索引
- 使用行索引(iloc[3,1] or loc['C','q']) 行索引在前,列索引在後

df.iloc[1,2] # 第二行第三列
df.loc[['B','C'],'b'] # 第B到C行,第b列

1565620979118

e.DataFrame的切片:

【注意】 直接用中括號時:

  • 索引表示的是列索引
  • 切片表示的是行切片

df[0:2] 行
df.iloc[:,0:2] 列
在loc和iloc中使用切片(切列) : df.loc['B':'C','丙':'丁']

1565621383696

1565621392169

1565621404994

f.總結:

  • 索引:
    • 取行:df.loc['A']
    • 取列:df['a']
    • 取元素:df.iloc[1,2]
  • 切片:
    • 切行:df[0:2]
    • 切列:df.iloc[:,0:2]

g.DataFrame的運算

DataFrame之間的運算

同Series同樣:

  • 在運算中自動對齊不一樣索引的數據
  • 若是索引不對應,則補NaN
  • 1565621590924

z. 小總結:

索引默認是列,因此用行的話,除了索引取值,ddd['語文':'語文'] 用 loc['語文']

切片默認是行 因此用列的話,除了取一列ddd['李四'],取多列,用loc[:,'張三':'李四']

作題

1565605299635

ddd.loc[:,'張三':'劉二']+10

1565605285987

回想

案例分析

1. 收成比開始漲幅3%的股票
2. 今日開比昨日收減幅2%的股票
思路把 昨日收往下下滑一行
shift[1]
而後以日期爲標識 
riqi = [([open]-[close])/close<3%].index
[riqi][]
3. 從2010年每個月第一個開買進1手,每一年末的第一個月賣出全部,若是到今天,能賺多少
dic['y']  = ['A'][-1]  # 去2019   顯示問題仍是對的
dic['m']  = ['M'][:-1]['open'].sum * 100  # 每一年每個月的
dic['L'] = ['M']['-1']['close']  # 每一年最後一個月的
dic['L'] * 1200 + dic['']

今日份錯誤:

size 沒有定義

DataFrame(data=np.random.randint(60,100,size(3,4)))

true:
DataFrame(data=np.random.randint(60,100,size=(3,4)))

做業

做業1

1 假設ddd是期中考試成績,ddd2是期末考試成績,請自由建立ddd2,並將其與ddd相加,求期中期末平均值。

ddd = DataFrame(data=np.random.randint(100,120,size=(4,4)),index=['語文','數學','英語','理綜'],columns=['張三','李四','王五','劉二'])
ddd2 = DataFrame(data=np.random.randint(100,120,size=(4,4)),index=['語文','數學','英語','理綜'],columns=['張三','李四','王五','劉二'])
ddd_avg = ddd+ddd2
ddd_avg.mean()

1565615322835

2 假設張三期中考試數學被發現做弊,要記爲0分,如何實現?

# ddd[2,1] = 0  # 錯誤,屬於直接加列
ddd.drop(labels=(2,1),axis=1,inplace=True)


ddd.loc['數學',['張三']] = 0

1565615311253

3 李四由於舉報張三做弊立功,期中考試全部科目加100分,如何實現?

ddd['李四']+100

1565615357986

4 後來老師發現有一道題出錯了,爲了安撫學生情緒,給每位學生每一個科目都加10分,如何實現?

ddd.loc[:,'張三':'劉二']+10

1565615363782

做業2

1查看一個股盤

2輸出該股票全部收盤比開盤上漲3%以上的日期。

3輸出該股票全部開盤比前日收盤跌幅超過2%的日期。

4假如我從2010年1月1日開始,每個月第一個交易日買入1手股票,每一年最後一個交易日賣出全部股票,到今天爲止,個人收益如何?

下載tushare 包 : pip3 install tushare

導入數據: 好比 茅臺是 600519

1數據的提取處理
#使用tushare包獲取某股票的歷史行情數據。
import tushare as ts
df = ts.get_k_data(code='600519',start='2000-01-01')# 由於茅臺是從2001年左右開始股   get_k_data(code='',start='')   股票號, 開始日期

df.to_csv('./600519.csv') # 轉成csv存儲到本地

#將date這一列做爲源數據的行索引且將數據類型轉成時間類型
df = pd.read_csv('./600519.csv',index_col='date',parse_dates=['date']) 
    #當作第一題,二題時,直接提取index即獲得答案 , 還由於日期是唯一的也能夠作索引
df.drop(labels='Unnamed: 0',axis=1,inplace=True) # 刪除多餘的索引列
df # 查看數據是否插入 4000多條
1565614828260
2輸出該股票全部收盤比開盤上漲3%以上的日期。
僞代碼: (收盤-開盤)/開盤 > 3% 

(df['close']-df['open'])/df['open'] > 0.03 

#將上述表達式返回的布爾值做爲df的行索引:取出了全部符合需求的行數據
df.loc[(df['close']-df['open'])/df['open'] > 0.03]# 若是是正確的的,則loc會採納獲得全部的

加上index就獲得了日期   .index

1565614886410

以解析成時間格式的日期爲index的數據

1565615009654

獲得的日期格式

3輸出該股票全部開盤比前日收盤跌幅超過2%的日期。
僞代碼: (開盤-前日收盤)/前日收盤 < -2% 
用到的知識點
某一列.shift(1)  #選中的數據往下面移動1格  就能夠對修改後的同行的數據操做open和close了   

(df['open'] - df['close'].shift(1) / df['close'].shift(1) < -0.02)

df.loc[(df['open'] - df['close'].shift(1) / df['close'].shift(1) < -0.02)].index

1565615079291

4 賺了多少

假如我從2010年1月1日開始,每個月第一個交易日買入1手股票,每一年最後一個交易日賣出全部股票,到今天爲止,個人收益如何?

從2010年開始 1月1日(只能表示年! 月日怎麼表示?)# df['2010-09-10':'2019-09-10']? 
df['2010':'2019']

1565615094874

不必定從1月04開始的

# 數據的從新取樣
df_monthly = df.resample('M').frist() # 每個月第一個交易日買入1手股票 此爲1股要*100
df_yearly = df.resample('A').last()[:-1] # 每一年最後一個交易日賣出, 最後一年還沒過完,無法收盤  因此[:-1]
recv_money = df_monthly['open'].sum()*100 # 求和乘100   #去開盤數據求和
send_money = df_yearly['close'].sum()*1200 # 取收盤數據1年的12個月, 
再加上  df['close'][-1]*800 #最後一個月,不是12月了,是8月的 並且只能df['close'] 取值
相減即得股票盈利

1565615172776

1565615181039

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息