رسم الخرائط لـ PSYCOPG2 إلى DataFrame لـ R مع RPY2
سؤال
مع PsyCopg2 ، أحصل على نتيجة الاستعلام في هذا النموذج:
(15002325 ، 24 ، 20 ، 1393 ، -67333094l ، 38 ، 4 ، 493.48763257822799 ، 493.63348372593703) ، (15002339 ، 76 ، 20 ، 1393 ، -673333333319931990 ، 499.999 ، 499.999 ، 499.9999 ، 4999 ، 4999 ، 1394 ، -67333094l ، 38 ، 4 ، 493.493464900383 ، 493.63348372593703) ، (15002483 ، 76 ، 20 ، 1394 ، -67333094L ، 91 ، 3 ، 499.9590424434 ، 499.9730430430430430430430430430430430430430430430430430430430430430
أحاول تحويل هذا tuple/list المتداخلة إلى r dataframe مع rpy2: مع تسعة عمود مع الاسم ، وأربعة صفات من البيانات (عدد العناصر في هذه القائمة المتداخلة))
لكنني لا أفهم كيف ، أحاول مع TaggedList (في مكتبة حاوية RPY2) ولكن بدون نجاح .. يبدو أن القائمة الموسومة تأخذ قائمة واحدة بقائمة واحدة فقط.
شكرا للمساعدة!
المحلول
import rpy2.robjects as ro
r=ro.r
data=[(15002325, 24, 20, 1393, -67333094L, 38, 4, 493.48763257822799, 493.63348372593703), (15002339, 76, 20, 1393, -67333094L, 91, 3, 499.95845909922201, 499.970048093743), (15002431, 24, 20, 1394, -67333094L, 38, 4, 493.493464900383, 493.63348372593703), (15002483, 76, 20, 1394, -67333094L, 91, 3, 499.959042442434, 499.97304310494502)]
columns=zip(*data)
columns=[ro.FloatVector(col) for col in columns]
names=['col{i}'.format(i=i) for i in range(9)]
dataf = r['data.frame'](**dict(zip(names,columns)))
print(dataf)
# col8 col6 col7 col4 col5 col2 col3 col0 col1
# 1 493.6335 4 493.4876 -67333094 38 20 1393 15002325 24
# 2 499.9700 3 499.9585 -67333094 91 20 1393 15002339 76
# 3 493.6335 4 493.4935 -67333094 38 20 1394 15002431 24
# 4 499.9730 3 499.9590 -67333094 91 20 1394 15002483 76
لاحظ أن هناك R واجهة لـ PostgreSQL, ، وهذا قد يوفر طريقة أنظف من المرور عبر بيثون و RPY2.
إذا كنت بحاجة إلى Python ، فإن الاحتمال الآخر هو معرفة أوامر R اللازمة لتحميل البيانات من PostgreSQL ، ثم اتصل بها في Python باستخدام ro.r
.