edsl 0.1.37.dev5__py3-none-any.whl → 0.1.37.dev6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- edsl/Base.py +303 -303
- edsl/BaseDiff.py +260 -260
- edsl/TemplateLoader.py +24 -24
- edsl/__init__.py +48 -48
- edsl/__version__.py +1 -1
- edsl/agents/Agent.py +855 -855
- edsl/agents/AgentList.py +350 -350
- edsl/agents/Invigilator.py +222 -222
- edsl/agents/InvigilatorBase.py +284 -284
- edsl/agents/PromptConstructor.py +353 -353
- edsl/agents/__init__.py +3 -3
- edsl/agents/descriptors.py +99 -99
- edsl/agents/prompt_helpers.py +129 -129
- edsl/auto/AutoStudy.py +117 -117
- edsl/auto/StageBase.py +230 -230
- edsl/auto/StageGenerateSurvey.py +178 -178
- edsl/auto/StageLabelQuestions.py +125 -125
- edsl/auto/StagePersona.py +61 -61
- edsl/auto/StagePersonaDimensionValueRanges.py +88 -88
- edsl/auto/StagePersonaDimensionValues.py +74 -74
- edsl/auto/StagePersonaDimensions.py +69 -69
- edsl/auto/StageQuestions.py +73 -73
- edsl/auto/SurveyCreatorPipeline.py +21 -21
- edsl/auto/utilities.py +224 -224
- edsl/base/Base.py +289 -289
- edsl/config.py +149 -149
- edsl/conjure/AgentConstructionMixin.py +160 -160
- edsl/conjure/Conjure.py +62 -62
- edsl/conjure/InputData.py +659 -659
- edsl/conjure/InputDataCSV.py +48 -48
- edsl/conjure/InputDataMixinQuestionStats.py +182 -182
- edsl/conjure/InputDataPyRead.py +91 -91
- edsl/conjure/InputDataSPSS.py +8 -8
- edsl/conjure/InputDataStata.py +8 -8
- edsl/conjure/QuestionOptionMixin.py +76 -76
- edsl/conjure/QuestionTypeMixin.py +23 -23
- edsl/conjure/RawQuestion.py +65 -65
- edsl/conjure/SurveyResponses.py +7 -7
- edsl/conjure/__init__.py +9 -9
- edsl/conjure/naming_utilities.py +263 -263
- edsl/conjure/utilities.py +201 -201
- edsl/conversation/Conversation.py +290 -290
- edsl/conversation/car_buying.py +58 -58
- edsl/conversation/chips.py +95 -95
- edsl/conversation/mug_negotiation.py +81 -81
- edsl/conversation/next_speaker_utilities.py +93 -93
- edsl/coop/PriceFetcher.py +54 -54
- edsl/coop/__init__.py +2 -2
- edsl/coop/coop.py +958 -958
- edsl/coop/utils.py +131 -131
- edsl/data/Cache.py +527 -527
- edsl/data/CacheEntry.py +228 -228
- edsl/data/CacheHandler.py +149 -149
- edsl/data/RemoteCacheSync.py +97 -97
- edsl/data/SQLiteDict.py +292 -292
- edsl/data/__init__.py +4 -4
- edsl/data/orm.py +10 -10
- edsl/data_transfer_models.py +73 -73
- edsl/enums.py +173 -173
- edsl/exceptions/BaseException.py +21 -21
- edsl/exceptions/__init__.py +54 -54
- edsl/exceptions/agents.py +38 -38
- edsl/exceptions/configuration.py +16 -16
- edsl/exceptions/coop.py +10 -10
- edsl/exceptions/data.py +14 -14
- edsl/exceptions/general.py +34 -34
- edsl/exceptions/jobs.py +33 -33
- edsl/exceptions/language_models.py +63 -63
- edsl/exceptions/prompts.py +15 -15
- edsl/exceptions/questions.py +91 -91
- edsl/exceptions/results.py +29 -29
- edsl/exceptions/scenarios.py +22 -22
- edsl/exceptions/surveys.py +37 -37
- edsl/inference_services/AnthropicService.py +87 -87
- edsl/inference_services/AwsBedrock.py +120 -120
- edsl/inference_services/AzureAI.py +217 -217
- edsl/inference_services/DeepInfraService.py +18 -18
- edsl/inference_services/GoogleService.py +156 -156
- edsl/inference_services/GroqService.py +20 -20
- edsl/inference_services/InferenceServiceABC.py +147 -147
- edsl/inference_services/InferenceServicesCollection.py +97 -97
- edsl/inference_services/MistralAIService.py +123 -123
- edsl/inference_services/OllamaService.py +18 -18
- edsl/inference_services/OpenAIService.py +224 -224
- edsl/inference_services/TestService.py +89 -89
- edsl/inference_services/TogetherAIService.py +170 -170
- edsl/inference_services/models_available_cache.py +118 -118
- edsl/inference_services/rate_limits_cache.py +25 -25
- edsl/inference_services/registry.py +39 -39
- edsl/inference_services/write_available.py +10 -10
- edsl/jobs/Answers.py +56 -56
- edsl/jobs/Jobs.py +1347 -1347
- edsl/jobs/__init__.py +1 -1
- edsl/jobs/buckets/BucketCollection.py +63 -63
- edsl/jobs/buckets/ModelBuckets.py +65 -65
- edsl/jobs/buckets/TokenBucket.py +248 -248
- edsl/jobs/interviews/Interview.py +661 -661
- edsl/jobs/interviews/InterviewExceptionCollection.py +99 -99
- edsl/jobs/interviews/InterviewExceptionEntry.py +186 -186
- edsl/jobs/interviews/InterviewStatistic.py +63 -63
- edsl/jobs/interviews/InterviewStatisticsCollection.py +25 -25
- edsl/jobs/interviews/InterviewStatusDictionary.py +78 -78
- edsl/jobs/interviews/InterviewStatusLog.py +92 -92
- edsl/jobs/interviews/ReportErrors.py +66 -66
- edsl/jobs/interviews/interview_status_enum.py +9 -9
- edsl/jobs/runners/JobsRunnerAsyncio.py +338 -338
- edsl/jobs/runners/JobsRunnerStatus.py +332 -332
- edsl/jobs/tasks/QuestionTaskCreator.py +242 -242
- edsl/jobs/tasks/TaskCreators.py +64 -64
- edsl/jobs/tasks/TaskHistory.py +442 -442
- edsl/jobs/tasks/TaskStatusLog.py +23 -23
- edsl/jobs/tasks/task_status_enum.py +163 -163
- edsl/jobs/tokens/InterviewTokenUsage.py +27 -27
- edsl/jobs/tokens/TokenUsage.py +34 -34
- edsl/language_models/KeyLookup.py +30 -30
- edsl/language_models/LanguageModel.py +706 -706
- edsl/language_models/ModelList.py +102 -102
- edsl/language_models/RegisterLanguageModelsMeta.py +184 -184
- edsl/language_models/__init__.py +3 -3
- edsl/language_models/fake_openai_call.py +15 -15
- edsl/language_models/fake_openai_service.py +61 -61
- edsl/language_models/registry.py +137 -137
- edsl/language_models/repair.py +156 -156
- edsl/language_models/unused/ReplicateBase.py +83 -83
- edsl/language_models/utilities.py +64 -64
- edsl/notebooks/Notebook.py +259 -259
- edsl/notebooks/__init__.py +1 -1
- edsl/prompts/Prompt.py +357 -357
- edsl/prompts/__init__.py +2 -2
- edsl/questions/AnswerValidatorMixin.py +289 -289
- edsl/questions/QuestionBase.py +656 -656
- edsl/questions/QuestionBaseGenMixin.py +161 -161
- edsl/questions/QuestionBasePromptsMixin.py +234 -234
- edsl/questions/QuestionBudget.py +227 -227
- edsl/questions/QuestionCheckBox.py +359 -359
- edsl/questions/QuestionExtract.py +183 -183
- edsl/questions/QuestionFreeText.py +114 -114
- edsl/questions/QuestionFunctional.py +159 -159
- edsl/questions/QuestionList.py +231 -231
- edsl/questions/QuestionMultipleChoice.py +286 -286
- edsl/questions/QuestionNumerical.py +153 -153
- edsl/questions/QuestionRank.py +324 -324
- edsl/questions/Quick.py +41 -41
- edsl/questions/RegisterQuestionsMeta.py +71 -71
- edsl/questions/ResponseValidatorABC.py +174 -174
- edsl/questions/SimpleAskMixin.py +73 -73
- edsl/questions/__init__.py +26 -26
- edsl/questions/compose_questions.py +98 -98
- edsl/questions/decorators.py +21 -21
- edsl/questions/derived/QuestionLikertFive.py +76 -76
- edsl/questions/derived/QuestionLinearScale.py +87 -87
- edsl/questions/derived/QuestionTopK.py +91 -91
- edsl/questions/derived/QuestionYesNo.py +82 -82
- edsl/questions/descriptors.py +413 -413
- edsl/questions/prompt_templates/question_budget.jinja +13 -13
- edsl/questions/prompt_templates/question_checkbox.jinja +32 -32
- edsl/questions/prompt_templates/question_extract.jinja +11 -11
- edsl/questions/prompt_templates/question_free_text.jinja +3 -3
- edsl/questions/prompt_templates/question_linear_scale.jinja +11 -11
- edsl/questions/prompt_templates/question_list.jinja +17 -17
- edsl/questions/prompt_templates/question_multiple_choice.jinja +33 -33
- edsl/questions/prompt_templates/question_numerical.jinja +36 -36
- edsl/questions/question_registry.py +147 -147
- edsl/questions/settings.py +12 -12
- edsl/questions/templates/budget/answering_instructions.jinja +7 -7
- edsl/questions/templates/budget/question_presentation.jinja +7 -7
- edsl/questions/templates/checkbox/answering_instructions.jinja +10 -10
- edsl/questions/templates/checkbox/question_presentation.jinja +22 -22
- edsl/questions/templates/extract/answering_instructions.jinja +7 -7
- edsl/questions/templates/likert_five/answering_instructions.jinja +10 -10
- edsl/questions/templates/likert_five/question_presentation.jinja +11 -11
- edsl/questions/templates/linear_scale/answering_instructions.jinja +5 -5
- edsl/questions/templates/linear_scale/question_presentation.jinja +5 -5
- edsl/questions/templates/list/answering_instructions.jinja +3 -3
- edsl/questions/templates/list/question_presentation.jinja +5 -5
- edsl/questions/templates/multiple_choice/answering_instructions.jinja +9 -9
- edsl/questions/templates/multiple_choice/question_presentation.jinja +11 -11
- edsl/questions/templates/numerical/answering_instructions.jinja +6 -6
- edsl/questions/templates/numerical/question_presentation.jinja +6 -6
- edsl/questions/templates/rank/answering_instructions.jinja +11 -11
- edsl/questions/templates/rank/question_presentation.jinja +15 -15
- edsl/questions/templates/top_k/answering_instructions.jinja +8 -8
- edsl/questions/templates/top_k/question_presentation.jinja +22 -22
- edsl/questions/templates/yes_no/answering_instructions.jinja +6 -6
- edsl/questions/templates/yes_no/question_presentation.jinja +11 -11
- edsl/results/Dataset.py +293 -293
- edsl/results/DatasetExportMixin.py +717 -717
- edsl/results/DatasetTree.py +145 -145
- edsl/results/Result.py +450 -450
- edsl/results/Results.py +1071 -1071
- edsl/results/ResultsDBMixin.py +238 -238
- edsl/results/ResultsExportMixin.py +43 -43
- edsl/results/ResultsFetchMixin.py +33 -33
- edsl/results/ResultsGGMixin.py +121 -121
- edsl/results/ResultsToolsMixin.py +98 -98
- edsl/results/Selector.py +135 -135
- edsl/results/__init__.py +2 -2
- edsl/results/tree_explore.py +115 -115
- edsl/scenarios/FileStore.py +458 -458
- edsl/scenarios/Scenario.py +546 -546
- edsl/scenarios/ScenarioHtmlMixin.py +64 -64
- edsl/scenarios/ScenarioList.py +1112 -1112
- edsl/scenarios/ScenarioListExportMixin.py +52 -52
- edsl/scenarios/ScenarioListPdfMixin.py +261 -261
- edsl/scenarios/__init__.py +4 -4
- edsl/shared.py +1 -1
- edsl/study/ObjectEntry.py +173 -173
- edsl/study/ProofOfWork.py +113 -113
- edsl/study/SnapShot.py +80 -80
- edsl/study/Study.py +528 -528
- edsl/study/__init__.py +4 -4
- edsl/surveys/DAG.py +148 -148
- edsl/surveys/Memory.py +31 -31
- edsl/surveys/MemoryPlan.py +244 -244
- edsl/surveys/Rule.py +330 -330
- edsl/surveys/RuleCollection.py +387 -387
- edsl/surveys/Survey.py +1795 -1795
- edsl/surveys/SurveyCSS.py +261 -261
- edsl/surveys/SurveyExportMixin.py +259 -259
- edsl/surveys/SurveyFlowVisualizationMixin.py +121 -121
- edsl/surveys/SurveyQualtricsImport.py +284 -284
- edsl/surveys/__init__.py +3 -3
- edsl/surveys/base.py +53 -53
- edsl/surveys/descriptors.py +56 -56
- edsl/surveys/instructions/ChangeInstruction.py +47 -47
- edsl/surveys/instructions/Instruction.py +51 -51
- edsl/surveys/instructions/InstructionCollection.py +77 -77
- edsl/templates/error_reporting/base.html +23 -23
- edsl/templates/error_reporting/exceptions_by_model.html +34 -34
- edsl/templates/error_reporting/exceptions_by_question_name.html +16 -16
- edsl/templates/error_reporting/exceptions_by_type.html +16 -16
- edsl/templates/error_reporting/interview_details.html +115 -115
- edsl/templates/error_reporting/interviews.html +9 -9
- edsl/templates/error_reporting/overview.html +4 -4
- edsl/templates/error_reporting/performance_plot.html +1 -1
- edsl/templates/error_reporting/report.css +73 -73
- edsl/templates/error_reporting/report.html +117 -117
- edsl/templates/error_reporting/report.js +25 -25
- edsl/tools/__init__.py +1 -1
- edsl/tools/clusters.py +192 -192
- edsl/tools/embeddings.py +27 -27
- edsl/tools/embeddings_plotting.py +118 -118
- edsl/tools/plotting.py +112 -112
- edsl/tools/summarize.py +18 -18
- edsl/utilities/SystemInfo.py +28 -28
- edsl/utilities/__init__.py +22 -22
- edsl/utilities/ast_utilities.py +25 -25
- edsl/utilities/data/Registry.py +6 -6
- edsl/utilities/data/__init__.py +1 -1
- edsl/utilities/data/scooter_results.json +1 -1
- edsl/utilities/decorators.py +77 -77
- edsl/utilities/gcp_bucket/cloud_storage.py +96 -96
- edsl/utilities/interface.py +627 -627
- edsl/utilities/repair_functions.py +28 -28
- edsl/utilities/restricted_python.py +70 -70
- edsl/utilities/utilities.py +409 -409
- {edsl-0.1.37.dev5.dist-info → edsl-0.1.37.dev6.dist-info}/LICENSE +21 -21
- {edsl-0.1.37.dev5.dist-info → edsl-0.1.37.dev6.dist-info}/METADATA +1 -1
- edsl-0.1.37.dev6.dist-info/RECORD +283 -0
- edsl-0.1.37.dev5.dist-info/RECORD +0 -283
- {edsl-0.1.37.dev5.dist-info → edsl-0.1.37.dev6.dist-info}/WHEEL +0 -0
edsl/conjure/utilities.py
CHANGED
@@ -1,201 +1,201 @@
|
|
1
|
-
import requests
|
2
|
-
import subprocess
|
3
|
-
from io import StringIO
|
4
|
-
import os
|
5
|
-
import pandas as pd
|
6
|
-
|
7
|
-
|
8
|
-
class ValidFilename:
|
9
|
-
"""A descriptor that checks if a file exists.
|
10
|
-
|
11
|
-
|
12
|
-
>>> f = ValidFilename()
|
13
|
-
>>> f = "hello"
|
14
|
-
"""
|
15
|
-
|
16
|
-
def __set_name__(self, owner, name):
|
17
|
-
self.name = name
|
18
|
-
|
19
|
-
def __get__(self, instance, owner):
|
20
|
-
return instance.__dict__.get(self.name, None)
|
21
|
-
|
22
|
-
def __set__(self, instance, value):
|
23
|
-
if not isinstance(value, str):
|
24
|
-
raise ValueError(
|
25
|
-
f"The filename must be a string, not {type(value).__name__}"
|
26
|
-
)
|
27
|
-
|
28
|
-
if not os.path.exists(value):
|
29
|
-
raise ValueError(f"The file '{value}' does not exist.")
|
30
|
-
|
31
|
-
instance.__dict__[self.name] = value
|
32
|
-
|
33
|
-
|
34
|
-
class DummyClassToTestDescriptor:
|
35
|
-
"""
|
36
|
-
|
37
|
-
>>> d = DummyClassToTestDescriptor(1)
|
38
|
-
Traceback (most recent call last):
|
39
|
-
...
|
40
|
-
ValueError: The filename must be a string, not int
|
41
|
-
|
42
|
-
>>> d = DummyClassToTestDescriptor("hello")
|
43
|
-
Traceback (most recent call last):
|
44
|
-
...
|
45
|
-
ValueError: The file 'hello' does not exist.
|
46
|
-
"""
|
47
|
-
|
48
|
-
filename = ValidFilename()
|
49
|
-
|
50
|
-
def __init__(self, filename):
|
51
|
-
self.filename = filename
|
52
|
-
|
53
|
-
def __repr__(self):
|
54
|
-
return f"DummyClassToTestDescriptor({self.filename})"
|
55
|
-
|
56
|
-
|
57
|
-
class Missing:
|
58
|
-
def __repr__(self):
|
59
|
-
return "Missing()"
|
60
|
-
|
61
|
-
def __str__(self):
|
62
|
-
return "Missing()"
|
63
|
-
|
64
|
-
def value(self):
|
65
|
-
return "missing"
|
66
|
-
|
67
|
-
|
68
|
-
def convert_value(x):
|
69
|
-
"""Takes a string and tries to convert it.
|
70
|
-
|
71
|
-
>>> convert_value('1')
|
72
|
-
1
|
73
|
-
>>> convert_value('1.2')
|
74
|
-
1.2
|
75
|
-
>>> convert_value("how are you?")
|
76
|
-
'how are you?'
|
77
|
-
>>> convert_value("")
|
78
|
-
'missing'
|
79
|
-
|
80
|
-
"""
|
81
|
-
try:
|
82
|
-
float_val = float(x)
|
83
|
-
if float_val.is_integer():
|
84
|
-
return int(float_val)
|
85
|
-
else:
|
86
|
-
return float_val
|
87
|
-
except ValueError:
|
88
|
-
if len(x) == 0:
|
89
|
-
return Missing().value()
|
90
|
-
else:
|
91
|
-
return str(x)
|
92
|
-
|
93
|
-
|
94
|
-
# class RCodeSnippet:
|
95
|
-
# def __init__(self, r_code):
|
96
|
-
# self.r_code = r_code
|
97
|
-
|
98
|
-
# def __call__(self, data_file_name):
|
99
|
-
# return self.run_R_stdin(self.r_code, data_file_name)
|
100
|
-
|
101
|
-
# def __add__(self, other):
|
102
|
-
# return RCodeSnippet(self.r_code + other.r_code)
|
103
|
-
|
104
|
-
# def write_to_file(self, filename) -> None:
|
105
|
-
# """Writes the R code to a file; useful for debugging."""
|
106
|
-
# if filename.endswith(".R") or filename.endswith(".r"):
|
107
|
-
# pass
|
108
|
-
# else:
|
109
|
-
# filename += ".R"
|
110
|
-
|
111
|
-
# with open(filename, "w") as f:
|
112
|
-
# f.write(self.r_code)
|
113
|
-
|
114
|
-
# @staticmethod
|
115
|
-
# def run_R_stdin(r_code, data_file_name, transform_func=lambda x: pd.read_csv(x)):
|
116
|
-
# """Runs an R script and returns the stdout as a string."""
|
117
|
-
# cmd = ["Rscript", "-e", r_code, data_file_name]
|
118
|
-
# process = subprocess.Popen(
|
119
|
-
# cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True
|
120
|
-
# )
|
121
|
-
# stdout, stderr = process.communicate()
|
122
|
-
# if stderr != "":
|
123
|
-
# print("Warning: stderr is not empty.")
|
124
|
-
# print(f"Problem running: {r_code}")
|
125
|
-
# raise Exception(stderr)
|
126
|
-
# return transform_func(StringIO(stdout))
|
127
|
-
|
128
|
-
|
129
|
-
def infer_question_type(question_text, responses, sample_size=15):
|
130
|
-
from edsl.questions import QuestionMultipleChoice
|
131
|
-
|
132
|
-
q = QuestionMultipleChoice(
|
133
|
-
question_text="""We have a survey question and we are trying to infer its type.
|
134
|
-
The question text is: '{{question_text}}'.
|
135
|
-
The first {{ sample_size }} responses are: '{{responses}}'.
|
136
|
-
There are {{ total }} responses in total.
|
137
|
-
If a response is a command-separated list, it is likely a checkbox question.
|
138
|
-
""",
|
139
|
-
question_name="infer_question_type",
|
140
|
-
question_options=[
|
141
|
-
"budget",
|
142
|
-
"checkbox",
|
143
|
-
"extract",
|
144
|
-
"free_text",
|
145
|
-
"likert_five",
|
146
|
-
"linear_scale",
|
147
|
-
"list",
|
148
|
-
"multiple_choice",
|
149
|
-
"numerical",
|
150
|
-
"rank",
|
151
|
-
"top_k",
|
152
|
-
"yes_no",
|
153
|
-
],
|
154
|
-
)
|
155
|
-
response = (
|
156
|
-
q.to_survey()(
|
157
|
-
question_text=question_text,
|
158
|
-
sample_zize=sample_size,
|
159
|
-
responses=responses[:sample_size],
|
160
|
-
)
|
161
|
-
.select("infer_question_type")
|
162
|
-
.first()
|
163
|
-
)
|
164
|
-
return response
|
165
|
-
|
166
|
-
|
167
|
-
def download_file(url, filename):
|
168
|
-
"""
|
169
|
-
Downloads a file from a given URL and saves it to the specified filename.
|
170
|
-
|
171
|
-
Parameters:
|
172
|
-
url (str): The URL of the file to download.
|
173
|
-
filename (str): The name of the file to save the downloaded content.
|
174
|
-
|
175
|
-
Returns:
|
176
|
-
str: The path to the saved file.
|
177
|
-
"""
|
178
|
-
headers = {
|
179
|
-
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
|
180
|
-
}
|
181
|
-
|
182
|
-
# Sending the GET request
|
183
|
-
response = requests.get(url, headers=headers)
|
184
|
-
|
185
|
-
# Checking if the request was successful
|
186
|
-
if response.status_code == 200:
|
187
|
-
# Writing the content to the specified file
|
188
|
-
with open(filename, "wb") as file:
|
189
|
-
file.write(response.content)
|
190
|
-
print(f"File downloaded successfully and saved to {filename}")
|
191
|
-
return filename
|
192
|
-
else:
|
193
|
-
print(f"Failed to download file: {response.status_code}")
|
194
|
-
return None
|
195
|
-
|
196
|
-
|
197
|
-
# Example usage
|
198
|
-
if __name__ == "__main__":
|
199
|
-
import doctest
|
200
|
-
|
201
|
-
doctest.testmod(optionflags=doctest.ELLIPSIS)
|
1
|
+
import requests
|
2
|
+
import subprocess
|
3
|
+
from io import StringIO
|
4
|
+
import os
|
5
|
+
import pandas as pd
|
6
|
+
|
7
|
+
|
8
|
+
class ValidFilename:
|
9
|
+
"""A descriptor that checks if a file exists.
|
10
|
+
|
11
|
+
|
12
|
+
>>> f = ValidFilename()
|
13
|
+
>>> f = "hello"
|
14
|
+
"""
|
15
|
+
|
16
|
+
def __set_name__(self, owner, name):
|
17
|
+
self.name = name
|
18
|
+
|
19
|
+
def __get__(self, instance, owner):
|
20
|
+
return instance.__dict__.get(self.name, None)
|
21
|
+
|
22
|
+
def __set__(self, instance, value):
|
23
|
+
if not isinstance(value, str):
|
24
|
+
raise ValueError(
|
25
|
+
f"The filename must be a string, not {type(value).__name__}"
|
26
|
+
)
|
27
|
+
|
28
|
+
if not os.path.exists(value):
|
29
|
+
raise ValueError(f"The file '{value}' does not exist.")
|
30
|
+
|
31
|
+
instance.__dict__[self.name] = value
|
32
|
+
|
33
|
+
|
34
|
+
class DummyClassToTestDescriptor:
|
35
|
+
"""
|
36
|
+
|
37
|
+
>>> d = DummyClassToTestDescriptor(1)
|
38
|
+
Traceback (most recent call last):
|
39
|
+
...
|
40
|
+
ValueError: The filename must be a string, not int
|
41
|
+
|
42
|
+
>>> d = DummyClassToTestDescriptor("hello")
|
43
|
+
Traceback (most recent call last):
|
44
|
+
...
|
45
|
+
ValueError: The file 'hello' does not exist.
|
46
|
+
"""
|
47
|
+
|
48
|
+
filename = ValidFilename()
|
49
|
+
|
50
|
+
def __init__(self, filename):
|
51
|
+
self.filename = filename
|
52
|
+
|
53
|
+
def __repr__(self):
|
54
|
+
return f"DummyClassToTestDescriptor({self.filename})"
|
55
|
+
|
56
|
+
|
57
|
+
class Missing:
|
58
|
+
def __repr__(self):
|
59
|
+
return "Missing()"
|
60
|
+
|
61
|
+
def __str__(self):
|
62
|
+
return "Missing()"
|
63
|
+
|
64
|
+
def value(self):
|
65
|
+
return "missing"
|
66
|
+
|
67
|
+
|
68
|
+
def convert_value(x):
|
69
|
+
"""Takes a string and tries to convert it.
|
70
|
+
|
71
|
+
>>> convert_value('1')
|
72
|
+
1
|
73
|
+
>>> convert_value('1.2')
|
74
|
+
1.2
|
75
|
+
>>> convert_value("how are you?")
|
76
|
+
'how are you?'
|
77
|
+
>>> convert_value("")
|
78
|
+
'missing'
|
79
|
+
|
80
|
+
"""
|
81
|
+
try:
|
82
|
+
float_val = float(x)
|
83
|
+
if float_val.is_integer():
|
84
|
+
return int(float_val)
|
85
|
+
else:
|
86
|
+
return float_val
|
87
|
+
except ValueError:
|
88
|
+
if len(x) == 0:
|
89
|
+
return Missing().value()
|
90
|
+
else:
|
91
|
+
return str(x)
|
92
|
+
|
93
|
+
|
94
|
+
# class RCodeSnippet:
|
95
|
+
# def __init__(self, r_code):
|
96
|
+
# self.r_code = r_code
|
97
|
+
|
98
|
+
# def __call__(self, data_file_name):
|
99
|
+
# return self.run_R_stdin(self.r_code, data_file_name)
|
100
|
+
|
101
|
+
# def __add__(self, other):
|
102
|
+
# return RCodeSnippet(self.r_code + other.r_code)
|
103
|
+
|
104
|
+
# def write_to_file(self, filename) -> None:
|
105
|
+
# """Writes the R code to a file; useful for debugging."""
|
106
|
+
# if filename.endswith(".R") or filename.endswith(".r"):
|
107
|
+
# pass
|
108
|
+
# else:
|
109
|
+
# filename += ".R"
|
110
|
+
|
111
|
+
# with open(filename, "w") as f:
|
112
|
+
# f.write(self.r_code)
|
113
|
+
|
114
|
+
# @staticmethod
|
115
|
+
# def run_R_stdin(r_code, data_file_name, transform_func=lambda x: pd.read_csv(x)):
|
116
|
+
# """Runs an R script and returns the stdout as a string."""
|
117
|
+
# cmd = ["Rscript", "-e", r_code, data_file_name]
|
118
|
+
# process = subprocess.Popen(
|
119
|
+
# cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True
|
120
|
+
# )
|
121
|
+
# stdout, stderr = process.communicate()
|
122
|
+
# if stderr != "":
|
123
|
+
# print("Warning: stderr is not empty.")
|
124
|
+
# print(f"Problem running: {r_code}")
|
125
|
+
# raise Exception(stderr)
|
126
|
+
# return transform_func(StringIO(stdout))
|
127
|
+
|
128
|
+
|
129
|
+
def infer_question_type(question_text, responses, sample_size=15):
|
130
|
+
from edsl.questions import QuestionMultipleChoice
|
131
|
+
|
132
|
+
q = QuestionMultipleChoice(
|
133
|
+
question_text="""We have a survey question and we are trying to infer its type.
|
134
|
+
The question text is: '{{question_text}}'.
|
135
|
+
The first {{ sample_size }} responses are: '{{responses}}'.
|
136
|
+
There are {{ total }} responses in total.
|
137
|
+
If a response is a command-separated list, it is likely a checkbox question.
|
138
|
+
""",
|
139
|
+
question_name="infer_question_type",
|
140
|
+
question_options=[
|
141
|
+
"budget",
|
142
|
+
"checkbox",
|
143
|
+
"extract",
|
144
|
+
"free_text",
|
145
|
+
"likert_five",
|
146
|
+
"linear_scale",
|
147
|
+
"list",
|
148
|
+
"multiple_choice",
|
149
|
+
"numerical",
|
150
|
+
"rank",
|
151
|
+
"top_k",
|
152
|
+
"yes_no",
|
153
|
+
],
|
154
|
+
)
|
155
|
+
response = (
|
156
|
+
q.to_survey()(
|
157
|
+
question_text=question_text,
|
158
|
+
sample_zize=sample_size,
|
159
|
+
responses=responses[:sample_size],
|
160
|
+
)
|
161
|
+
.select("infer_question_type")
|
162
|
+
.first()
|
163
|
+
)
|
164
|
+
return response
|
165
|
+
|
166
|
+
|
167
|
+
def download_file(url, filename):
|
168
|
+
"""
|
169
|
+
Downloads a file from a given URL and saves it to the specified filename.
|
170
|
+
|
171
|
+
Parameters:
|
172
|
+
url (str): The URL of the file to download.
|
173
|
+
filename (str): The name of the file to save the downloaded content.
|
174
|
+
|
175
|
+
Returns:
|
176
|
+
str: The path to the saved file.
|
177
|
+
"""
|
178
|
+
headers = {
|
179
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
|
180
|
+
}
|
181
|
+
|
182
|
+
# Sending the GET request
|
183
|
+
response = requests.get(url, headers=headers)
|
184
|
+
|
185
|
+
# Checking if the request was successful
|
186
|
+
if response.status_code == 200:
|
187
|
+
# Writing the content to the specified file
|
188
|
+
with open(filename, "wb") as file:
|
189
|
+
file.write(response.content)
|
190
|
+
print(f"File downloaded successfully and saved to {filename}")
|
191
|
+
return filename
|
192
|
+
else:
|
193
|
+
print(f"Failed to download file: {response.status_code}")
|
194
|
+
return None
|
195
|
+
|
196
|
+
|
197
|
+
# Example usage
|
198
|
+
if __name__ == "__main__":
|
199
|
+
import doctest
|
200
|
+
|
201
|
+
doctest.testmod(optionflags=doctest.ELLIPSIS)
|