1. 程式人生 > >基於同城同校的推薦--(1)

基於同城同校的推薦--(1)

 

import mysql.connector

conn=mysql.connector.connect(host='',user='',password='',port='',database='')
#遠端連線
cursor=conn.cursor() 
cursor.execute('select * from table')
#執行sql語句操作
t=cursor.fetchall()
#返回讀取的所有行
df=pd.DataFrame(t,columns=[,])
#轉為dataframe
#填充nan法1
udf.loc[np.isnan(df.C),'C']=-1

#dataframe.astype(int)---資料框修改列型別
df=df.fillna(-1)#---------------填充nan法2

cursor.close()#關閉sql連線

 

data=data.combine_first(df)#df填補data的缺失項

data=pd.merge(data,user_df,on='C')#data與df根據C列,合併,列增多。

https://www.cnblogs.com/bambipai/p/7668811.html

python pd合併資料:

1. pandas.merge和例項方法join實現的是列之間的連線,以DataFrame資料結構為例講解,DataFrame1和DataFrame2必須要在至少一列上內容有重疊,index也好,columns也好,只要是有內容重疊的列即可,指定其中一列或幾列作為連線的鍵,然後按照鍵,索引DataFrame2其他列上的的資料,新增DataFrame1中。通過設定merge引數'on','left_on','right_on'可以指定用來連線的列(即關鍵的重複內容列),也可以將index作為連線鍵,只要傳入left_index=True或right_index=True(或兩個都傳)來說明索引被用作連線鍵。

2. 例項方法join預設通過index來進行連線。

join方法也可以通過列來連線,同樣設定引數‘on’即可。

3. 上面介紹的函式實現的均是列之間的連線,要實現行之間的連線,要使用pd.concat方法。

concat預設在axis=0上工作(沿著負y軸的方向),當設定axis=1時(沿著x軸的方向),它同時也可以實現列之間的連線,產生一個DataFrame。

4. 最後一個例項方法combine_first,它在為資料“打補丁”:用引數物件中的資料為呼叫者物件的缺失資料“打補丁”。

簡單總結來說,通過merge和join合併的資料後資料的列變多,通過concat合併後的資料行列都可以變多(axis=1),而combine_first可以用一個數據填充另一個數據的缺失資料。

recommend_list.py----建立海外使用者的資料框,建立所有有性別有地址資訊的使用者的對列

from sql import city_df #跨模組直接使用sql.py中的變數,但是可能會造成重名。

user=df[(df['C1']>3)|(df['C2']>1)|(df['3']>2)]#多條件篩選

abroad_user=df[(df==-1).astype(int).sum(axis=1)<7]#篩選出df中存在項為-1的,且-1個數小於7個的行(按行進行)

df=df[~(df.C.isin(abroad_user))]#df減去df中列C存在於abroad_user中的行

#按行遍歷df
for index_x in df.index:
    if df.loc[index_x,'C']!=-1: 
        i=df[df['C']==data.loc[index_x,'C']].index#返回符合條件記錄的index
        df.loc[index_x,pro]=df.loc[i,'C_P'].values#返回此項的值,並賦值給其他df中的一項

#df中某一項的值必須用df[i,'C'].values顯示


columns_key=('c','a')#dict的key必須是tuple(不可變),不能是list
c_values=(8,2)
columns={columns_key:columns_values}#建立dict
for k,v in columns.items():#遍歷dict:dict.keys()或者dict.values()或者dict.items()
   for i in range(7):
       if user.values[0][v[i]]!=-1:#某一行user的列值.values[0],具體第幾個值[num]
             a=user.values[0][v[i]]
             r=list(r[r[k[i]]==a].C.values)#r[k[i]]--根據列名查詢
             for rec in r:
                 r.append(rec)#將查詢的值append進list

           
    list_1=[]#list去重,並保留順序
    for i in r:
        if i not in list_1:
            list_1.append(i)
    #去重,不保留順序:
        #list(set(list_1))
        #或者
        #import itertools
        #list_1.sort()
        #it = itertools.groupby(list_1)
        #for k, g in it:
        #print k

#dict追加鍵值對dict.setdefault(key,value)
dict={}
dict.setdefault(key,values)

main.py--輸入d,輸出推薦列表

from collections import deque#雙頭對列
import random#隨機


class User(object):#定義calss
    def __init__(self,id):
       self.id=id      
       if self.id in dict.keys():#建立對列deque(list)
           que=deque(dict.get(self.id))#dict中,根據key值返回對應values值   
           #對列長度len(deque)
           que.extend(r[c])#在佇列尾追加對列
           random.sample(list,count)#在一個可迭代物件型別中中隨機選擇count個不重複的值


#class的__call__(self)方法,將方法變為屬性,可以直接呼叫例項,就能執行方法。                               
    def __call__(self):
        que.popleft()#從佇列左側彈出
        que.insert(index,object)
           
if __name__=='__main__':
    id=input()   #input輸入為str     
    user=User(int(id))      
    user() #呼叫call