#有許多數據結構,比python多python
導入pandas:數組
import pandas as pd
from pandas import DataFrame,Series
import numpy as np數據結構
Series是一種相似與一維數組的對象,由下面兩個部分組成:dom
默認索引爲0到N-1的整數型索引
Series(data=[1,2,3])函數
自帶隱形索引設計
能夠經過設置index參數指定索引code
s = Series(data=[1,2,3],index=['a','b','c'])對象
Series(data=np.random.randint(0,100,size=(3,)))索引
由numpy數組建立ip
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
pd.isnull(),
pd.notnull(),
s.isnull(),
notnull()
s[[True,True,False,False,True]] #若是將布爾值做爲Serrise的索引,則只保留True對應的元素值 # 根據這一屬性 後面提取符合條件的值 當有判斷時, 做業裏用到
s[s.notnull()]
DataFrame是一個【表格型】的數據結構。DataFrame由按必定順序排列的多列數據組成。設計初衷是將Series的使用場景從一維拓展到多維。DataFrame既有行索引,也有列索引。
最經常使用的方法是傳遞一個字典來建立。DataFrame以字典的鍵做爲每一【列】的名稱,以字典的值(一個數組)做爲每一列。
此外,DataFrame會自動加上每一行的索引。
使用字典建立的DataFrame後,則columns參數將不可被使用。
同Series同樣,若傳入的列與字典的鍵不匹配,則相應的值爲NaN。
DataFrame(data=np.random.randint(60,100,size=(3,4)))
多維的
df = DataFrame(data=np.random.randint(60,100,size=(3,4)),index=['A','B','C'],columns=['a','b','c','d'])
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)
dic = {
'張三':[150,150,150,150],
'李四':[0,0,0,0]
}
df = DataFrame(data=dic,index=['語文','數學','英語','理綜'])
df
- 經過相似字典的方式 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
size(3,4) 必須和index 行 columns 列對應
df[['a','c']]
df.columns = ['a','c','b','d']
df
- 使用.loc[]加index來進行行索引 - 使用.iloc[]加整數來進行行索引
一樣返回一個Series,index爲原來的columns。
對第一行的索引:
df.iloc[0]
df.loc['A']
對第一二行的索引:
df.loc[['A','B']]
- 使用列索引 - 使用行索引(iloc[3,1] or loc['C','q']) 行索引在前,列索引在後
df.iloc[1,2] # 第二行第三列
df.loc[['B','C'],'b'] # 第B到C行,第b列
【注意】 直接用中括號時:
df[0:2] 行
df.iloc[:,0:2] 列
在loc和iloc中使用切片(切列) : df.loc['B':'C','丙':'丁']
DataFrame之間的運算
同Series同樣:
索引默認是列,因此用行的話,除了索引取值,ddd['語文':'語文'] 用 loc['語文']
切片默認是行 因此用列的話,除了取一列ddd['李四'],取多列,用loc[:,'張三':'李四']
作題
ddd.loc[:,'張三':'劉二']+10
案例分析
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 假設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()
2 假設張三期中考試數學被發現做弊,要記爲0分,如何實現?
# ddd[2,1] = 0 # 錯誤,屬於直接加列 ddd.drop(labels=(2,1),axis=1,inplace=True) ddd.loc['數學',['張三']] = 0
3 李四由於舉報張三做弊立功,期中考試全部科目加100分,如何實現?
ddd['李四']+100
4 後來老師發現有一道題出錯了,爲了安撫學生情緒,給每位學生每一個科目都加10分,如何實現?
ddd.loc[:,'張三':'劉二']+10
1查看一個股盤
2輸出該股票全部收盤比開盤上漲3%以上的日期。
3輸出該股票全部開盤比前日收盤跌幅超過2%的日期。
4假如我從2010年1月1日開始,每個月第一個交易日買入1手股票,每一年最後一個交易日賣出全部股票,到今天爲止,個人收益如何?
下載tushare 包 : pip3 install tushare
導入數據: 好比 茅臺是 600519
#使用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多條
僞代碼: (收盤-開盤)/開盤 > 3% (df['close']-df['open'])/df['open'] > 0.03 #將上述表達式返回的布爾值做爲df的行索引:取出了全部符合需求的行數據 df.loc[(df['close']-df['open'])/df['open'] > 0.03]# 若是是正確的的,則loc會採納獲得全部的 加上index就獲得了日期 .index
以解析成時間格式的日期爲index的數據
獲得的日期格式
僞代碼: (開盤-前日收盤)/前日收盤 < -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
假如我從2010年1月1日開始,每個月第一個交易日買入1手股票,每一年最後一個交易日賣出全部股票,到今天爲止,個人收益如何?
從2010年開始 1月1日(只能表示年! 月日怎麼表示?)# df['2010-09-10':'2019-09-10']? df['2010':'2019']
不必定從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'] 取值 相減即得股票盈利